Платформа: Ubuntu 10.04 x86.
У нас есть HTTP-сервер (nginx, но это не имеет значения), который обслуживает некоторый статический контент. Контент (редко) загружается контент-менеджерами через SFTP, но может быть изменен / добавлен другими способами (например, cat
, сделанные прямо на сервере).
Теперь мы хотим добавить второй идентичный HTTP-сервер - подчиненное зеркало в другом дата-центре на другом континенте. (И настройте циклический перебор DNS.)
Как лучше всего настроить синхронизацию между главным сервером и подчиненным зеркалом, чтобы задержка между модификацией и повторной синхронизацией была минимальной (хотя несколько секунд должны быть терпимы)?
Решение должно соответствовать большим изменениям и условиям гонки. То есть, если я изменю 1000 файлов, это не должно вызвать 1000 процессов синхронизации. И если я что-то изменяю, пока активна синхронизация, мое новое изменение должно в конечном итоге попасть и на сервер ... И так далее.
Отклоненные решения:
Я бы сказал, что нам нужно что-то на основе inotify. Есть готовое решение?
Обновить: два дополнительных (довольно очевидных) требования, о которых я забыл упомянуть:
Если данные каким-либо образом изменены на ведомом зеркале (например, суперпользователь случайно удалил файл), решение для синхронизации должно восстановить данные обратно в состояние ведущего при следующей синхронизации.
В состоянии ожидания решение не должно потреблять трафик или системные ресурсы (кроме некоторой памяти и т. Д. Для спящего процесса демона).
Обновление 2: еще одно требование:
Вы могли бы использовать lsyncd
видеть: Есть ли работающее решение для резервного копирования Linux, использующее inotify?
Вы считали Унисон как средство для синхронизации файлов? Используя его, вы сможете выполнять запрашиваемую одностороннюю синхронизацию. Кажется, это разумно подходит для этого приложения.
Что о rsyncd? Думаю, это хорошая идея;)
Похоже, именно здесь вы можете захотеть написать скрипт, который проверяет временные метки файлов, и если временная метка позже, чем последний запуск скрипта, предположите, что файл необходимо отправить, а затем запустить rsync или какой-либо другой инструмент для синхронизации файла. Аналогичным образом, с другой стороны, сделайте то же самое с проверкой, был ли файл изменен, и если да, активируйте извлечение. Ткань может быть для этого хорошим инструментом. Если вы знакомы с Python, возможно, лучше использовать ткань в сочетании с проверкой временных меток.