Я намерен синхронизировать две удаленные директории (скажем, dir1 и dir2). Таким образом, когда бы ни происходило изменение содержимого dir1 (это может быть добавление или удаление нового файла или каталога или изменение содержимого файла в каталоге), это изменение должно распространяться на dir2 и наоборот.

Наивный способ сделать это - периодически запускать rsync через cron на обеих машинах. Но в этом подходе есть ошибки:

  1. Может случиться, что предыдущий rsysnc не завершен, и cron выполнил rsync еще раз, пока предыдущий rysnc все еще продолжался.
  2. В dir1 добавляется новый файл, и перед тем, как rsync запускается на dir2, rsync на dir1 запускается, тогда добавленный файл может быть удален из dir1, поскольку его нет в dir2.
  3. Также это не в реальном времени.

Могут ли некоторые предложить лучший способ сделать это? Я ищу с открытым исходным кодом, который будет легче настроить и начать работу.

2 ответа2

1

Единственный способ обеспечить «жесткую гарантию в реальном времени» без окна гонки - убедиться, что запись подтверждается только после того, как она ударила по обеим сторонам. Обычный способ достижения этого - кластерная файловая система (например, OCFS2 или GFS2) на совместно используемом блочном устройстве. Такое совместно используемое блочное устройство может быть легко и недорого собрано с использованием DRBD.

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

Шпаргалка вокруг линий

  • Зарезервируйте блочное устройство (диск, раздел, LV, ..) с обеих сторон
  • установите и настройте DRBD (apt-get install drbd-utils), используйте отличную документацию на их сайте
  • Установите кластерный стек по вашему выбору: полноценная Red Hat (если вам нужно больше, чем просто общая файловая система) или минималистский, но очень простой O2DLM (включен в OCFS2).
  • Отформатируйте устройство DRBD с помощью GFS2 (только стек Red Hat) или OCFS2 (возможно с обоими стеками) и установите его с обеих сторон

Теперь у вас нет пары синхронизированных каталогов: у вас есть один каталог, который доступен на обоих узлах. Это функционально то же самое, но без окон гонки.

0

Если он находится на том же компьютере, рассмотрите использование ссылки на файловую систему. Это будет означать, что dir2 "указывает" на dir1 или наоборот, пока он будет прозрачным. Для этого используйте ln например, ln -s /path/to/dir1 /path/to/dir2 или альтернативно используйте относительные пути. -s означает, что это символическая ссылка, так что она просто ссылается на путь, а не на индекс dir1 .

Изменить: Извините, пропустил "обе машины" часть.

Возможно, стоит подумать об использовании сетевого ресурса, синхронизировать два местоположения в (почти) реальном времени всегда сложно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .