LMAX Replicator Design — как обеспечить высокую доступность?

LMAX Disruptor обычно реализуется с использованием следующего подхода: введите здесь описание изображения

Как и в этом примере, Replicator отвечает за репликацию входных событий\команд на подчиненные узлы. Репликация через набор узлов требует от нас применения алгоритмов консенсуса на тот случай, если мы хотим, чтобы система была доступна при сбоях в сети, отказах главного и подчиненных устройств.

Я думал о применении алгоритма консенсуса RAFT к этой проблеме. Одно наблюдение заключается в следующем: «RAFT требует, чтобы входные события\команды сохранялись на диск (долговременное хранение) во время репликации» (см. эту ссылку)

Это наблюдение, по сути, означает, что мы не можем выполнять репликацию в памяти. Следовательно, кажется, что нам, возможно, придется объединить функциональные возможности репликатора и журнала, чтобы иметь возможность успешно применять алгоритм RAFT к LMAX.

Есть два варианта сделать это:

Вариант 1. Использование реплицированного журнала в качестве очереди входных событий введите здесь описание изображения

  • Получатель будет считывать из сети и помещать событие в реплицированный журнал вместо кольцевого буфера.
  • Отдельный «читатель» может читать журнал и публиковать события в кольцевом буфере.
  • Журнал может быть реплицирован между узлами с помощью RAFT. Нам не нужны репликатор и журналлер, так как функциональность уже реализована в реплицированном журнале RAFT.

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

Вариант 2: Используйте Replicator для передачи входных событий\команд в файл журнала ввода подчиненного устройства введите описание изображения здесь

Мне интересно, есть ли другое решение для дизайна Replicator? Какие различные варианты конструкции репликаторов люди использовали? В частности, любой дизайн, который может поддерживать репликацию в памяти?


person coder_bro    schedule 08.05.2014    source источник
comment
В итоге вы разработали HA и ведение журналов с помощью RAFT? Если да, то вы накатывали свою собственную или использовали одну из нескольких готовых библиотек?   -  person bdeetz    schedule 07.12.2014
comment
Нет, я еще не реализовал это. Было бы хорошо услышать ваш вариант использования, есть ли какая-нибудь ссылка, которой вы могли бы поделиться?   -  person coder_bro    schedule 08.12.2014


Ответы (1)


Ваша интуиция верна насчет объединения репликации и ведения журнала в компонент Raft. Но протокол Raft точно определяет, когда что-то нужно хранить на диске.

Вот два разных взгляда на это.

Я предполагаю, что перед репликацией не требуется больших вычислений, таких как обработка транзакций, потому что в ваших диаграммах их нет.

Лично я бы сделал первый, потому что он разделяет задачи на разные процессы. Если бы я реализовывал Raft для себя, я бы взял первую половину второго сценария и поместил его в отдельный процесс.

Внешняя репликация плота

В котором Raft реализуется внешним процессом.

Компонент репликации передает внешний процесс репликации на аутсорсинг. Через какое-то время Raft отвечает компоненту репликации, что он, по сути, реплицируется. Компонент репликации обновляет элементы в кольцевом буфере и перемещает опубликованный курсор вперед. Бизнес-логика видит опубликованный курсор (через waitFor) и использует только что реплицированные данные.

В этом сценарии компонент репликации, вероятно, имеет много событий в процессе обработки, поэтому его курсор чтения намного опережает курсор, который он публикует в бизнес-логике.

В этом сценарии нет необходимости в компоненте ведение журнала, потому что внешняя система raft выполняет ведение журнала за вас.

Обратите внимание, репликация может быть самым медленным компонентом системы!

Интегрированная репликация плота

В котором плот реализован в том же процессе, что и "Реальная бизнес-логика".

С точки зрения Raft, репликация является бизнес-логикой. На самом деле у вас есть несколько уровней бизнес-логики или, что то же самое, несколько этапов бизнес-логики.

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

Первый этап, как я уже упоминал, — это репликация Raft. События клиента поступают в прерыватель ввода репликации. Логика Raft собирает его, возможно, в пакетах, и отправляет последователям на прерывателе вывода репликации. Все сообщения Raft также попадают в Replication Input Disruptor. Логика Raft также улавливает их и отправляет соответствующие ответы соответствующим Последователям/Мастерам на Разрушителе вывода репликации).

Компонент журнала зависает от входного кольцевого буфера; он должен обрабатывать только определенные типы сообщений, как это продиктовано Raft. Вероятно, это будет самая медленная часть системы.

Когда данные считаются реплицированными, они перемещаются на второй этап с помощью прерывателя ввода «Real Business Logic». Там он обрабатывается, отправляется в Client Outbound Disruptor, а затем отправляется одному из ваших миллионов довольных платящих клиентов.

person Michael Deardeuff    schedule 14.06.2014