суббота, 28 мая 2016 г.

Делаем backup (бэкап) больших массивов файлов, продолжение

В первой части все-все-все написано, и там же есть список хотелок. Это собственно реализация оных. Список отличий от исходной версии.

  1. Сначала стираем старые файлы, потом пишем новые.
  2. Храним заданное число копий, а не количество дней.
  3. Изменился формат конфиг-файла (исчез "+" у параметра OLD, теперь это просто число)
  4. Нет необходимости вручную создавать исходную копию.
  5. Нет проблем с повторным запуском в течении тех же суток.
  6. Добавлен ключ -F rsync, нужно использовать файлы .rsync-filter

В общем и целом получилась вполне себе боевая вещь.
Собственно скрипт /usr/local/bin/rsync.increment3
#! /bin/bash

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

### в $1 передаем имя конфиг-файла
if [ ! -z ${1} ] ; then
  test -r ${1} && . ${1}
fi

### Стираем старые копии по числу, а не по дате создания (это важно!)
# Стираем только каталоги, файлы типа .notes.txt нам не интересны

icount=0
for i in `ls -dr $DEST/20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]` ; do
 if [ $((icount++)) -ge $((OLD))  ] ; then
  rm -rf "$i"
 fi
done

### Начали
DAY0=`date -I`
DAY1=`date -I -d "1 day ago"`

# Защита от повторного запуска (передвижка крона, например, для тестов удобно опять же)
if [ -d $DEST/$DAY0 ] ; then
 mv -f $DEST/$DAY0 $DEST/$DAY0-previous
fi

# Самый свежий каталог по маске date -I с 2010 по 2099 годы :-)
# Можно было сохранить $i на первом проходе стирания, но проще еще раз
# дернуть ls

LNK=`ls -dr $DEST/20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]|head -n 1`

# Если совсем пусто, создаем вчерашний пустой
if [ -z $LNK ] ; then
 LNK=$DEST/$DAY1
 mkdir -p $LNK
 echo "LNK not exist..." |logger
fi

# Опять про повторный запуск, крутим обратно...
if [ -d $DEST/$DAY0-previous ] ; then
 mv -f $DEST/$DAY0-previous $DEST/$DAY0
 echo "Previous DAY0 exist..." |logger
fi

### Собственно копируем
rm -f $LOGF
rsync --log-file=$LOGF -aHxAF --del  --link-dest=$LNK  $MAP $DEST/$DAY0

   
И конфиг
MAP='root@10.0.0.3::samba-public/'
DEST='/storage/increment/samba-pub'
LOGF=/var/log/rsync-samba-pub.log
OLD=30
    
Все остальное без изменений.

Дополнение от 21 апреля 2020. 

  Для анализа логов совсем простой скриптик. Он посылает на почту лаконично имена лог-файлов, содержащих "rsync error:" Условием работы (из крона) является правильная установка "почтовых" переменных MAILTO и MAILFROM.

#! /bin/bash

FMASK="/var/log/rsync-*.log"

status=""
for i in `ls  $FMASK` ; do
  if [ `cat $i |grep "rsync error:" | wc -l` -ne 0 ] ; then
    status=$i" "$status
  fi
done
if [[ -n $status ]] ; then 
  echo  $status
fi

среда, 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)

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

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









воскресенье, 1 мая 2016 г.

NIS netgroup и samba

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



  В какой-то момент количество шар с самыми разными правами доступа стало напрягать, размер секции в smb.conf стал неприлично большим. Закономерно упростить синтаксис за счет создания групп пользователей. Unix-группы решил не трогать, не всегда они подходят, а для целей дележки самбошных ресурсов сделать свои похожие группы, числом немногие. Свои, значит NIS, прикручивание оного NIS-а описано ранее, работает просто и понятно (в чем принципиальное отличие от от LDAP). 

Заводим собственно группы. в /etc/netgroup
admin_smb (,pvd,) (,iks,) (,super,) (,dedkov_mn,) 
boss_smb (,petrov_ii,) (,ivanova_ma,) (,sidorova_aa,)
Обновляем NIS
cd /var/yp
make
И прописываем наши группы в smb.conf
[Кадры]
    comment = Отдел кадров
    path = /home/storage/samba/private/kadr
    writable = yes
    inherit permissions = Yes
    create mask = 0666
    directory mask = 0777 
    valid users = @admin_smb, @boss_smb, ikadr_1, ikadr_2, ikadr_3, \
    ikadr_4, narishkin_ap
    

В реальной жизни списки куда как поболее, но принцип именно такой. Все настолько просто, что можно и забыть :-)!