Файловая репликация — различия между версиями
Материал из YourcmcWiki
м |
м |
||
(не показано 8 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | == [http://code.google.com/p/lsyncd/ lsyncd] == | |
− | == | + | * Написан на C+Lua. |
+ | * Сильно прогрессировал с того момента, как я последний раз на него смотрел. Вполне возможно, что стал нормальным решением. | ||
+ | * (?) Существуют лимиты на корректность имён файлов. | ||
+ | * (?) Существует лимит на количество наблюдаемых файлов (открывается только 1 дескриптор inotify). | ||
+ | * (?) Не обрабатывает ошибки соединения. Причём, здесь ещё хуже — синхронизации файла не произойдёт до следующего изменения хотя бы одного файла в том же подкаталоге, либо до перезапуска '''lsyncd'''. | ||
+ | |||
+ | == [http://bb.xnull.de/projects/inosync/ inosync] == | ||
− | |||
* Не умеет следить за несколькими каталогами сразу. | * Не умеет следить за несколькими каталогами сразу. | ||
* Не поддерживаются фильтры rsync’а, что приводит к лишним его вызовам. | * Не поддерживаются фильтры rsync’а, что приводит к лишним его вызовам. | ||
* Rsync всегда вызывается целиком на каталоге, а не на отдельных файлах, что вряд ли приведёт к хорошей производительности. | * Rsync всегда вызывается целиком на каталоге, а не на отдельных файлах, что вряд ли приведёт к хорошей производительности. | ||
− | * Не очень корректная схема работы — спим 10 секунд, просыпаемся, анализируем события, снова спим… | + | * Не очень корректная схема работы — спим 10 секунд, просыпаемся, анализируем события, снова спим… И т. п. С одной стороны, может синхронизировать файлы в середине записи в них, с другой стороны, неидеально «уменьшает поток» событий в случае большого числа модификаций. |
* Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком. | * Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком. | ||
+ | * Не обрабатывает ошибки соединения — до следующего изменения синхронизации не будет. | ||
* Написан на Python, дописывать неохота. А учитывая исключительную простоту (меньше 200 строк кода), и дописывать-то особенно нечего. | * Написан на Python, дописывать неохота. А учитывая исключительную простоту (меньше 200 строк кода), и дописывать-то особенно нечего. | ||
− | + | == [http://iwatch.sourceforge.net/index.html iwatch] == | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | iwatch — простой inotify-монитор, который может по событиям вызывать заданные команды. | |
− | <tab sep= | + | == Как делать правильно == |
− | IN_ACCESS Чтение из файла. | + | |
− | IN_ATTRIB Изменение метаданных файла — прав доступа, владельца и группы, времени доступа, количества жёстких ссылок (в версиях ядер >= 2.6.25) и т. п. | + | * Обязательно дожидаться события IN_CLOSE_WRITE, чтобы не синхронизировать файл в середине записи в него. |
− | IN_CLOSE_WRITE Закрытие файла, ранее открытого для записи. | + | * Можно группировать изменения файлов с целью повышения производительности. |
− | IN_CLOSE_NOWRITE Закрытие файла без записи. | + | * Обрабатывать ошибки синхронизации. |
− | IN_CREATE Файл/каталог создан внутри наблюдаемого каталога. | + | * Обрабатывать времена модификации файлов, проносить изменения в обе стороны. |
− | IN_DELETE Файл/каталог внутри наблюдаемого каталога удалён. | + | |
− | IN_DELETE_SELF Удалён '''сам''' наблюдаемый файл/каталог. | + | === События Inotify === |
− | IN_MODIFY Запись в файл. | + | |
− | IN_MOVE_SELF Перемёщён '''сам''' наблюдаемый файл/каталог. | + | <tab sep=bar class=simpletable head=left> |
− | IN_MOVED_FROM Перемещение файла («из» указанного в событии). | + | IN_ACCESS | Чтение из файла. |
− | IN_MOVED_TO Перемещение файла («в» указанный в событии). Пары связанных событий IN_MOVED_TO и IN_MOVED_FROM обозначаются одинаковым атрибутом «cookie». | + | IN_ATTRIB | Изменение метаданных файла — прав доступа, владельца и группы, времени доступа, количества жёстких ссылок (в версиях ядер >= 2.6.25) и т. п. |
− | IN_OPEN | + | 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> | ||
+ | |||
=== Флаги === | === Флаги === | ||
− | <tab sep= | + | <tab sep=bar class=simpletable head=left> |
− | IN_IGNORED Наблюдение отменено — либо явно, либо автоматически при удалении файла или размонтировании ФС. | + | IN_IGNORED | Наблюдение отменено — либо явно, либо автоматически при удалении файла или размонтировании ФС. |
− | IN_ISDIR Субъект данного события — каталог. | + | IN_ISDIR | Субъект данного события — каталог. |
− | IN_Q_OVERFLOW Переполнение очереди событий. | + | IN_Q_OVERFLOW | Переполнение очереди событий. |
− | IN_UNMOUNT Размонтирование файловой системы, содержащей субъект события. | + | IN_UNMOUNT | Размонтирование файловой системы, содержащей субъект события. |
</tab> | </tab> | ||
− | |||
− | <tab sep= | + | === Корректные реакции на события === |
− | Начало мониторинга rsync всего каталога. | + | |
− | IN_CREATE rsync отдельного файла. | + | <tab sep=bar class=simpletable head=left> |
− | IN_DELETE Удалить файл на удалённой стороне. Rsync с этим, бывает, тормозит. | + | | Начало мониторинга rsync всего каталога. |
− | IN_DELETE_SELF Видимо, также удалить, либо ошибка обработки. | + | IN_CREATE | rsync отдельного файла. |
− | IN_MODIFY Ничего не делать! Событий модификации может быть много, а завершатся они, только когда записывающий процесс закроет файл — событием IN_CLOSE_WRITE. | + | IN_DELETE | Удалить файл на удалённой стороне. Rsync с этим, бывает, тормозит. |
− | IN_ATTRIB rsync с флагами -lptEAX и, возможно, -og (если удалённый rsync работает под рутом) | + | IN_DELETE_SELF | Видимо, также удалить, либо ошибка обработки. |
− | IN_CLOSE_WRITE rsync, ибо файл изменился. | + | IN_MODIFY | Ничего не делать! Событий модификации может быть много, а завершатся они, только когда записывающий процесс закроет файл — событием IN_CLOSE_WRITE. |
− | IN_MOVE_SELF Либо удалить, либо ошибка обработки. | + | IN_ATTRIB | rsync с флагами -lptEAX и, возможно, -og (если удалённый rsync работает под рутом) |
− | Пара IN_MOVED_* Переместить файл на удалённой стороне. Если целевой файл на удалённой стороне существует — переименовать его в «имя.(n+1)» (n — число). Rsync этого не умеет, придётся открывать отдельное соединение и ставить демон на удалённую сторону. | + | IN_CLOSE_WRITE | rsync, ибо файл изменился. |
− | IN_Q_OVERFLOW Часть событий потеряна, так что rsync всего каталога после небольшой задержки, ибо мы не знаем, какие файлы поменялись. | + | IN_MOVE_SELF | Либо удалить, либо ошибка обработки. |
− | IN_UNMOUNT Ошибка обработки! | + | Пара IN_MOVED_* | Переместить файл на удалённой стороне. Если целевой файл на удалённой стороне существует — переименовать его в «имя.(n+1)» (n — число). Rsync этого не умеет, придётся открывать отдельное соединение и ставить демон на удалённую сторону. |
+ | IN_Q_OVERFLOW | Часть событий потеряна, так что rsync всего каталога после небольшой задержки, ибо мы не знаем, какие файлы поменялись. | ||
+ | IN_UNMOUNT | Ошибка обработки! | ||
</tab> | </tab> | ||
+ | |||
== Ссылки == | == Ссылки == | ||
См. также: | См. также: | ||
− | * http://linux.die.net/man/2/inotify | + | * http://linux.die.net/man/2/inotify — man 2 inotify. |
− | * http://code.google.com/p/lsyncd/ | + | * http://code.google.com/p/lsyncd/ — домашняя страница lsyncd. |
− | * http://bb.xnull.de/projects/inosync/ | + | * http://bb.xnull.de/projects/inosync/ — домашняя страница inosync. |
− | * http://wiki.opennet.ru/Incrontab | + | * http://wiki.opennet.ru/Incrontab — демон, запускающий программы в качестве реакций на события inotify. |
+ | * http://librsync.sourcefrog.net/ — librsync. | ||
+ | * {{CPAN|File::Rdiff}} — Perl-интерфейс к функциям вычисления разниц librsync. | ||
+ | * http://rdiff-backup.nongnu.org/ — утилита для резервного копирования файлов, хранящая rdiff’ы файлов для отката изменений к предыдущим датам. | ||
[[Категория:Разработка]] | [[Категория:Разработка]] |
Текущая версия на 16:11, 30 апреля 2013
Содержание
lsyncd
- Написан на C+Lua.
- Сильно прогрессировал с того момента, как я последний раз на него смотрел. Вполне возможно, что стал нормальным решением.
- (?) Существуют лимиты на корректность имён файлов.
- (?) Существует лимит на количество наблюдаемых файлов (открывается только 1 дескриптор inotify).
- (?) Не обрабатывает ошибки соединения. Причём, здесь ещё хуже — синхронизации файла не произойдёт до следующего изменения хотя бы одного файла в том же подкаталоге, либо до перезапуска lsyncd.
inosync
- Не умеет следить за несколькими каталогами сразу.
- Не поддерживаются фильтры rsync’а, что приводит к лишним его вызовам.
- Rsync всегда вызывается целиком на каталоге, а не на отдельных файлах, что вряд ли приведёт к хорошей производительности.
- Не очень корректная схема работы — спим 10 секунд, просыпаемся, анализируем события, снова спим… И т. п. С одной стороны, может синхронизировать файлы в середине записи в них, с другой стороны, неидеально «уменьшает поток» событий в случае большого числа модификаций.
- Не обрабатывает перемещения файлов — они приводят к передаче файлов целиком.
- Не обрабатывает ошибки соединения — до следующего изменения синхронизации не будет.
- Написан на Python, дописывать неохота. А учитывая исключительную простоту (меньше 200 строк кода), и дописывать-то особенно нечего.
iwatch
iwatch — простой inotify-монитор, который может по событиям вызывать заданные команды.
Как делать правильно
- Обязательно дожидаться события IN_CLOSE_WRITE, чтобы не синхронизировать файл в середине записи в него.
- Можно группировать изменения файлов с целью повышения производительности.
- Обрабатывать ошибки синхронизации.
- Обрабатывать времена модификации файлов, проносить изменения в обе стороны.
События 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.
- http://librsync.sourcefrog.net/ — librsync.
- File::Rdiff — Perl-интерфейс к функциям вычисления разниц librsync.
- http://rdiff-backup.nongnu.org/ — утилита для резервного копирования файлов, хранящая rdiff’ы файлов для отката изменений к предыдущим датам.