среда, 25 мая 2016 г.

Делаем backup больших массивов файлов

Исходные данные: 
Xubuntu 14.04 server (64 разряда) в качестве SAMBA-сервера с большой ФС и огромным количеством файлов.

  Нужно объяснить подробнее. Есть сервер не самой высокой производительности, он когда-то сам должен был стать архивом, но звезды на небе расположились таким образом, что на него была взгромождена САМБА (+squid, apache, и много чего еще), в общем это наше все, кроме LTSP. Все - все - все живет на массиве размером 5,1Т, система отдельно. Занято существенно более половины, вернее сказать осталось там меньше терабайта. Вот его надо сбэкапить по сетке, держать несколько актуальных копий в удобноваримом виде и прочее, прочее, прочее. В качестве архива вообще не Бог весть что - 2 Гигабайта памяти, массив около 4Т, остальное под стать, - собрано все из хлама. Копировать нужно /home/storage/samba/public, /home/storage/samba/private, /home за вычетом /home/storage Всего примерно 1,5Т. В идеале хранить 30 ежедневных копий всего. По-тупому точно не получится 1,5Т*30дней=45Т... Не наш уровень затрат.

Про удобноваримость.

 Вот что важно оказалось (для больших объемов и больших количеств файлов) - хранение при помощи какой-то базы (bacula) не очень подходит. Обычно приходится искать файл по каким-то не вполне точным признакам (тыкать мышкой или mc-шкой). То же касается и архивов типа tar - его и положить-то некуда, не дай бог физ. сбой (прощай кусок после сбоя, как на ленте), ну и поиск нужного "чего-то типа как вот тут" - мука адская. Должно быть файловое дерево, по которому можно "лазить" стандартными средствами. 

Про транспорт.

 Рутовый доступ к источнику по ssh не самое приятное, хочется чтоб по чтению, и чтоб не nfs... В общем rsync в виде rsyncd вполне себе безопасен, абсолютный чемпион по скорости и много чего еще (например не оставляет оторвавшихся и повисших процессов на сервере). Есть классическая статья Майка Рубеля, дающая "правильное представление". И еще один ресурс навел на мысли... Не описываю сам принцип, слов там много, не нужно переписывать... Но решил все-таки пару слов написать. Идея в том, что правильно используя хардлинки можно хранить огромное количество копий очень больших массивов (поскольку основная масса файлов меняется редко, они прилинковываются к новым каталогам, в случае стирания теряют линки и освобождают место для новых...).

Карты в руки

 На сервере - источнике заводим карты (они же модули) для сохраняемых ресурсов. Вот кусочек /etc/rsyncd.conf (некоторые цифры пришлось поменять)
# /etc/rsyncd.conf

# GLOBALs
address = 10.0.0.3

[samba-public]
path = /home/storage/samba/public
comment = Samba common
read only = true
hosts allow = 10.0.0.2
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso

[rootfs]
path = /
comment = root and LTSP sandbox
uid = root
read only = true
hosts allow = 10.0.0.1 10.0.0.2
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso

[homefs]
path = /home
comment = home (not storage)
uid = root
read only = true
hosts allow = 10.0.0.2 10.0.0.1
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso
exclude "storage/***"

[samba-private]
path = /home/storage/samba/private
comment = Samba common
uid = root
read only = true
hosts allow = 10.0.0.2
hosts deny = 0.0.0.0/0
ignore nonreadable
dont compress = *.gz *.tgz *.tar.gz *.zip *.7z *.rar *.deb *.bz2 *.iso


В приведенном фрагменте нет ничего необычного, интересен разве что пример исключения /home/storage, но это есть в man-е... и работает не слишком хорошо, лучше -F и .rsync-filter в нужные каталоги.

Ну и собственно скрипт


#! /bin/bash

### Определения по-умолчанию
MAP='root@10.0.0.3::samba-private/'
DEST='/storage/increment/samba-priv'
LOGF=/var/log/rsync-samba-priv.log
OLD=+10

### в $1 передаем имя конфиг-файла
test -r ${1} && . ${1}

### Начали
DAY0=`date -I`
DAY1=`date -I -d "1 day ago"`
DAY2=`date -I -d "2 day ago"`
LNK=$DEST/$DAY1
rm -f $LOGF
# Ищем вчерашнюю копию, если нет - позавчерашнюю, если ее нет - стоп!
if [ ! -d $LNK ] ; then
 LNK=$DEST/$DAY2
  if [ ! -d $LNK ] ; then
   echo "LNK not exist..." |logger
   exit 0
  fi
fi
### Собственно копируем
rsync --log-file=$LOGF -aHxA --del  --link-dest=$LNK  $MAP $DEST/$DAY0
### Стираем старые копии
find $DEST -ctime $OLD -delete
    
В конце мы просто удаляем старые копии по-крестьянски. Исходный (самый первый) бэкап делаем ручками. Если лениво, достаточно создать пустой каталог со вчерашней или позавчерашней датой.

И один конфиг

 В качестве примера (/usr/local/etc/bcp/samba-pub).

MAP='root@10.0.0.3::samba-public/'
DEST='/storage/increment/samba-pub'
LOGF=/var/log/rsync-samba-pub.log
OLD=+10
    

Хранение настроено на 10 дней, будем посмотреть... В кроне (/usr/cron.d/local) все выглядит примерно так

15 20 * * *     root  /usr/local/bin/rsync.increment /usr/local/etc/bcp/samba-priv.conf >/dev/null 2>&1
05 21 * * *     root  /usr/local/bin/rsync.increment /usr/local/etc/bcp/samba-pub.conf >/dev/null 2>&1

    

Чего еще хочется (ToDo)

 В скрипте проверяется "вчера" и "позавчера". Хочется "последний раз". С ходу не придумалось. Надеюсь что будет обновление. Прошла ночь. Есть еще пара новых хотелок. Во-первых, нужно сделать старт в случае отсутствия исходного бэкапа (самый первый запуск). Во-вторых нужно не удалять копии по времени жизни, а следить за их количеством и поддерживать заданное (количество), это будет правильно. И правильно будет, в условиях дифицита места, сначала стирать старую копию, а потом уже записывать новую.

Закономерное продолжение, реализующее пожелания...









Комментариев нет:

Отправить комментарий