Файловая репликация — различия между версиями

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

Ссылки

См. также: