diff --git a/docs/architecture/raft_failover.md b/docs/architecture/raft_failover.md index c5955ae39d1e27bbf7bb2ad0ad25438526cc8f60..02c25c9ce0ccc301dc227e21aca5249f33cdd7b9 100644 --- a/docs/architecture/raft_failover.md +++ b/docs/architecture/raft_failover.md @@ -1,67 +1,67 @@ -# Raft и отказоуÑтойчивоÑÑ‚ÑŒ - -Raft — алгоритм Ð´Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡ конÑенÑуÑа в Ñети ненадёжных -вычиÑлений. Ð’ Picodata Ñтот алгоритм применÑетÑÑ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ -глобальных таблиц и вÑей конфигурации клаÑтера (топологии, Ñхемы данных -и другой информации). Raft обеÑпечивает ÑоглаÑованноÑÑ‚ÑŒ данных на вÑех -инÑтанÑах клаÑтера. - -Raft предполагает, что в клаÑтере вÑегда ÑущеÑтвует Ñвно выделенный -лидер (`leader`). Только он отправлÑет новые запиÑи на другие узлы -клаÑтера. ЕÑли обычный узел (`follower`) долго не получает Ñообщений от -лидера, то он переходит в ÑоÑтоÑние "кандидат" (`candidate`) и проводит -процедуру голоÑованиÑ. - -## ДинамичеÑкое переключение голоÑующих узлов в Raft (Raft voter failover) {: #raft-voter-failover } - -Ð’Ñе узлы Raft в клаÑтере делÑÑ‚ÑÑ Ð½Ð° два типа: голоÑующие (`voter`) и -неголоÑующие (`learner`). За конÑиÑтентноÑÑ‚ÑŒ raft-группы отвечают только -первые. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи требуетÑÑ Ñобрать кворум из `N/2 + -1` голоÑующих узлов. ÐеголоÑующие узлы в кворуме не учаÑтвуют и вÑегда -находÑÑ‚ÑÑ Ð² ÑоÑтоÑнии "follower". - -Чтобы Ñохранить Ð±Ð°Ð»Ð°Ð½Ñ Ð¼ÐµÐ¶Ð´Ñƒ надежноÑтью клаÑтера и удобÑтвом его -ÑкÑплуатации, в Picodata предуÑмотрено автоматичеÑкое раÑпределение -голоÑующих узлов. КоличеÑтво голоÑующих узлов в клаÑтере не наÑтраиваетÑÑ -и завиÑит только от общего количеÑтва инÑтанÑов: - -- 1 инÑÑ‚Ð°Ð½Ñ â€” 1 голоÑующий узел; -- 2 инÑтанÑа — 2 голоÑующих узла; -- 3 или 4 инÑтанÑа — 3 голоÑующих узла; -- 5 и более инÑтанÑов — 5 голоÑующих узлов; - -ЕÑли один из голоÑующих узлов ÑтановитÑÑ Ð½ÐµÐ´Ð¾Ñтупным -или прекращает работу (что может нарушить кворум в Raft), то тип `voter` -автоматичеÑки приÑваиваетÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñƒ из доÑтупных неголоÑующих узлов. -Переключение проиÑходит незаметно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. - -## Пример раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñующих узлов - -Приведем пример клаÑтера Ñ Ð¾Ð´Ð½Ð¸Ð¼ уровнем раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð² между -локациÑми. ПуÑÑ‚ÑŒ Ñто будет два датацентра (`MSK`, `SPB`) и Ñ‚Ñ€ÐµÑ‚ÑŒÑ -Ð»Ð¾ÐºÐ°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð°Ñ€Ð±Ð¸Ñ‚Ñ€Ð°Ð¶Ð° (решающего голоÑа в Ñлучае потери Ñетевой -ÑвÑзноÑти между датацентрами). Вне завиÑимоÑти от общего чиÑла узлов в -клаÑтере предполагаетÑÑ Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ðµ вÑего 5 голоÑующих узлов, которые, в -данном Ñлучае, раÑпределÑÑ‚ÑÑ Ñ‚Ð°Ðº: - -- 2 в локации `MSK`; -- 2 в локации `SPB`; -- 1 в третьей локации. - -ЕÑли веÑÑŒ датацентр в локации `SPB` терÑет доÑтупноÑÑ‚ÑŒ и ÑвÑзь Ñ Ð°Ñ€Ð±Ð¸Ñ‚Ñ€Ð¾Ð¼, -то его 2 голоÑующих узла перемещаютÑÑ Ð² датацентр локации `MSK`. При -воÑÑтановлении ÑвÑзноÑти, голоÑующие узлы возвращаютÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ и -иÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð²Ð¾ÑÑтанавливаетÑÑ. - -Ð’ Ñлучае, еÑли лишь отдельный Ñервер Ñ Ð³Ð¾Ð»Ð¾Ñующим узлом в `SPB` терÑет -ÑвÑзь, то право голоÑа перемещаетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ локации, Ñ‚.е. переходит к -другому узлу в `SPB`. ЕÑли Ñервер воÑÑтанавливает ÑвÑзь, то он уже не -Ñтанет автоматичеÑки голоÑующим, Ñ‚.к. Ñхема раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ðµ будет Ñтого -требовать. - -См. также: - -- [Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¸ зоны доÑтупноÑти](../tutorials/deploy_on_hosts.md#failure-domains) - ---- -[ИÑходный код Ñтраницы](https://git.picodata.io/picodata/picodata/docs/-/blob/main/docs/architecture/raft_failover.md) +# Raft и отказоуÑтойчивоÑÑ‚ÑŒ + +Raft — алгоритм Ð´Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡ конÑенÑуÑа в Ñети ненадёжных +вычиÑлений. Ð’ Picodata Ñтот алгоритм применÑетÑÑ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ +глобальных таблиц и вÑей конфигурации клаÑтера (топологии, Ñхемы данных +и другой информации). Raft обеÑпечивает ÑоглаÑованноÑÑ‚ÑŒ данных на вÑех +инÑтанÑах клаÑтера. + +Raft предполагает, что в клаÑтере вÑегда ÑущеÑтвует Ñвно выделенный +лидер (`leader`). Только он отправлÑет новые запиÑи на другие узлы +клаÑтера. ЕÑли обычный узел (`follower`) долго не получает Ñообщений от +лидера, то он переходит в ÑоÑтоÑние "кандидат" (`candidate`) и проводит +процедуру голоÑованиÑ. + +## ДинамичеÑкое переключение голоÑующих узлов в Raft (Raft voter failover) {: #raft-voter-failover } + +Ð’Ñе узлы Raft в клаÑтере делÑÑ‚ÑÑ Ð½Ð° два типа: голоÑующие (`voter`) и +неголоÑующие (`learner`). За конÑиÑтентноÑÑ‚ÑŒ raft-группы отвечают только +первые. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи требуетÑÑ Ñобрать кворум из `N/2 + +1` голоÑующих узлов. ÐеголоÑующие узлы в кворуме не учаÑтвуют и вÑегда +находÑÑ‚ÑÑ Ð² ÑоÑтоÑнии "follower". + +Чтобы Ñохранить Ð±Ð°Ð»Ð°Ð½Ñ Ð¼ÐµÐ¶Ð´Ñƒ надежноÑтью клаÑтера и удобÑтвом его +ÑкÑплуатации, в Picodata предуÑмотрено автоматичеÑкое раÑпределение +голоÑующих узлов. КоличеÑтво голоÑующих узлов в клаÑтере не наÑтраиваетÑÑ +и завиÑит только от общего количеÑтва инÑтанÑов: + +- 1 инÑÑ‚Ð°Ð½Ñ â€” 1 голоÑующий узел; +- 2 инÑтанÑа — 2 голоÑующих узла; +- 3 или 4 инÑтанÑа — 3 голоÑующих узла; +- 5 и более инÑтанÑов — 5 голоÑующих узлов; + +ЕÑли один из голоÑующих узлов ÑтановитÑÑ Ð½ÐµÐ´Ð¾Ñтупным +или прекращает работу (что может нарушить кворум в Raft), то тип `voter` +автоматичеÑки приÑваиваетÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñƒ из доÑтупных неголоÑующих узлов. +Переключение проиÑходит незаметно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. + +## Пример раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñующих узлов + +Приведем пример клаÑтера Ñ Ð¾Ð´Ð½Ð¸Ð¼ уровнем раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð² между +локациÑми. ПуÑÑ‚ÑŒ Ñто будет два датацентра (`MSK`, `SPB`) и Ñ‚Ñ€ÐµÑ‚ÑŒÑ +Ð»Ð¾ÐºÐ°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð°Ñ€Ð±Ð¸Ñ‚Ñ€Ð°Ð¶Ð° (решающего голоÑа в Ñлучае потери Ñетевой +ÑвÑзноÑти между датацентрами). Вне завиÑимоÑти от общего чиÑла узлов в +клаÑтере предполагаетÑÑ Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ðµ вÑего 5 голоÑующих узлов, которые, в +данном Ñлучае, раÑпределÑÑ‚ÑÑ Ñ‚Ð°Ðº: + +- 2 в локации `MSK`; +- 2 в локации `SPB`; +- 1 в третьей локации. + +ЕÑли веÑÑŒ датацентр в локации `SPB` терÑет доÑтупноÑÑ‚ÑŒ и ÑвÑзь Ñ Ð°Ñ€Ð±Ð¸Ñ‚Ñ€Ð¾Ð¼, +то его 2 голоÑующих узла перемещаютÑÑ Ð² датацентр локации `MSK`. При +воÑÑтановлении ÑвÑзноÑти, голоÑующие узлы возвращаютÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ и +иÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð²Ð¾ÑÑтанавливаетÑÑ. + +Ð’ Ñлучае, еÑли лишь отдельный Ñервер Ñ Ð³Ð¾Ð»Ð¾Ñующим узлом в `SPB` терÑет +ÑвÑзь, то право голоÑа перемещаетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ локации, Ñ‚.е. переходит к +другому узлу в `SPB`. ЕÑли Ñервер воÑÑтанавливает ÑвÑзь, то он уже не +Ñтанет автоматичеÑки голоÑующим, Ñ‚.к. Ñхема раÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ðµ будет Ñтого +требовать. + +См. также: + +- [Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¸ зоны доÑтупноÑти](../tutorials/deploy_on_hosts.md#failure-domains) + +--- +[ИÑходный код Ñтраницы](https://git.picodata.io/picodata/picodata/docs/-/blob/main/docs/architecture/raft_failover.md)