Использование Paxos для синхронизации большого файла между узлами

Я пытаюсь использовать Paxos для поддержания консенсуса между узлами в файле размером около 50 МБ, который постоянно изменяется на отдельных узлах. Я сталкиваюсь с проблемами практичности. Требования:

  1. Синхронизируйте файл размером 50 МБ на сотнях узлов
  2. Внести изменения в этот файл, которые могут быть внесены с любого узла и которые вряд ли будут напрямую конкурировать друг с другом, распространятся по сети в течение нескольких секунд максимум.
  3. Новые узлы, которые присоединяются к сети, могут в течение нескольких минут (‹1 час) создать весь файл, следуя сообщениям Paxos.

Проблема, с которой я столкнулся, заключается в том, что, похоже, нет способа достичь обеих целей 2 и 3.

Вот варианты, которые я рассмотрел до сих пор:

  • Синхронизировать весь файл каждый раунд - совершенно непрактично, раунды Paxos занимали бы минуты
  • Синхронизировать только изменения в файле - целесообразно для целей 1 и 2, но нарушает цель 3, поскольку новые узлы смогут синхронизировать только весь файл после изменения каждой единицы состояния.
  • Синхронизировать изменения и случайный фрагмент файла каждый раунд - я не уверен, позволяет ли это Paxos. Узлы смогут проверять изменения относительно своих собственных (с учетом новых изменений) и смогут проверять случайную часть файла относительно указанной части своей версии, но практично ли это?

Я думаю, что третий вариант лучше, но я не уверен, позволяет ли это Paxos. Идея состоит в том, чтобы ограничить объем данных, которыми обмениваются каждый раунд, возможно, до 1500 байтов и заполнить эти 1500 байтов в первую очередь изменениями в файле. В большинстве раундов файл будет неизменным, а раунды, в которых что-то изменилось, скорее всего, будут меньше, чем 100 байтов измененного состояния, поэтому другие 1400 байтов могут быть заполнены некоторой частью файла, что позволит создавать новые узлы. вверх весь файл с течением времени. Это практично? Эта проблема уже решена?


person TheEnvironmentalist    schedule 26.08.2015    source источник
comment
Почему вы вообще хотите использовать paxos? Почему не какой-нибудь в конечном итоге согласованный алгоритм?   -  person peter    schedule 26.08.2015
comment
@peter, вот что такое Paxos   -  person TheEnvironmentalist    schedule 26.08.2015
comment
Не совсем. Paxos должен достичь согласия, и все соглашаются с этим. Алгоритмы конечной согласованности могут легко обрабатывать поток изменений и обновлений, если вы можете разрешать конфликты.   -  person peter    schedule 26.08.2015
comment
@peter, как бы ты решил это тогда?   -  person TheEnvironmentalist    schedule 26.08.2015
comment
Слишком рано нажать Enter, см. Мой обновленный комментарий   -  person peter    schedule 26.08.2015
comment
Я знаю только одну конкретную спецификацию алгоритма конечной согласованности по имени, это TSAE, но он может быть недостаточно быстрым для ваших нужд.   -  person peter    schedule 26.08.2015
comment
@TheEnvironmentalist вы нашли решение?   -  person simbo1905    schedule 15.03.2017
comment
Я также пытаюсь разработать систему, которая будет делать то же самое? Синхронизируйте файлы между узлами кластера. Удалось ли вам разработать решение для этого.   -  person Gagan    schedule 12.02.2019


Ответы (2)


Как Питер упомянул в комментариях, вероятно, лучше подойдет окончательно согласованный. Вот один из таких алгоритмов, основанный на протоколе сплетен.

У каждого узла есть какая-то версия файла. Каждые N секунд каждый узел подключается к другому узлу, и они меняют номера версий. Если один узел находится за другим, он загружает файл от однорангового узла.

Это сходится замечательно быстро, я думаю, в пределах 10-20 раундов сплетен на 1000 узлов.


Обновлять

(Добавляем плот или очередь сообщений.)

Плот

Из ваших комментариев видно, что у вас в руках есть хранилище ключей и значений. Вы можете думать об этом как о распределенном конечном автомате, в котором вы обрабатываете обновление каждого ключа как отдельную команду. Это отлично подходит для протокола консенсуса, такого как paxos или raft (сейчас я предпочитаю raft для количество реализаций с открытым исходным кодом). Более того, они часто реализуются так, чтобы действовать как атомная система широковещательной передачи. Короче говоря, несколько узлов действуют как основные лица, принимающие решения, а остальные узлы слушают результаты.

(Конечно, я не знаю, как обновляется ваш файл; т.е. обновляется ли он только на главном узле, а остальные являются подчиненными.)

Одной из основных проблем будет разветвление до 1000 узлов. Для этого вам, вероятно, понадобится иерархическое разветвление. Существуют различные схемы, чтобы помочь в этом; Вот несколько идей. A) Каждый узел должен подключаться к двум случайным одноранговым узлам; и поток от однорангового узла с кратчайшим путем к главному узлу (это называется сила двух вариантов); или Б) с некоторой вероятностью p выбрал однорангового узла с кратчайшим маршрутом. C) Пусть каждый узел подключается к одному случайному узлу, и с некоторой вероятностью p поток от этого узла вместо этого подключается к его вышестоящему узлу. Эти вероятности предназначены для создания n-арного дерева, которое является хорошим балансом между каждым узлом, подключенным к главному узлу, и каждым узлом в связанном списке.

Очередь сообщений

Теперь paxos и raft дают довольно серьезные гарантии. Специально для этого случая каждое обновление будет обрабатываться по порядку - по всем ключам. Если вам не нужна эта гарантия, вы можете спроектировать гораздо более простую систему.

Каждое обновление ключа может транслироваться в очередь распределенных сообщений (например, SQS, RabbitMQ и т. Д.). Версия каждого обновления ключа и применение обновления только в том случае, если оно превышает версию, которая у вас есть. Это дает вам красивую и быструю, в конечном итоге последовательную систему.

Я бы пошел с этим подходом выше, используя raft / paxos, если система позволяет это.

person Michael Deardeuff    schedule 31.08.2015
comment
Я предполагаю, что узлы выбирают партнеров случайным образом на последовательной основе? Как бы вы подсчитали, сколько раундов требуется, чтобы, скажем, 99% узлов узнали о последнем обновлении? - person TheEnvironmentalist; 01.09.2015
comment
Кроме того, вы забываете о требовании 1, в котором размер файла превышает 50 МБ, поэтому его невозможно загрузить полностью каждым узлом при каждом изменении. Тем не менее, он достаточно хорошо соответствует Требованию 3. - person TheEnvironmentalist; 01.09.2015
comment
@TheEnvironmentalist, если файл разбит на разделы, было бы легко присвоить каждому разделу номер версии и расширить протокол сплетен. Однако не уверен, что делать с файлом произвольной формы. - person Michael Deardeuff; 01.09.2015
comment
В файле нет четких разделов. Его можно произвольно разделить на разделы на основе правил хеширования, чтобы новые изменения также постоянно вносились в соответствующий раздел, но каковы последствия этого? По сути, файл представляет собой хеш-таблицу. - person TheEnvironmentalist; 01.09.2015
comment
@TheEnvironmentalist Я использовал сплетни, чтобы синхронизировать хеш-таблицу с несколькими тысячами ключей - person Michael Deardeuff; 01.09.2015
comment
Ха-ха, теперь представьте хеш-таблицу, в которой каждый элемент содержит несколько десятков байтов информации, около миллиона элементов. - person TheEnvironmentalist; 01.09.2015
comment
Мне это нравится. Я думаю, что оставлю его открытым еще на несколько дней, чтобы посмотреть, появится ли другой ответ, и не стесняйтесь добавлять дополнительную информацию, но это здорово. - person TheEnvironmentalist; 02.09.2015

Мы можем использовать paxos для репликации журнала транзакций записи в файл как описано здесь. Когда к кластеру присоединяется новый сервер с пустым файлом, он может запросить моментальный снимок с актуального узла. Тем временем новый узел может также прослушивать и буферизовать текущие обновления. После того, как он загрузил снимок и применил более поздние обновления, он полностью обновлен.

Снимок может быть полной копией файла. Создание полного снимка означает блокировку записи, но не чтения. Возможно, это не слишком большая нагрузка на производительность для 50-мегабайтного файла на SSD-диске с рейдом. Более эффективным подходом могло бы быть моделирование файла как неизменяемой (чисто функциональной) структуры данных с помощью семантика копирования при записи. Вместо простого файла мы можем смоделировать его как постоянную структуру данных фрагментов файла. Примером может служить неизменяемый отсортированная карта, где ключи - номера фрагментов файла, а значения - фрагменты файла. Запись в файл означает вставку одного или нескольких обновленных фрагментов в карту. С такой структурой данных все операции записи возвращают новую неизменяемую карту. Новая карта разделяет неизмененные фрагменты файлов с предыдущими версиями карты. Снимок файла является неизменной версией карты в определенный момент времени. При использовании неизменяемой карты не требуется блокировок для посещения всех фрагментов карты для передачи полного снимка состояния файла на любой новый сервер. В в структурированном хранилище журналов используется такой метод.

person simbo1905    schedule 08.12.2015
comment
Проблема здесь в подрыве устойчивости. На самом деле мне не нужна операция повторной передачи файла, потому что ее можно использовать как способ подвергнуть систему лишней работе в качестве атаки. - person TheEnvironmentalist; 09.12.2015
comment
В идеале синхронизация файлов должна быть просто частью операции синхронизации. - person TheEnvironmentalist; 09.12.2015
comment
вмешательство и дросселирование могут быть обработаны на транспортных уровнях. В Cassandra есть настройка ограничения полосы пропускания для потоковой передачи данных по кластеру для задач администрирования и ключей SSL, чтобы гарантировать, что только правильные узлы присоединяются к кластеру. вы должны отправить новую копию файла на новый узел. ограничение полосы пропускания и безопасность могут быть обработаны на более высоких уровнях программного обеспечения, чем алгоритм консенсуса; проще тестировать и разделять настройки (например, увеличивать / уменьшать лимит пропускной способности для данной сети, меняя ssl на kerberos). включение таких функций в алгоритм усложняет тестирование и улучшения; разделите проблемы. - person simbo1905; 09.12.2015