Изменения

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

874 байта убрано, 13:11, 30 апреля 2013
м
Нет описания правки
<big>Статья описывает '''проект''' будущей разработки Evsync== [http://code.<google.com/p/lsyncd/big>lsyncd] ==
'''Evsync''' — простой инструмент для «непрерывной» rsync-образной синхронизации файлов* Написан на C+Lua. В некотором смысле* Сильно прогрессировал с того момента, лишённый недостатков [http://codeкак я последний раз на него смотрел.googleВполне возможно, что стал нормальным решением.com/p/lsyncd/ lsyncd] или [http://bb* (?) Существуют лимиты на корректность имён файлов.xnull* (?) Существует лимит на количество наблюдаемых файлов (открывается только 1 дескриптор inotify).de/projects/inosync/ inosync]* (?) Не обрабатывает ошибки соединения. Причём, написанный, к тому здесь ещё хуже — синхронизации файла не произойдёт до следующего изменения хотя бы одного файла в том жеподкаталоге, на Perl’елибо до перезапуска '''lsyncd'''.
== Недостатки [http://bb.xnull.de/projects/inosync и lsyncd / inosync] ==
Недостатки '''inosync''':
* Не умеет следить за несколькими каталогами сразу.
* Не поддерживаются фильтры rsync’а, что приводит к лишним его вызовам.
* Rsync всегда вызывается целиком на каталоге, а не на отдельных файлах, что вряд ли приведёт к хорошей производительности.
* Не очень корректная схема работы — спим 10 секунд, просыпаемся, анализируем события, снова спим… И тИ т.п п. С одной стороны, может синхронизировать файлы в середине записи в них, с другой стороны, неидеально «уменьшает поток» событий в случае большого числа модификаций.
* Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком.
* Не обрабатывает ошибки соединения — до следующего изменения синхронизации не будет.
* Написан на Python, дописывать неохота. А учитывая исключительную простоту (меньше 200 строк кода), и дописывать-то особенно нечего.
Недостатки '''lsyncd'''== [http:* Существуют лимиты на корректность имён файлов//iwatch.* Существует лимит на количество наблюдаемых файлов (открывается только 1 дескриптор inotify)sourceforge.* Не обрабатывает перемещения файлов — они приводят к передаче файлов целикомnet/index.html iwatch] ==* Также iwatch — простой inotify-монитор, который может синхронизировать файлы посреди записи в них по событиям IN_.* Также не обрабатывает ошибки соединения. Причём, здесь ещё хуже — синхронизации файла не произойдёт до следующего изменения хотя бы одного файла в том же подкаталоге, либо до перезапуска '''lsyncd'''.* Написан на C, дописывать неохотавызывать заданные команды.
== Архитектура Evsync Как делать правильно ==
Evsync (пока что всё в будущем времени):* Реализован на Perl’е, с помощью модуля {{CPAN|File::Rdiff}}.* Не запускает rsync (no forks!), а сам вычисляет rdiff’ы файлов.* Имеет опцию сохранения нескольких rdiff’ов каждого файла за последнее заданное число дней и m из них — за последний день — в отдельном каталоге, в целях резервного копирования.* Обязательно дожидается дожидаться события IN_CLOSE_WRITE, чтобы не синхронизировать файл в середине записи в него.* Имеет опцию задержки обработки Можно группировать изменения файла файлов с целью группировки нескольких изменений в одноповышения производительности.* Обрабатывает Обрабатывать ошибки синхронизации.* Обрабатывать времена модификации файлов и способен , проносить изменения в обе стороны.
=== События Inotify ===
<tab sep=tab bar 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>
=== Флаги ===
<tab sep=tab bar class=simpletable head=left>IN_IGNORED | Наблюдение отменено — либо явно, либо автоматически при удалении файла или размонтировании ФС.IN_ISDIR | Субъект данного события — каталог.IN_Q_OVERFLOW | Переполнение очереди событий.IN_UNMOUNT | Размонтирование файловой системы, содержащей субъект события.
</tab>
=== Корректные реакции на события ===
<tab sep=tab bar 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>
См. также:
* 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.* http://librsync.sourcefrog.net/ - librsync.
* {{CPAN|File::Rdiff}} — Perl-интерфейс к функциям вычисления разниц librsync.
* http://rdiff-backup.nongnu.org/ - утилита для резервного копирования файлов, хранящая rdiff’ы файлов для отката изменений к предыдущим датам.
[[Категория:Разработка]]