Это очень сильно зависит от работы.
Зачем вам нужно зеркалирование файлов. Хотите ли вы обновить что-то вроде веб-сайта или хранилища контента, где обычно можно периодически обновлять. Или вам нужна синхронизация данных в реальном времени?
Для периодического асинхронного зеркалирования файлов обычно достаточно иметь промежуточную область, в которую вы загружаете все свои данные. И откуда вы распространяете его на серверах. В вашем случае - с двумя серверами - вы можете создать несколько промежуточных файловых ресурсов на srv1, куда вы будете передавать данные (через FTP, NFS, DAV, SFTP и т. Д.), А затем иметь cronjob rsync для файлов в «живых» каталогах srv1 и srv2. В этом случае проще всего использовать rsync - создать пару ключей ssh, которую вы будете использовать для передачи данных и которая авторизована на всех серверах в вашем кластере.
Пример:
srv1:/data/staging/ <= is where you upload your data
srv1:/data/production/ <= is where your servers get their production data from
srv2:/data/production/
srv1$ cat /etc/cron.d/syncdata.cron
=====
*/5 * * * * syncuser rsync -a --delete /data/staging/ /data/production/
*/5 * * * * syncuser rsync -az --delete -e ssh /data/staging/ srv2:/data/production/
=====
Это должно дать вам основную идею. Конечно, вы захотите обернуть вызовы rsync в некоторых скриптах и реализовать правильную блокировку, чтобы она не запускалась дважды, если синхронизация занимает более 5 минут и т. Д. Кроме того, само собой разумеется, что промежуточная область не является обязательной. Вы также можете синхронизировать srv1: production с srv2: production напрямую. Просто srv2 может показывать данные, которые на 5 минут старше, чем у srv1. Что может быть проблемой, в зависимости от того, как вы балансируете между ними.
Еще один способ асинхронного распространения файлов - это упаковать их как rpm или в ваши файлы deb. Поместите их в центральный репозиторий и сделайте так, чтобы они устанавливали / обновляли с помощью чего-то вроде cfengine, monkey или другого решения на основе шины сообщений. Это имеет приятный побочный эффект от управления версиями развернутых данных, но подходит только для небольших объемов данных, которые вы производите и внедряете сами (например, версии вашего собственного программного обеспечения). Вы не захотите распространять ТБ данных с этим, а также он не подходит для зеркального отображения контента, который меняется с высокой частотой, как каждую минуту или около того.
Если вам нужно реплицировать данные практически в реальном времени, но не обязательно синхронно, вместо того, чтобы вызывать cron каждый раз, вы можете использовать некоторый метод на основе inotify, такой как уже упомянутый incron, для вызова ваших скриптов синхронизации. Другая возможность - использовать Gamin (который также использует inotify, если он присутствует в ядре) и написать свой собственный маленький демон синхронизации. И последнее, но не менее важное: если все файлы загружаются на один сервер, например, через SFTP, вы можете проверить, позволяет ли ваш SFTP-сервер определять ловушки, которые вызываются после определенных событий, таких как загрузка файла. Таким образом, вы можете указать серверу запускать ваш скрипт синхронизации при каждой загрузке новых данных.
Если вам нужно синхронное зеркальное отображение данных в реальном времени, может быть в порядке кластерная файловая система. DRDB уже был назван. Это очень удобно для репликации на уровне блоков и часто используется для высокодоступных настроек MySQL. Вы также можете взглянуть на GFS2, OCFS2, Luster и GlusterFS. Хотя Luster и GlusterFS не очень подходят для установки двух серверов.