Tatsoft.ru (logo)

Подробности

Автоматическая система синхронизация файлов между серверами 

Предположим вы делаете web проект, который в процессе работы создает новые файлы: будь то картинки залитые пользователем или кеш страниц.

В один прекрасный момент вы добавляете еще пару или еще больше серверов для отдачи статики. Перед ними ставите харварный лоадбалансер или распределяете нагрузку через round robin DNS

Возникает вопрос: как же сделать так чтобы все эти сервера отдавали одну и туже статику?

Вариантов несколько:

  • Складывать общие файлы на NFS
  • Складывать общие файлы на каком нибудь одном файловом сервере типа Amazon S3
  • Складывать общие файлы на каждом из серверов и периодически синхронизировать их

Опыт подсказывает, что использовать NFS для наших задач не очень получается — есть угроза намертво повесить сервер, да и вообще до CPU он очень прожорлив.

S3 конечно очень заманчиво, но имхо, как то сложновато будет интегрировать кеш =) точнее я совсем не представляю как это сделать. Но как вариант для хранения пользовательских файлов — очень даже ничего.

Мне больше всего нравится последний вариант. На нем и остановимся. Синхронизировать файлы будем очевидно при помощи rsync — с этим проблем нет, запускаем раз в час и имеем одинаковые файлы на всех серверах.

Теперь представим пользовательскую сессию:

  • Пришел пользователь A, load balancer кинул его на первый сервер
  • Залил картинку на s1 — все замечательно, картинку видно
  • Приходит пользователь Б через 5 минут после А, оказывается на втором сервере и замечательной картинки от А не видит, расстраивается, уходит, не платит нам своих денег, всем наступает несчастье

Ясно, что пример притянутый за уши. Между прочим, пример с кешем страниц аналогичный — новый кеш на первом сервере, на старом все еще старый… и тп…

Хочется синхронизировать файлы пусть не мгновенно после залития картинки, но хотя бы с минимальной задержкой.
Можно конечно из своих скриптов дергать rsync или написать какой нибудь свой мега синхронайзер.

Но зачем, если наш Linux (у вас же Linux?) сам может следить за указанный директорией и говорить что там изменилось?

Что мы имеем:

  • Gamin — это интерфейс более высокого уровня к inotify, dnotify, kqueue и Hurd Mach Notify. Он как раз и работает через эти вызовы ядра, о которых ты говоришь, т.е. это просто универсальный интерфейс на все эти четыре разных API.
  • dnotify — система встроенная в ядро, есть в 2.4
  • inotify — наследница dnotify, в ядре начиная с 2.6.12

Разберем подробнее.

Gamin — всего лиш сервер, из клиентов, которые я смотрел и которые понравились — это fileschanged, нет ничего сложного написать что нибудь свое на php или на ruby.
Плюсы: можно легко написать своего клиента.
Минусы: один раз gamin почему то стал есть 100% cpu, выяснять причину не удалось, да и проявилась она только раз, но “осадочек остался”

dnotify — замечательно работает через dnotify
Плюсы: есть в ядре 2.4

inotify — так же замечательно работает через inotify-tools
Минусы: для Cents OS и RHEL придется пересобирать ядро
Еще есть заметка на kernel.org про плюсы inotify и минусы dnotify

Я решил остановится на dnotify, так как Gamin показался слишком тяжелым, а inotify не светит…
В итоге вроде как даже работает в тестовом режиме пока.

Но есть ряд проблем, пока с ходу нерешенные.

На пример, при удалении каталога с вложенной структурой все три тулзы последовательно нам будут говорить о том как происходило удаление, т.е. сначала самый глубокий каталог, потом выше и так далее. Дергать rsync на каждый этот event определенно не кошерно. Надо думать как вместе объединить event’ы и вызывать rsync только для последнего каталога.

Может быть стоит все таки написать своего клиента под Gamin, для обработки более сложных случаев?
Может быть стоит написать какой нибудь постобработчик для notify?

Комментарии

maratische:

очень давно данная проблема решалась тупо на уровне софта, который и писался распределенно:
серверов с “контентом” было много, стояли на некотором удалении.
Один сервер мастер, остальные дочки.
при появлении файла на любом сервере, он клал задачу на отсылку его на мастер в очередь. те файл уходил на мастер сервер почти сразу.
на любом сервере при обращении к файлу. которого нет, но есть на мастере, файло скачивается оттуда.

те первое скачивание файла с зеркала долгое (там были далеко не фильмы и сайты корпоративные, поэтому устраивало).
Но элементарно добавлялось новое зеркало, которое плавно накапливало данные.

опять же писалось все руками, но и таких умных все умеющих линуксов не было :)

(Комментарий — 3:08 пп, Июнь 28 )

Тимур Вафин:

2Марат: а каком конкретно софте ты говоришь?

(Комментарий — 3:10 пп, Июнь 28 )

Олег Курносов:

На практике реально очень важно в веб-сервисах, достаточно посещаемых, что они уже хостятся на двух серверах с load-balanсе, вопрос кэширования и его синхронизации между двумя серверами продумывать. Очень интересная статья, спасибо, Тимур! Также отдельное спасибо за то, что на практике успешно удается решать такой непростой вопрос!

(Комментарий — 3:22 пп, Июнь 28 )

bolk:

Тимур, gamin - это интерфейс более высокого уровня к inotify, dnotify, kqueue и Hurd Mach Notify. Он как раз и работает через эти вызовы ядра, о которых ты говоришь, т.е. это просто универсальный интерфейс на все эти четыре разных API.

(Комментарий — 5:07 пп, Июнь 28 )

Тимур Вафин:

Да, поправил, спасибо. Смысл в том, что это лишнее звено, если нет необходимости писать что то свое.

(Комментарий — 5:11 пп, Июнь 28 )

bolk:

У нас события копятся, потом срабатывают через какое-то время. А чем это тебе gamin тяжёлым показался? :)

(Комментарий — 3:23 пп, Июнь 29 )

bolk:

Кстати, Тимур, посмотри как ты поправил в тексте место про gamin с моих слов :)

(Комментарий — 3:28 пп, Июнь 29 )

Артем Голубев:

Вот, случайно натнулся на плагин: http://code.google.com/p/acts-as-syncable/
Может будет чем-то полезен.

(Комментарий — 2:12 пп, Окт 07 )

Оставить комментарий



Публикации по категориям

Самые читаемые

  • 4,902 прочтений: что такое wordpress (далее)
  • 4,540 прочтений: возможно самый отрицательный подкаст про RoR (далее)
  • 4,191 прочтений: Про нас написали Отцы! :) (далее)
  • 3,676 прочтений: Чем плох MySQL (далее)
  • 3,614 прочтений: Впервые в России конференция в формате BarCamp (далее)
  • 3,599 прочтений: 9 ошибок менеджера или почему задерживаются проекты (далее)
  • 3,143 прочтений: Конференция - взгляд из-за кулис (далее)
  • 2,682 прочтений: Автоматическая система синхронизация файлов между серверами (далее)
  • 2,232 прочтений: jQuery – Javascript нового поколения (далее)
  • 2,224 прочтений: Перепись казанских веб-студий. Часть 1. (далее)

Добавление в рейтинги

Bobrdobr Memori Google YahooMyWeb Digg Technorati Delicious
количество читателей онлайн и всего Рекомендовать tatsoft.ru в МойКруг.ру

Активные участники

 7 Users Online из них сейчас на сайте

Облако тэгов