atomicsync 4.52 KB
++ Введение



Нередко могут возникать ситуации, требующие атомарной синхронизации используемых файловых данных. В качестве утрированного примера представить, что имеется большая директория «/var/www» и необходимо перенести её содержимое на другой сервер в целостном виде без долгой сервисов.



Многие администраторы в таких случаях применяют циклический rsync, в результате работы которого ОС накапливают дисковый кеш, в результате чего последующие итерации rsync выполняются всё быстрее и быстрее. После того, как время досинхронизации станет достаточно малым, чтобы downtime таких масштабов был допустим, работу сервисов (использующих «/var/www») останавливают, дожидаются дополнительной итерации rsync, после чего запускают сервисы уже на другом узле.



Однако данный метод обладает достаточно ограниченной применимостью. Дискового кеша или других ресурсов может оказаться недостаточным, чтобы время итерации rsync сократилось до приемлемых величин.



Предполагается, что rsync администратор способен настроить самостоятельно, поэтому подробности его настройки в данном тексте не рассматриваются.



++ Решение



Решение достаточно простое:



   ionice -c 3 clsync --exit-on-no-events=1 --max-iterations=20 --pre-exit-hook=/root/stop-here.sh --exit-hook=/root/start-there.sh --mode=rsyncdirect --ignore-exitcode=23,24 --retries=3 -W /var/www -S rsync -L /dev/shm/clsync -- %RSYNC-ARGS% /var/www/ rsync://clsync@другой_узел/var/www/



clsync произведёт полную синхронизацию, после чего будет отлавливать изменения на файловой системе внутри «/var/www» и производить досинхронизации только по нужным файлам/директориям. Досинхронизации прекратятся как только будет нéчего синхронизировать (за время последней досинхронизации ничего не изменилось) или завершится 20-ая итерации синхронизации (чтобы процесс не длился вечно).



Перед последней итерацией синхронизации clsync запустит скрипт «/root/stop-here.sh». Преподалается, что в данном скрипте будет производиться остановка сервиса на данном сервере (например «/etc/init.d/apache2 stop»).

А уже после последней итерации синхронизации clsync запустит скрипт «/root/start-there.sh». Предполагается, что в данном скрипте будет производится запуск сервиса на удалённом сервере (например «ssh rootuser@другой_узел /etc/init.d/apache2 start»).



Таким образом downtime будет равняться времени:

   времени отработки stop-here.sh +

   последней досинхронизации (событий отловленных по inotify) +

   времени отработки start-there.sh



Установить clsync можно следующим образом:



   # Debian

   apt-get install clsync

   

   # Gentoo

   layman -a bircoph

   emerge --sync

   emerge =app-admin/clsync-0.4

   

   # FreeBSD

   git clone https://github.com/xaionaro/clsync

   cd clsync/freebsd/usr/ports/sysutils/clsync && make install

   

   # Other

   pushd /tmp

   git clone https://github.com/xaionaro/clsync

   cd clsync

   autoreconf -fi

   ./configure

   make install