Файловая репликация
Версия от 23:59, 23 января 2010; VitaliyFilippov (обсуждение | вклад)
Версия от 23:59, 23 января 2010; VitaliyFilippov (обсуждение | вклад)
Короткая ссылка: Evsync
Evsync — простой инструмент для «непрерывной» rsync-образной синхронизации файлов. В некотором смысле, лишённый недостатков lsyncd или inosync, написанный, к тому же, на Perl’е.
Недостатки inosync и lsyncd
Недостатки inosync:
- Не умеет следить за несколькими каталогами сразу.
- Не поддерживаются фильтры rsync’а, что приводит к лишним его вызовам.
- Rsync всегда вызывается целиком на каталоге, а не на отдельных файлах, что вряд ли приведёт к хорошей производительности.
- Не очень корректная схема работы — спим 10 секунд, просыпаемся, анализируем события, снова спим… И т.п. С одной стороны, может синхронизировать файлы в середине записи в них, с другой стороны, неидеально «уменьшает поток» событий в случае большого числа модификаций.
- Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком.
- Написан на Python, дописывать неохота. А учитывая исключительную простоту (меньше 200 строк кода), и дописывать-то особенно нечего.
Недостатки lsyncd:
- Существуют лимиты на корректность имён файлов.
- Существует лимит на количество наблюдаемых файлов (открывается только 1 дескриптор inotify).
- Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком.
- Также может синхронизировать файлы посреди записи в них по событиям IN_.
- Написан на C, дописывать неохота.
События Inotify
IN_ACCESS | Чтение из файла. |
---|---|
IN_ATTRIB | Изменение метаданных файла — прав доступа, владельца и группы, времени доступа, количества жёстких ссылок (в версиях ядер >= 2.6.25) и т. п. |
IN_CLOSE_WRITE | Закрытие файла, ранее открытого для записи. |
IN_CLOSE_NOWRITE | Закрытие файла без записи. |
IN_CREATE | Файл/каталог создан внутри наблюдаемого каталога. |
IN_DELETE | Файл/каталог внутри наблюдаемого каталога удалён. |
IN_DELETE_SELF | Удалён сам наблюдаемый файл/каталог. |
IN_MODIFY | Запись в файл. |
IN_MOVE_SELF | Перемёщён сам наблюдаемый файл/каталог. |
IN_MOVED_FROM | Перемещение файла («из» указанного в событии). |
IN_MOVED_TO | Перемещение файла («в» указанный в событии). Пары связанных событий IN_MOVED_TO и IN_MOVED_FROM обозначаются одинаковым атрибутом «cookie». |
IN_OPEN | Открытие файла. |
Флаги
IN_IGNORED | Наблюдение отменено — либо явно, либо автоматически при удалении файла или размонтировании ФС. |
---|---|
IN_ISDIR | Субъект данного события — каталог. |
IN_Q_OVERFLOW | Переполнение очереди событий. |
IN_UNMOUNT | Размонтирование файловой системы, содержащей субъект события. |
Корректные реакции на события
Начало мониторинга | rsync всего каталога. |
---|---|
IN_CREATE | rsync отдельного файла. |
IN_DELETE | Удалить файл на удалённой стороне. Rsync с этим, бывает, тормозит. |
IN_DELETE_SELF | Видимо, также удалить, либо ошибка обработки. |
IN_MODIFY | Ничего не делать! Событий модификации может быть много, а завершатся они, только когда записывающий процесс закроет файл — событием IN_CLOSE_WRITE. |
IN_ATTRIB | rsync с флагами -lptEAX и, возможно, -og (если удалённый rsync работает под рутом) |
IN_CLOSE_WRITE | rsync, ибо файл изменился. |
IN_MOVE_SELF | Либо удалить, либо ошибка обработки. |
Пара IN_MOVED_* | Переместить файл на удалённой стороне. Если целевой файл на удалённой стороне существует — переименовать его в «имя.(n+1)» (n — число). Rsync этого не умеет, придётся открывать отдельное соединение и ставить демон на удалённую сторону. |
IN_Q_OVERFLOW | Часть событий потеряна, так что rsync всего каталога после небольшой задержки, ибо мы не знаем, какие файлы поменялись. |
IN_UNMOUNT | Ошибка обработки! |
Ссылки
См. также:
- http://linux.die.net/man/2/inotify - man 2 inotify.
- http://code.google.com/p/lsyncd/ - домашняя страница lsyncd.
- http://bb.xnull.de/projects/inosync/ - домашняя страница inosync.
- http://wiki.opennet.ru/Incrontab - демон, запускающий программы в качестве реакций на события inotify.