Я намерен синхронизировать два удаленных каталога (скажем, dir1 и dir2). Так что всякий раз, когда происходит изменение содержимого dir1 (может быть добавление или удаление нового файла или каталога или изменение содержимого файла в каталоге), то изменение должно распространяться на dir2 и наоборот.
Наивный способ, который я могу придумать, это периодически запускать rsync через cron на обеих машинах. Но в этом подходе есть ошибки:-
- Может случиться так, что предыдущий rsysnc не был завершен и cron выполнил rsync еще раз, пока предыдущий rysnc все еще выполняется.
- Новый файл добавлен в dir1 и перед запуском rsync в dir2 rsync в dir1 был запущен, затем новый добавленный файл может быть удален из dir1, поскольку его нет в dir2
- И это не в реальном времени.
Может кто-то подскажет лучший способ сделать это? Я ищу open-source, который будет проще настроить и запустить.
решение1
Единственный способ обеспечить гарантию "жесткого реального времени" без окна гонки — убедиться, что запись подтверждается только после того, как она достигнет обеих сторон. Обычный способ достижения этого — кластерная файловая система (например, OCFS2 или GFS2) на общем блочном устройстве. Такое общее блочное устройство можно легко и недорого построить с помощью DRBD.
Как и любой механизм синхронизации, ваша внутрикластерная сеть должна иметь возможность передавать скорость изменений с приемлемой задержкой.
Шпаргалка находится вокруг строк
- Зарезервируйте блочное устройство (диск, раздел, LV, ..) с обеих сторон
- установите и настройте DRBD (apt-get install drbd-utils), воспользуйтесь превосходной документацией по адресуих веб-сайт
- Установите стек кластера по вашему выбору: полноценный Red Hat (если вам нужно больше, чем просто общая файловая система) или минималистичный, но очень простой O2DLM (входит в OCFS2).
- Отформатируйте устройство DRBD с помощью GFS2 (только стек Red Hat) или OCFS2 (возможно с обоими стеками) и смонтируйте его с обеих сторон.
Теперь у вас НЕТ пары синхронизированных каталогов: у вас есть один каталог, который доступен на обоих узлах. Это функционально то же самое, но без окон гонки.
решение2
Если он находится на той же машине, рассмотрите возможность использования ссылки файловой системы. Это будет означать, что либо dir2 "указывает" на dir1, либо наоборот, при этом он будет прозрачным. Для этого используйте ln
eg ln -s /path/to/dir1 /path/to/dir2
или в качестве альтернативы используйте относительные пути. Это -s
означает, что это символическая ссылка, поэтому она просто ссылается на путь, а не на inode dir1
.
Редактировать: Извините, пропустил часть «обе машины».
Возможно, стоит рассмотреть возможность использования сетевого ресурса, поскольку синхронизация двух местоположений в (почти) реальном времени всегда затруднительна.