Межсерверное зеркалирование файлов с минимальной задержкой

Платформа: Ubuntu 10.04 x86.

У нас есть HTTP-сервер (nginx, но это не актуально), который обслуживает некоторый статический контент. Контент (редко) загружается контент-менеджерами через SFTP, но может быть изменен / добавлен другими способами (например, catСделано прямо на сервере).

Теперь мы хотим добавить второй идентичный HTTP-сервер - подчиненное зеркало в другом дата-центре на другом континенте. (И настройка DNS round-robin.)

Каков наилучший способ настроить синхронизацию между главным сервером и ведомым зеркалом, чтобы задержка между изменением и повторной синхронизацией была минимальной (хотя несколько секунд должно быть терпимым)?

Решение должно справляться с большими изменениями и условиями гонки. То есть, если я изменю 1000 файлов, это не должно порождать 1000 процессов синхронизации. И если я что-то изменяю, когда синхронизация активна, мое новое изменение должно в конечном итоге сделать это и на сервере... И так далее.

Отклоненные решения:

  • CDN - не стоит денег для нашего конкретного сценария использования.
  • НФС - не через глобальный интернет.
  • dumb cron + rsync - задержка и / или загрузка системы будут слишком большими.
  • Руководство rsync - ненадежно, содержание изменяется не-IT пользователями.

Я бы сказал, что нам нужно что-то основанное на inotify. Есть ли готовое решение?

Обновление: два дополнительных (довольно очевидных) требования, о которых я забыл упомянуть:

  • Если данные каким-либо образом изменяются на подчиненном зеркале (скажем, суперпользователь случайно удалил файл), решение для синхронизации должно восстановить данные обратно в основное состояние при следующей синхронизации.

  • В состоянии ожидания решение не должно потреблять трафик или системные ресурсы (кроме некоторой памяти и т. Д. Для процесса спящего демона, конечно).

Обновление 2: еще одно требование:

  • Решение должно работать с именами файлов UTF-8.

4 ответа

Решение

Что насчет pirsyncd? Я думаю, что это хорошая идея для вас;)

Рассматривали ли вы Unison как средство синхронизации файлов? Используя его, вы сможете выполнить одностороннюю синхронизацию, которую запрашиваете. Похоже, разумно подходит для этого приложения.

Похоже, что именно здесь вы, возможно, захотите написать скрипт, который проверяет временные метки файлов, и, если временная метка позже, чем последний запуск скрипта, предположите, что файл нужно нажать, затем запустите rsync или какой-либо другой инструмент для синхронизации файла. Аналогичным образом, с другой стороны, сделайте то же самое, проверив, был ли файл изменен, и, если это так, запустите извлечение. Ткань может быть хорошим инструментом для этого. Если вы знакомы с Python, возможно, вам подойдет использование fabric в сочетании с проверкой временных меток.

Другие вопросы по тегам