Изменения

Перейти к: навигация, поиск

Файловая репликация

5980 байтов добавлено, 20:55, 23 января 2010
Новая страница: «'''Evsync''' — простой инструмент для «непрерывной» rsync-образной синхронизации файлов. В некот...»
'''Evsync''' — простой инструмент для «непрерывной» rsync-образной синхронизации файлов. В некотором смысле, лишённый недостатков [http://code.google.com/p/lsyncd/ lsyncd]/[http://bb.xnull.de/projects/inosync/ inosync], написанный, к тому же, на Perl’е.

Недостатки inosync:
* Не умеет следить за несколькими каталогами сразу.
* Не поддерживаются фильтры rsync’а, что приводит к лишним его вызовам.
* Rsync всегда вызывается целиком на каталоге, а не на отдельных файлах, что вряд ли приведёт к хорошей производительности.
* Не очень корректная схема работы — спим 10 секунд, просыпаемся, анализируем события, снова спим… И т.п. С одной стороны, может синхронизировать файлы в середине записи в них, с другой стороны, неидеально «уменьшает поток» событий в случае большого числа модификаций.
* Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком.
* Написан на Python, дописывать неохота. А учитывая исключительную простоту (меньше 200 строк кода), и дописывать-то особенно нечего.

Недостатки lsyncd:
* Существуют лимиты на корректность имён файлов.
* Существует лимит на количество наблюдаемых файлов (открывается только 1 дескриптор inotify).
* Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком.
* Также может синхронизировать файлы посреди записи в них по событиям IN_.
* Написан на C, дописывать неохота.

== События Inotify ==

<tab sep=tab class=simpletable head=left>
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 Открытие файла.
</tab>

== Флаги Inotify ==

<tab sep=tab class=simpletable head=left>
IN_IGNORED Наблюдение отменено — либо явно, либо автоматически при удалении файла или размонтировании ФС.
IN_ISDIR Субъект данного события — каталог.
IN_Q_OVERFLOW Переполнение очереди событий.
IN_UNMOUNT Размонтирование файловой системы, содержащей субъект события.
</tab>

== Корректные реакции на события ==

<tab sep=tab class=simpletable head=left>
Начало мониторинга 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 Ошибка обработки!
</tab>

[[Категория:Разработка]]

Навигация