Управление топологией¶
Общие сведения¶
Топологией кластера в Picodata называется совокупность конфигураций инстансов и репликасетов, связей между ними, их состояний относительно друг друга. Picodata хранит эту информацию в глобальных таблицах, содержимое которых реплицируется на все узлы посредством алгоритма Raft.
Важной составляющей топологии является информация о грейдах всех
узлов. Данный термин является специфичным для Picodata. Он отражает не
состояние самого инстанса, а конфигурацию остальных участников кластера
по отношению к нему. Существуют две разновидности грейдов: текущий
(current_grade
) и целевой (target_grade
).
Управление топологией в Picodata происходит за счет последовательного
изменения грейдов: сначала меняется значения target_grade
,
затем это значение задается в current_grade
.
Изменение target_grade
происходит в следующих ситуациях:
- запуск инстанса (
target_grade = Online
) - штатное выключение инстанса (
target_grade = Offline
) - аварийное переключение (
target_grade = Offline
) - удаление инстанса из кластера (
target_grade = Expelled
)
Конфигурацией инстансов и обновлением current_grade
централизованно
управляет raft-лидер. По мере
появления изменений target_grade
, он применяет изменения к остальным
инстансам кластера (к каждому в отдельности) и обновляет
current_grade
. Реализует эту логику компонент governor
.
Изменить current_grade
может только лидер при поддержке кворума, что
гарантирует консистентность принятого решения (и поддерживает доверие к
системе в плане отказоустойчивости).
Все изменения грейдов в кластере регистрируются в журнале аудита.
Сценарии управления топологией¶
Присоединение (joining) инстанса к кластеру¶
Добавление нового инстанса в работающий кластер происходит по следующему сценарию:
- Администратор лично или средствами автоматизации запускает новый инстанс командой picodata run
- Инстанс определяет, что рабочие файлы инстанса в начале жизненного цикла отсутствуют
- Инстанс выполняет алгоритм discovery — связывается с другими узлами из параметра picodata run --peer и определяет адрес текущего raft-лидера
- Инстанс отправляет raft-лидеру запрос proc_raft_join, содержащий
- его сетевой адрес
advertise_address
- домен отказа
failure_domain
- тир
tier
- также, опционально можно явно передать
instance_id
,replicaset_id
- его сетевой адрес
- raft-лидер, получив этот запрос, выполняет ряд транзакций в глобальные
таблицы:
- если переданного тира нет в таблице
_pico_tier
, запрос отклоняется - если требуется,
INSERT ... INTO _pico_replicaset
- если
instance_id
передан явно и уже добавлен в кластер, проверяет возможность автоматически его удалить - генерирует
raft_id
для инстанса, никому другому ранее не принадлежавший - инициализирует
current/target_grade = Offline
INSERT ... INTO _pico_peer_address
INSERT ... INTO _pico_instance
- если переданного тира нет в таблице
- инстанс инициализирует локальную БД и актуализирует свое состояние относительно других реплик
Штатное выключение инстанса¶
Чтобы выключение инстанса прошло штатно и не имело негативных последствий, Picodata обеспечивает соблюдение следующих условий:
- инстанс не должен оставаться голосующим, если можно его заменить другим
- инстанс не должен оставаться raft-лидером
При срабатывании триггера on_shutdown
инстанс сначала отправляет
лидеру запрос на изменение target_grade = Offline
. Завершение работы
происходит после того, как будет применено соответствующее изменение
current_grade
.
Максимальное время ожидания составляет 3 с и не настраивается. По истечении времени инстанс в любом случае завершает свою работу.
Аварийное переключение¶
За обслуживание отказов инстансов также отвечает raft-лидер. Суть
механизма сводится к тому, что отдельный компонент sentinel
при
обнаружении отказа инициирует изменение target_grade = Offline
.
Критерием отказа является невозможность доставки raft-сообщений в течение 5 секунд.
Дальнейшие действия по выводу инстанса из эксплуатации выполняет
governor
.
Governor — централизованное управление кластером¶
Большинство механизмов, связанных с отказоустойчивостью в Picodata, так или иначе связаны с компонентом governor. С технической точки зрения governor — это поток управления (fiber), всегда выполняющийся на raft-лидере. Дальше перечислены ответственности губернатора.
Автоматическое переключение узлов, голосующих в raft¶
Governor следит за выполнение ограничений, описанных здесь.
Применение изменений кластерной схемы данных¶
Governor гарантирует отказоустойчивость изменений кластерной схемы данных. Подробнее алгоритм описан здесь.