Синхронизация миллионов файлов между двумя серверами Linux


10

У меня есть сервер, который экспортирует каталог, содержащий ~ 7 миллионов файлов (в основном изображений) со своего локального диска для сетевых клиентов через NFS .

Мне нужно добавить второй ради HA и синхронизировать его с первым с минимальной разницей между ними.

Исследования предлагают использовать для этого lsyncd или другие решения на основе inotify , но, учитывая количество файлов, создающих часы inotify, требуется вечность. То же самое для rsync .

Другими возможными решениями, по-видимому, являются drdb или кластерные файловые системы, такие как ceph или glusterfs , но я не имею опыта работы с ними и не знаю, какой из них был бы более подходящим и справлялся бы с таким количеством файлов и все же обеспечивал бы приличную производительность.

Обратите внимание, что действие в основном читается с небольшой записью.


2
DRDB отлично работает и прост в настройке и понимании в настройке кластера из 2 машин; однако это не будет масштабироваться в ближайшем будущем. Могут быть и другие подходы к теме. highscalability.com/blog/2012/6/20/…
Руи Ф. Рибейро

Вы пытались запустить rsyncв режиме демона? Это ускорит первоначальное генерирование списка файлов при запуске rsyncкоманды, но будет интенсивно использовать ОЗУ в зависимости от количества файлов.
Томас

Какую задержку вы можете терпеть? если вы можете терпеть несколько минут (или больше), используйте btrfsили zfsможете использовать опцию в сочетании с заданием cron для создания моментальных снимков и / zfs sendили btrfs sendих на сервере резервного копирования. намного быстрее и намного легче (как для отправителя, так и для получателя), чем rsync, потому что для моментального снимка + отправки не нужно сравнивать временные метки или контрольные суммы файлов.
Cas

Кстати, с ceph вы также получаете возможность использовать его как хранилище объектов (например, как amazon s3 или openstacks swift) вместо файловой системы. На самом деле, fs ceph на самом деле находится поверх своего хранилища объектов.
Cas

@Thomas: rsync -aиспользование демона (в источнике) занимает 200 минут, что больше, чем приемлемо. @ CAS: btrfs sendможет быть, стоит попробовать, я посмотрю на это. Я не могу перейти в хранилище объектов, так как я не являюсь разработчиком приложения, которое использует файлы.
user60039

Ответы:


1

Я склонен предлагать репликацию, которая не зависит от данных, например, drbd. Большое количество файлов приведет к тому, что все, что выполняется на более высоком уровне, чем «блочное хранилище», будет тратить слишком много времени на обход дерева - как вы узнали, используя rsync или создавая часы inotify.

Краткая версия моей личной истории, подкрепляющая это: я не использовал Ceph, но я почти уверен, что это не является их основной целью на рынке из-за его сходства с Gluster. Однако в последние несколько лет я пытался реализовать такое решение с помощью Gluster. Он работал и работал большую часть того времени, хотя несколько основных обновлений версии, но у меня не было никаких проблем. Если ваша цель - больше избыточность, чем производительность, Gluster может оказаться не лучшим решением. В частности, если в вашем шаблоне использования много вызовов stat (), Gluster не очень хорошо справляется с репликацией. Это связано с тем, что вызовы stat для реплицированных томов направляются на все реплицированные узлы (на самом деле это «кирпичики», но вы, вероятно, просто будете иметь один блок на хост). Если у вас есть двусторонняя реплика, например, Каждый stat () от клиента ожидает ответа от обоих блоков, чтобы убедиться, что он использует текущие данные. Кроме того, у вас также есть накладные расходы FUSE и отсутствие кэширования, если вы используете собственную файловую систему Gluster для избыточности (вместо того, чтобы использовать Gluster в качестве бэкэнда с NFS в качестве протокола и автомонтировщик для избыточности, который все еще отстой по причине stat ()) , Gluster хорошо работает с большими файлами, где вы можете распределять данные между несколькими серверами; чередование и распределение данных работает хорошо, потому что это действительно то, для чего это нужно. И более новая репликация RAID10-типа работает лучше, чем старые тома с прямой репликацией. Но, исходя из того, что я предполагаю, является вашей моделью использования, я бы посоветовал против этого. Кроме того, у вас также есть накладные расходы FUSE и отсутствие кэширования, если вы используете собственную файловую систему Gluster для избыточности (вместо того, чтобы использовать Gluster в качестве бэкэнда с NFS в качестве протокола и автомонтировщик для избыточности, который все еще отстой по причине stat ()) , Gluster хорошо работает с большими файлами, где вы можете распределять данные между несколькими серверами; чередование и распределение данных работает хорошо, потому что это действительно то, для чего это нужно. И более новая репликация RAID10-типа работает лучше, чем старые тома с прямой репликацией. Но, исходя из того, что я предполагаю, является вашей моделью использования, я бы посоветовал против этого. Кроме того, у вас также есть накладные расходы FUSE и отсутствие кеширования, если вы используете собственную файловую систему Gluster для избыточности (вместо того, чтобы использовать Gluster в качестве бэкэнда с NFS в качестве протокола и автомонтировщик для избыточности, который все еще отстой по причине stat ()) , Gluster хорошо работает с большими файлами, где вы можете распределять данные между несколькими серверами; чередование и распределение данных работает хорошо, потому что это действительно то, для чего это нужно. И более новая репликация RAID10-типа работает лучше, чем старые тома с прямой репликацией. Но, исходя из того, что я предполагаю, является вашей моделью использования, я бы посоветовал против этого. который все еще отстой по причине stat (). Gluster хорошо работает с большими файлами, где вы можете распределять данные между несколькими серверами; чередование и распределение данных работает хорошо, потому что это действительно то, для чего это нужно. И более новая репликация RAID10-типа работает лучше, чем старые тома с прямой репликацией. Но, исходя из того, что я предполагаю, является вашей моделью использования, я бы посоветовал против этого. который все еще отстой по причине stat (). Gluster хорошо работает с большими файлами, где вы можете распределять данные между несколькими серверами; чередование и распределение данных работает хорошо, потому что это действительно то, для чего это нужно. И более новая репликация RAID10-типа работает лучше, чем старые тома с прямой репликацией. Но, исходя из того, что я предполагаю, является вашей моделью использования, я бы посоветовал против этого.

Имейте в виду, что вам, вероятно, придется найти способ провести главные выборы между машинами или реализовать распределенную блокировку. Решения для совместно используемых блочных устройств требуют файловую систему, поддерживающую работу с несколькими хозяевами (например, GFS), или требуют, чтобы только один узел монтировал файловую систему для чтения-записи. Файловым системам вообще не нравится, когда данные изменяются на уровне блочных устройств под ними. Это означает, что ваши клиенты должны будут иметь возможность определить, кто является мастером, и направить туда запросы на запись. Это может оказаться большой неприятностью. Если GFS и вся ее поддерживающая инфраструктура является опцией, drbd в режиме с несколькими хозяевами (они называют это «двойной основной») может работать хорошо. https://www.drbd.org/en/doc/users-guide-83/s-dual-primary-mode для получения дополнительной информации об этом.

Независимо от направления, в котором вы идете, вы склонны обнаруживать, что это все еще довольно большая боль в реальном времени, не просто давая компании SAN кучу денег.


Я на начальных этапах перехода от команд rsync в cron к использованию распределенной файловой системы. Если Gluster запускает stat () на всех кирпичах, мне, возможно, придется пересмотреть его как решение.
Хесусавр

1
Это только в случае реплицированной файловой системы; он работает stat()на всех кирпичах, которые имеют реплики конкретного блока, на который вы смотрите. Например, если у вас есть полосатая реплика 2x2, она statбудет работать на двух кирпичах с реплицированным блоком, но не на двух других. В моем приложении с большим количеством маленьких файлов (порядка миллиона файлов по 4 КБ каждый) ни NFS, ни FUSE не обеспечивали хорошую производительность на реплицируемых томах. А георепликация на ~ 20 машин была очень ненадежной в нескольких конфигах.
dannysauer

1
Ваш пробег может варьироваться, но я перешел от Gluster везде (который я использовал исключительно для репликации, а не для всех других действительно крутых вещей, которые Gluster фактически делает хорошо) к rsync на собственных файловых системах. :) Сейчас я смотрю на переход к lsyncd ( github.com/axkibe/lsyncd ) вместо cron, поэтому я могу приблизиться к реальному времени без издержек Gluster.
dannysauer

0

Я перешел с rsync на ceph с помощью настройки Proxmox VE.

Теперь я управляю 14 ТБ в одном кластере с живой репликацией. Уже почти 4 года.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.