From 3bcfae22ae56e921ff83ab2eb0c0910e30b245d6 Mon Sep 17 00:00:00 2001 From: Yaroslav Dynnikov <yaroslav.dynnikov@gmail.com> Date: Mon, 23 Jan 2023 18:03:03 +0300 Subject: [PATCH] doc: enhance clustering.md --- docs/clustering.md | 65 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/docs/clustering.md b/docs/clustering.md index 526cdb9dd9..81cd32bccf 100644 --- a/docs/clustering.md +++ b/docs/clustering.md @@ -1,7 +1,7 @@ # ÐžÐ±Ñ‰Ð°Ñ Ñхема инициализации клаÑтера -Данный раздел Ñодержит опиÑание архитектуры Picodata, в том чиÑле +Данный раздел Ñодержит опиÑание архитектуры Picodata, а конкретно — выÑокоуровневый процеÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ клаÑтера на оÑнове неÑкольких -отдельно запущенных ÑкземплÑров Picodata (инÑтанÑов). +отдельно запущенных ÑкземплÑров (инÑтанÑов) Picodata. ÐдминиÑтратор запуÑкает неÑколько инÑтанÑов, Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ñ Ð² качеÑтве аргументов необходимые параметры: @@ -37,13 +37,16 @@ picodata run --instance-id iN --listen iN --peer i1  +Ð’ контекÑте операционных ÑиÑтем каждый инÑÑ‚Ð°Ð½Ñ ÑоответÑтвует группе из +двух процеÑÑов — родительÑого (supervisor) и дочернего (именно он +выполнÑет tarantool runtime). + КраÑным показан родительÑкий процеÑÑ, который запущен на вÑем протÑжении жизненного цикла инÑтанÑа. Ð’ÑÑ Ð»Ð¾Ð³Ð¸ÐºÐ°, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº клаÑтеру, и Ð·Ð°ÐºÐ°Ð½Ñ‡Ð¸Ð²Ð°Ñ Ð¾Ð±Ñлуживанием клиентÑких запроÑов, проиÑходит в дочернем процеÑÑе (голубой цвет). ЕдинÑтвенное предназначение -родительÑкого процеÑÑа — иметь возможноÑÑ‚ÑŒ ÑброÑить ÑоÑтоÑние дочернего -(выполнить rebootstrap) и инициализировать его повторно (Ñиреневый -цвет). +родительÑкого процеÑÑа — выполнÑÑ‚ÑŒ [ребутÑтрап](#РебутÑтрап) и +инициализировать дочерний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ (Ñиреневый цвет). Ð”Ð°Ð½Ð½Ð°Ñ Ñхема наиболее полно отражает логику кода в файле `main.rs`. Ðиже опиÑаны детали Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñтапа и ÑоответÑтвующей программной @@ -54,11 +57,35 @@ picodata run --instance-id iN --listen iN --peer i1 Ðа Ñтом Ñтапе проиÑходит ветвление (форк) процеÑÑа `picodata`. РодительÑкий процеÑÑ (supervisor) ожидает от дочернего процеÑÑа ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ механизму IPC и при необходимоÑти перезапуÑкает дочерний -процеÑÑ. Также, при необходимоÑти дочерний процеÑÑ Ð¼Ð¾Ð¶ÐµÑ‚ попроÑить -Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе файлы БД, Ñ‚.е. вызвать функцию `drop_db()`. Ðто -может понадобитьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð¹ инициализации клаÑтера когда, например, -у инÑтанÑа изначально имеетÑÑ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¹, Ñлучайно Ñгенерированный -`replicaset_id`. +процеÑÑ. + +Выполнение дочернего процеÑÑа начинаетÑÑ Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° функции +[`start_discover()`](#fn-start_discover) и далее Ñледует алгоритму. При +необходимоÑти дочерний процеÑÑ Ð¼Ð¾Ð¶ÐµÑ‚ попроÑить Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ вÑе +файлы БД (Ñм. раздел ["РебутÑтрап"](#РебутÑтрап)). Ðто иÑпользуетÑÑ Ð´Ð»Ñ +повторной инициализации инÑтанÑа Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¼ `replicaset_uuid` вмеÑто +рандомного. + +### РебутÑтрап + +У тарантула еÑÑ‚ÑŒ две оÑобенноÑти, из-за которых процеÑÑ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ +выглÑдит так как выглÑдит: + +1. ПринадлежноÑÑ‚ÑŒ инÑтанÑа тому или иному репликаÑету определÑетÑÑ Ð² + момент первого вызова `box.cfg()` когда ÑоздаетÑÑ Ð¿ÐµÑ€Ð²Ñ‹Ð¹ Ñнапшот. + ВпоÑледÑтии изменить принадлежноÑÑ‚ÑŒ репликаÑету невозможно. +2. Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ iproto Ñервера, реализующего бинарный Ñетевой протокол + тарантула, выполнÑетÑÑ Ñ‚Ð¾Ð¹ же функцией `box.cfg()`. + +Ð’ ÑовокупноÑти Ñти две оÑобенноÑти Ñоздают проблему курицы и Ñйца: + +- ИнÑÑ‚Ð°Ð½Ñ Ð½Ðµ может общатьÑÑ Ð¿Ð¾ Ñети, пока не узнает принадлежноÑÑ‚ÑŒ + репликаÑету. +- ПринадлежноÑÑ‚ÑŒ репликаÑету невозможно узнать без Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñети. + +Чтобы Ñту проблему решить, Picodata инициализируетÑÑ Ñо Ñлучайно +Ñгенерированными идентификаторами, а позже перезапуÑкает процеÑÑ, +попутно Ð¾Ñ‡Ð¸Ñ‰Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÑƒÑŽ директорию. ### fn start_discover() @@ -70,11 +97,11 @@ picodata run --instance-id iN --listen iN --peer i1 discovery не будет, инÑÑ‚Ð°Ð½Ñ Ñразу перейдет к Ñтапу `postjoin()`. Ð’ противном Ñлучае, еÑли меÑто инÑтанÑа в клаÑтере еще не извеÑтно, алгоритм discovery определÑет значение флага `i_am_bootstrap_leader` и -Ð°Ð´Ñ€ÐµÑ Ð»Ð¸Ð´ÐµÑ€Ð° Raft-группы. Далее инÑÑ‚Ð°Ð½Ñ ÑбраÑывает Ñвое ÑоÑтоÑние (Ñтап -rebootstrap), чтобы повторно провеÑти инициализацию `box.cfg()`, теперь -уже Ñ Ð¸Ð·Ð²ÐµÑтными параметрами. Сам лидер (единÑтвенный Ñ -`i_am_bootstrap_leader == true`) выполнÑет функцию `start_boot()`. -ОÑтальные инÑтанÑÑ‹ переходÑÑ‚ к функции `start_join()`. +Ð°Ð´Ñ€ÐµÑ Ð»Ð¸Ð´ÐµÑ€Ð° Raft-группы. Далее инÑÑ‚Ð°Ð½Ñ ÑбраÑывает Ñвое ÑоÑтоÑние (Ñм. +["РебутÑтрап"](#РебутÑтрап)), чтобы повторно провеÑти инициализацию +`box.cfg()`, теперь уже Ñ Ð¸Ð·Ð²ÐµÑтными параметрами. Сам лидер +(единÑтвенный Ñ `i_am_bootstrap_leader == true`) выполнÑет функцию +`start_boot()`. ОÑтальные инÑтанÑÑ‹ переходÑÑ‚ к функции `start_join()`. ### fn start_boot() @@ -89,10 +116,10 @@ rebootstrap), чтобы повторно провеÑти инициализа ### fn start_join() -Вызову функции `start_join()` вÑегда предшеÑтвует rebootstrap (удаление -БД и перезапуÑк процеÑÑа), поÑтому на данном Ñтапе в БД нет ни Ð¼Ð¾Ð´ÑƒÐ»Ñ -`box`, ни проÑтранÑтва хранениÑ. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ `start_join()` имеет проÑтое -уÑтройÑтво: +Вызову функции `start_join()` вÑегда предшеÑтвует +[ребутÑтрап](#РебутÑтрап) (удаление вÑех данных и перезапуÑк процеÑÑа), +поÑтому на данном Ñтапе в БД нет ни Ð¼Ð¾Ð´ÑƒÐ»Ñ `box`, ни проÑтранÑтва +хранениÑ. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ `start_join()` имеет проÑтое уÑтройÑтво: ИнÑтанÑ-клиент отправлÑет Ð·Ð°Ð¿Ñ€Ð¾Ñ `raft_join` лидеру Raft-группы (он извеÑтен поÑле discovery). ПоÑле доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑенÑуÑа в Raft-группе -- GitLab