diff --git a/docs/clustering.md b/docs/clustering.md index 326f005782799fd8865ce8b18d633f3c8cefd585..84e45cca6442628f1a32c7b32d29ef7ac61daab6 100644 --- a/docs/clustering.md +++ b/docs/clustering.md @@ -114,14 +114,14 @@ struct Peer { - `JoinRequest` отправлÑет вÑегда неинициализированный инÑтанÑ. - Ð’ завиÑимоÑти от того, ÑодержитÑÑ Ð»Ð¸ в запроÑе `instance_id`, проводитÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· его корректноÑти (уникальноÑти). - Ð’ процеÑÑе обработки запроÑа в Raft-журнал добавлÑетÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ `op::PersistPeer{ peer }`, который помимо вÑевозможных айдишников Ñодержит поле `health: Loading`, которое играет важную роль в обеÑпечении надежноÑти клаÑтера. [TODO](## "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² коде Online вмеÑто Loading, но Ñто надо иÑправить.") -- Обработка запроÑа также включает в ÑÐµÐ±Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ инÑтанÑа в Raft-группу в роли `Learner` (процедура также извеÑÑ‚Ð½Ð°Ñ ÐºÐ°Ðº `raft::ConfChangeV2`). Raft не позволÑет изменÑÑ‚ÑŒ топологию, пока предыдущее изменение не было применено. ПоÑтому в целÑÑ… оптимизации обработка идет в отдельном потоке (Ñ‚.н. `conf_change_loop`) и выполнÑетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ð°Ð¼Ð¸. +- Обработка запроÑа также включает в ÑÐµÐ±Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ инÑтанÑа в Raft-группу в роли `Learner` (процедура также извеÑÑ‚Ð½Ð°Ñ ÐºÐ°Ðº `raft::ConfChangeV2`). Raft не позволÑет изменÑÑ‚ÑŒ топологию, пока предыдущее изменение не было применено. ПоÑтому в целÑÑ… оптимизации обработка идет в отдельном потоке (Ñ‚.н. `raft_conf_change_loop`) и выполнÑетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ð°Ð¼Ð¸. - Прежде чем отвечать на запроÑ, инÑÑ‚Ð°Ð½Ñ Ð´Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ‚ÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ конфигурации. Ðто произойдет поÑле того как он выйдет из ÑоÑтоÑÐ½Ð¸Ñ `joint state` ([подробнее](https://web.stanford.edu/~ouster/cgi-bin/papers/OngaroPhD.pdf), §4.3). [TODO](## "Ñтот Ñ‚ÐµÐ·Ð¸Ñ Ð² коде пока не реализован") - Ð’ ответ выдаётÑÑ Ð²Ñегда новый `raft_id`, никому другому ранее не принадлежавший. - Генерировать значение `raft_id` может только лидер Raft-группы. Ожидание `ConfChangeV2` лидерÑтва не требует. - Помимо вÑевозможных идентификаторов, ответ Ñодержит ÑпиÑок голоÑующих членов Raft-группы. Они понадобÑÑ‚ÑÑ Ð½Ð¾Ð²Ð¾Ð¼Ñƒ инÑтанÑу чтобы знать адреÑа ÑоÑедей и нормально Ñ Ð½Ð¸Ð¼Ð¸ общатьÑÑ. - Также ответ Ñодержит параметр `box_replication`, который требуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ наÑтройки репликации. -# Логика conf_change_loop +# Логика raft_conf_change_loop Ð’Ñе узлы Raft в клаÑтере делÑÑ‚ÑÑ Ð½Ð° два типа: голоÑующие (`voter`) и неголоÑующие (`learner`). Ðа каждом инÑтанÑе клаÑтера приÑутÑтвует поток, управлÑющий конфигурацией Raft-группы (ÑоÑтавом `voters` / `learners`). Реальные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼ не менее может генерировать только лидер, на оÑтальных инÑтанÑах Ñтот поток Ñпит и ничего не делает. @@ -163,4 +163,4 @@ struct Peer { - ИнÑÑ‚Ð°Ð½Ñ Ð½Ðµ должен оÑтаватьÑÑ Ð²Ð¾ÑƒÑ‚ÐµÑ€Ð¾Ð¼, пока еÑÑ‚ÑŒ другие онлайн кандидаты. - ИнÑÑ‚Ð°Ð½Ñ Ð½Ðµ должен оÑтаватьÑÑ Ð»Ð¸Ð´ÐµÑ€Ð¾Ð¼. -Чтобы Ñтого добитьÑÑ, каждый инÑÑ‚Ð°Ð½Ñ Ð½Ð° `on_shutdown` триггер отправлÑет лидеру Ð·Ð°Ð¿Ñ€Ð¾Ñ `UpdatePeerRequest{ health: Offline }`. ÐепоÑредÑтвенно изменением роли `voter` -> `learner` занимаетÑÑ Ð¾Ñ‚Ð´ÐµÑŒÐ½Ñ‹Ð¹ поток на лидере (тот Ñамый `conf_change_loop`), инÑÑ‚Ð°Ð½Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ дожидаетÑÑ ÐµÐ³Ð¾ применениÑ. +Чтобы Ñтого добитьÑÑ, каждый инÑÑ‚Ð°Ð½Ñ Ð½Ð° `on_shutdown` триггер отправлÑет лидеру Ð·Ð°Ð¿Ñ€Ð¾Ñ `UpdatePeerRequest{ health: Offline }`. ÐепоÑредÑтвенно изменением роли `voter` -> `learner` занимаетÑÑ Ð¾Ñ‚Ð´ÐµÑŒÐ½Ñ‹Ð¹ поток на лидере (тот Ñамый `raft_conf_change_loop`), инÑÑ‚Ð°Ð½Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ дожидаетÑÑ ÐµÐ³Ð¾ применениÑ.