diff --git a/docs/clustering.md b/docs/clustering.md index abaf2a3001e97559dd5c99ba6ed081ae19158276..326f005782799fd8865ce8b18d633f3c8cefd585 100644 --- a/docs/clustering.md +++ b/docs/clustering.md @@ -133,6 +133,29 @@ struct Peer { КоличеÑтво голоÑующих узлов в клаÑтере не наÑтраиваетÑÑ Ð¸ завиÑит только от общего количеÑтва инÑтанÑов. ЕÑли инÑтанÑов 1 или 2, то голоÑующий узел один. [TODO](## "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² клаÑтере из 2 инÑтанÑов оба делаютÑÑ Ð³Ð¾Ð»Ð¾Ñующими. Ðадо проработать аргументацию и решить как правильно."). ЕÑли инÑтанÑов 3 или 4, то таких узлов три. Ð”Ð»Ñ ÐºÐ»Ð°Ñтера Ñ 5 или более инÑтанÑами — пÑÑ‚ÑŒ голоÑующих узлов. + +# Пару Ñлов об обработке запиÑей Raft-журнала + +Стейт-машину каждой отдельной запиÑи в Raft-журнале можно опиÑать так: + +```md +`Persisted` → `Committed` → `Applied` +``` + +При добавлении в журнал (по правилам Ñто делает лидер) запиÑÑŒ получает ÑÑ‚Ð°Ñ‚ÑƒÑ `Persisted` и начинает реплицироватьÑÑ (Ñто аÑинхронно делает файбер `raft_main_loop` ). Когда кворум узлов подтвеждает перÑиÑтентноÑÑ‚ÑŒ запиÑи, она ÑчитаетÑÑ Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ‡ÐµÐ½Ð½Ð¾Ð¹. Важно понимать, что ÑÑ‚Ð°Ñ‚ÑƒÑ `Committed` приÑваетÑÑ Ð·Ð°Ð¿Ð¸Ñи на оÑнове Ñовокупной полученной информации, а не какого-то конкретного дейÑтвиÑ. + +Конкретные дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾ оработке той или иной запиÑи выполнÑет отдельный поток `raft_applier` ([TODO](## "Пока что отдельного потока нет, но лучше бы был")). Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи он выполнÑет обработчик `Op::on_commit()` и по завершении приÑваевает запиÑи ÑÑ‚Ð°Ñ‚ÑƒÑ `Applied`. Важно помнить, что обновление ÑтатуÑа и Ñама Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ выполнÑÑ‚ÑŒÑÑ Ð½Ðµ атоманро (еÑли в `Op::on_commit()` проиÑходит передача ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼Ñƒ потоку - yield). Ð’ таком Ñлучае, Ñледует позаботитьÑÑ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ об идемпотентноÑти операции. + +Схема ниже поможет Ñту информацию переварить. + + + +Стоит также помнить, что алгоритм Raft гарантирует лишь конÑиÑтентноÑÑ‚ÑŒ поÑледовательноÑти запиÑей, но ничего не говорит о конкретных моментах времени. Смена ÑтатуÑов на разных инÑтанÑах так или иначе проиÑходит в разные моменты времнени, и иногда Ñту очередноÑÑ‚ÑŒ приходитÑÑ ÑƒÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ñ‚ÑŒ в алгоритмах. + +# Кто и когда выполнÑет box.cfg и vshard.cfg? + +Отличный вопроÑ. Ответ на него нам предÑтоит найти. + # Graceful shutdown Чтобы выключение прошло штатно и не имело негативных поÑледÑтвий необходимо Ñледующее: diff --git a/docs/raft_log.svg b/docs/raft_log.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ab4e0637dca95c1b94f995ddf2e26c9c2362d77 Binary files /dev/null and b/docs/raft_log.svg differ diff --git a/docs/raft_log_curves.svg b/docs/raft_log_curves.svg new file mode 100644 index 0000000000000000000000000000000000000000..747d3ebf8b2f7f52e1a4360b82b7c84d57a7c1b9 Binary files /dev/null and b/docs/raft_log_curves.svg differ