2012-03-22 4 views
1

У меня есть два сервера с балансировкой нагрузки, каждый из которых выполняет точно такую ​​же копию различных веб-сайтов на основе PHP.Синхронизация веб-каталогов между серверами с балансировкой нагрузки

Пользователь admin (или несколько пользователей-администраторов), попав на свой сайт, может попасть на тот или иной сервер, если захочет изменить контент, например. загружать изображение, удалять файл из медиа-библиотеки и т. д.

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

В настоящее время я смотрю на rsync для этого с помощью опции -delete, но я не уверен, как он реагирует на удаляемые файлы и новые файлы, созданные между серверами.

т. Е. Если я удалю файл на сервере Сервер A и rsync с сервером B, файл также должен быть удален с сервера B (поскольку он больше не существует на A), но если я отдельно загружаю файл на сервер B, а также удалив файл с сервера A перед запуском синхронизации, будет ли удаляться файл, который был загружен на сервер B, так как он не существует на сервере A?

В ряде учебных пособий в Интернете рассматривается сценарий типа «хозяин-ведомый», где сервер B является зеркалом сервера A, и этот процесс просто работает, но в моей ситуации оба сервера фактически являются мастерами, отражающими друг друга.

Я думаю Rsync хранит локальную историю файлов, которые он имеет дело и как таковые могут быть в состоянии справиться с этой проблемой грациозно, но я не уверен, если это действительно так, или если это опасно полагаться на это в одиночку ?

Есть ли лучший способ справиться с этой проблемой?

+0

Предположим, что у вас есть следующая сценария: на сервере A есть файлы {A, B), сервер B имеет файлы {B, C}. Если вы запустите синхронизацию на сервере A, откуда вы знаете, должен ли файл A быть удален или отправлен на сервер B?Как вы определяете погоду или нет файл A был добавлен только на сервере A или просто удален на сервере B? – aglassman

ответ

3

Я был недоволен моим предыдущим ответом. Звучит слишком сильно, как будто кто-то должен был изобрести способ сделать это уже.

Кажется, что есть! Выезд Unison. Там есть GUI и все такое.

+0

Мы перешли от rsync к унисону, прежде чем увидели ваш ответ, и он, безусловно, делает то, что нам тоже нужно - казалось бы, надежно до сих пор. – CoderChris

0

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

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

Я предлагаю, чтобы при удалении файла вы записывали его имя в файл. Затем вместо с использованием rsync --delete, сделайте это вручную, например, с cat deleted-files | ssh serverb xargs rm -v.

Таким образом, ваш процесс будет выглядеть примерно так:

ServerA: 
rsync -a --update mydir serverB:mydir 
cat deleted-files | ssh serverB xargs rm -v 

ServerB: 
rsync -a --update mydir serverA:mydir 
cat deleted-files | ssh serverA xargs rm -v 

Очевидно, что два синхронизируется не могут работать одновременно, и я оставил от других вариантов важно Rsync: вы, вероятно, хотите рассмотрите --delay-updates, --partial-dir и другие.

Смежные вопросы