Исходные данные:
Xubuntu 14.04 server (64 разряда) в качестве SAMBA-сервера с большой ФС и огромным количеством файлов.
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)
В скрипте проверяется "вчера" и "позавчера". Хочется "последний раз". С ходу не придумалось. Надеюсь что будет обновление. Прошла ночь. Есть еще пара новых хотелок. Во-первых, нужно сделать старт в случае отсутствия исходного бэкапа (самый первый запуск). Во-вторых нужно не удалять копии по времени жизни, а следить за их количеством и поддерживать заданное (количество), это будет правильно. И правильно будет, в условиях дифицита места, сначала стирать старую копию, а потом уже записывать новую.
Закономерное продолжение, реализующее пожелания...
Комментариев нет:
Отправить комментарий