Сервер архива должен содержать данные разработчиков за значительный срок с возможностью самостоятельного извлечения файлов по состоянию на произвольный день в прошлом. Данные разработчиков хранятся на файловых серверах с доступом по NFS. Общий объём — 50 ТБ (более 100 миллионов файлов), ежедневные изменения — до 2ТБ.

  • установка CentOS 7.1 (первая версия работает на CentOS 6.4 — при попытке перехода на CentOS 6.5 возникла проблема)

сборка 2 массивов RAID6 по 18 дисков с помощью LSI Logic MegaRAID SAS 9266-8i с CacheVault (контроллер не умеет делать массив из 36 дисков)# обновить прошивку контроллера и CV/opt/MegaRAID/storcli/storcli64 /c0 download file=/tmp/mr2208fw.rom/opt/MegaRAID/storcli/storcli64 /c0 download file=/tmp/TFM_70-25849-04.rom fwtype=2# параметры контроллера/opt/MegaRAID/storcli/storcli64 /c0 set coercion=0/opt/MegaRAID/storcli/storcli64 /c0 set patrolread=off/opt/MegaRAID/storcli/storcli64 /c0 set perfmode=1# настройка smartd для извещения о проблемах с диском и zabbix о проблемах с массивами/opt/MegaRAID/storcli/storcli64 /c0 add vd type=raid6 size=all name=first drives=8:0-17 pdcache=off wb nora direct Strip=64/opt/MegaRAID/storcli/storcli64 /c0 add vd type=raid6 size=all name=second drives=8:18-23,9:0-11 pdcache=off wb nora direct Strip=64

сборка логического тома поверх 2 массивовpvcreate /dev/sdcpvcreate /dev/sddvgcreate x134all36 /dev/sdc /dev/sddlvcreate —stripes 2 —stripesize 64K —name full —extents +100%FREE x134all36

  • mkfs.btrfs —data single —metadata single —label time_machine —features ^extref,skinny-metadata /dev/mapper/x134all36-fullmount -o noatime,nodiratime,compress-force=zlib,clear_cache,nospace_cache,enospc_debug /dev/mapper/x134all36-full /time_machinebtrfs subvolume create /time_machine/currentmkdir /time_machine/old/sbin/btrfs subvolume snapshot /time_machine/current /time_machine/old/`date +%Y%m%d` # по cron ежедневно в 23:59/time_machine/current обновляется ежедневно с помощью rsync или непрерывно с помощью lsync

Параллельное копирование с зеркала по rsync (ssh), каждый каталог второго уровня — отдельный поток:обеспечение доступа ssh по ключуmkdir .sshchmod 700 .sshvim .ssh/id_rsa # и сконфигурировать на той стороне /root/.ssh/id_rsa.pubchmod 600 .ssh/id_rsa

настройка ssh-agent в .bash_profileif [ -z «$SSH_CLIENT» -a -z «$SSH_AUTH_SOCK» ]then eval `ssh-agent`# ssh-add ~/.ssh/id_rsa # лучше добавлять вручную только тогда когда надоfi

  • mkdir rsync # каталог для журналов

bin/getdir_snapshot.sh # один каталог второго уровня#!/bin/bash

if [ -z «$1» ]then echo empty exitelseDATE=`echo $1|awk -F/ ‘{print $1}’`DIR=`echo $1|awk -F/ ‘{print $2 «/» $3}’`

rsync -e ssh -vas [—compress —compress-level=1] —whole-file —numeric-ids —ignore-errors —delete зеркало:/time_machine/old/$DATE/$DIR/ /time_machine/current/$DIR/ >> /root/rsync/rsync.$DATE.log 2>&1fi

  • chmod u+x bin/getdir_snapshot.sh

bin/getall_snapshot.sh # все каталоги за день#!/bin/bash

DATE=$1ssh зеркало ls -d /time_machine/old/$DATE/*/*|awk -F/ ‘{print $4 «/» $5 «/» $6}’ | xargs —verbose —max-args=1 —max-procs=40 getdir_snapshot.sh 2>&1 | tee -a /root/rsync/rsync.$DATE.log/sbin/btrfs subvolume snapshot /time_machine/current /time_machine/old/$DATEchmod go+rx /time_machine/old/$DATE

  • chmod u+x bin/getall_snapshot.sh

создание каталогов первого уровня (отдельный каталог на каждый файловый сервер)mkdir /time_machine/current/……

  • запуск (под screen): getall_snapshot.sh первая-датазапуск в цикле копирования изменений

Копирование очередного дня с зеркала по send/receive (вдвое быстрее, данные пересылаются по сети несжатые):btrfs property set /time_machine/old/20140801 ro truebtrfs property set /time_machine/old/20140802 ro truebtrfs send -v -p /time_machine/old/20140801 /time_machine/old/20140802|…

Итоги с 1 августа 2014 по 16 января 2017 + current (rsync в режиме —whole-file, иначе btrfs разваливается очень быстро):

  • первый день — 11.5 TBвсего — 104.4 TBв день — 103 ГБ

Тестирование чтения привычным tarnull_all_common.sh самого старого снимка (20150121) после 2.5 лет эксплуатации архива (с диска читается до 450 МБ/сек, т.е. после декомпрессии ожидается более 1 ГБ/сек; манипуляции с настройкой контроллера и read_ahead_kb не помогают; в начале всплеск в 1.3 GB/s; встроенный readahead насыщает систему хранения?):

  • 1 поток — 23131760623616 bytes (23 TB) copied, 220811 s, 105 MB/s (screen завис)6 потоков — 36682198941696 bytes (37 TB) copied, 269317 s, 136 MB/s12 потоков — 36682198941696 bytes (37 TB) copied, 270545 s, 136 MB/s16 потоков — 23711099912192 bytes (24 TB) copied, 164559 s, 144 MB/s24 потока — 36682198941696 bytes (37 TB) copied, 269458 s, 136 MB/s32 потока — 31144909209600 bytes (31 TB) copied, 220555 s, 141 MB/s

Тестирование чтения привычным tarnull_all_common.sh лизкого к текущему состоянию снимка (20170318) после 2.5 лет эксплуатации архива (с диска читается 350 МБ/сек, т.е. после декомпрессии ожидается более 1 ГБ/сек; манипуляции с настройкой контроллера и read_ahead_kb не помогают):

  • 32 потока — 44740035739648 bytes (45 TB) copied, 360604 s, 124 MB/s (из 50ТБ)