From 47a25ef0ae365f54b7c050d718112a3e6ccedeaa Mon Sep 17 00:00:00 2001 From: Окунев Дмитрий Юрьевич Date: Wed, 18 Jun 2014 14:00:12 +0400 Subject: [PATCH] Updated for clsync-0.4 --- clsync/atomicsync | 93 +++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/clsync/atomicsync b/clsync/atomicsync index e006674..0492b75 100644 --- a/clsync/atomicsync +++ b/clsync/atomicsync @@ -1,46 +1,47 @@ -++ Введение - -Нередко могут возникать ситуации, требующие атомарной синхронизации используемых файловых данных. В качестве утрированного примера представить, что имеется большая директория «/var/www» и необходимо перенести её содержимое на другой сервер в целостном виде без долгой сервисов. - -Многие администраторы в таких случаях применяют циклический rsync, в результате работы которого ОС накапливают дисковый кеш, в результате чего последующие итерации rsync выполняются всё быстрее и быстрее. После того, как время досинхронизации станет достаточно малым, чтобы downtime таких масштабов был допустим, работу сервисов (использующих «/var/www») останавливают, дожидаются дополнительной итерации rsync, после чего запускают сервисы уже на другом узле. - -Однако данный метод обладает достаточно ограниченной применимостью. Дискового кеша или других ресурсов может оказаться недостаточным, чтобы время итерации rsync сократилось до приемлемых величин. - -Предполагается, что rsync администратор способен настроить самостоятельно, поэтому подробности его настройки в данном тексте не рассматриваются. - -++ Решение - -Решение достаточно простое: - - ionice -c 3 clsync --exit-on-no-events=1 --max-iterations=20 --exit-hook=/root/stop-here-start-there.sh --mode=rsyncshell --ignore-exitcode=23 --retries=3 -W /var/www -S /root/rsync.sh -L /dev/shm/clsync - -Далее создаём /root/rsync.sh примерно следующего содержания: - - exec rsync --password-file="/root/rsync.pass" -aHv --timeout=3600 --delete-before --exclude-from="$4" --include-from="$3" --exclude='*' /var/www/ rsync://clsync@другой_узел/var/www/ 2>/tmp/clsync-rsync-"$LABEL"-brother.err - -clsync произведёт полную синхронизацию, после чего будет отлавливать изменения на файловой системе внутри «/var/www» и производить досинхронизации только по нужным файлам/директориям. Досинхронизации прекратятся как только будет нéчего синхронизировать (за время последней досинхронизации ничего не изменилось) или завершится 20-ая итерации синхронизации (чтобы процесс не длился вечно). - -После окончания синхронизаций clsync запустит скрипт «/root/stop-here-start-there.sh». Предполагается, что в данном скрипте будет описан сценарий остановки сервисов на старом узле и их запуска на новом узле. Таким образом downtime будет минимизирован. - -Установить clsync можно следующим образом: - - # Debian - apt-get install clsync - - # Gentoo - layman -a bircoph - emerge --sync - emerge =app-admin/clsync-0.3 - - # 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 - +++ Введение + +Нередко могут возникать ситуации, требующие атомарной синхронизации используемых файловых данных. В качестве утрированного примера представить, что имеется большая директория «/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 \ No newline at end of file -- libgit2 0.24.0