---
title: RAFT discussion
tags: Brainstorm
---
## RAFT discussion
*2021-08-25*
*Yaroslav Dynnikov, Sergey Petrenko*
> [color=#043f8c] :bulb: Disclaimer :bulb:
>
> Формат "вопрос - ответ" используется здесь только для наглядности, это НЕ цитаты участников встречи.
> Детали алгоритма актуальны для Tarantool 2.8
---
**Q: Рафт алгоритм хранит что-нибудь в спейсах?**
В спейсах нет, но в снапшоты и в WAL пишутся специальные системные таплы. В тарантуле есть два разных терма - терм синхры <= терм рафта.
1. Рафтовый терм и голос (как в `box.info.election`):
```yaml
HEADER:
lsn: 4
group_id: 1
type: RAFT
timestamp: 1629994924.9166
BODY:
0: 5 # raft_term
1: 2 # vote
```
replica_id отсутствует. Такой тапл ведёт себя как запись в локальный спейс и не репликацируется. LSN считается в нулевом компоненте вклока.
2. Владелец лимба (`box.info.synchro.owner`).
```yaml
HEADER:
lsn: 6
replica_id: 2
type: PROMOTE
timestamp: 1629995921.6833
BODY:
2: 2 # leader
3: 0 # lsn предыдущего владельца лимба
83: 6 # synchro_term
```
А вот этот очень даже реплицируется. И инкрементит `box.info.lsn`. Владелец лимба коммитится асинхронно со всеми потенциальными последствиями.
---
**Q: У транзакции есть терм?**
В самих таплах его нет, но т.к. в журнале есть терм синхры, то в каком-то смысле транзакцию можно увязать с термом. Это верно только для синхронных транзакций и только для терма синхры. Терм рафта локальный, и асинхронные транзакции на реплике и на мастере могут записаться как до, так и после начала нового рафт терма.
---
**Q: Кто-то говорил, что рафт и синхра - это независимые фичи. Но везде где можно, они упоминаются рука об руку. Где правда?**
Синхрой можно пользоваться без рафта, но админу самому придётся следить за владельцем лимба (`box.info.synchro.owner`).
Рафт почти можно обсуждать без синхры, но есть одно "но". После успешных выборов лидер в обязательном порядке бампает терм синхры и становится владельцем лимба. Это аффектит `ro` всех инстансов, даже с election_mode off. Подробнее об этом ниже.
---
**Q: Даёт ли рафт какие-то доп гарантии если у меня 0 синхронных спейсов?**
В целом нет. Единственное что даёт рафт - это автопереключение `box.info.ro`. Поэтому конфликт репликации поймать сложнее. Но на перевыборах во время шторма всё ещё можно. :-)
---
**Q: Рафт работает только в фулмеш репликации. Какие бывают последствия поломки фулмеша?**
Невозможно стать лидером. ReqestVote отправляет релей кандидата. А ответ - релей голосующего. Если репликация в одну сторону поломалась, то набрать кворум будет сложнее. У кого нет м-м звезды, тому корона лидера не светит.
---
**Q: Что произойдёт с рафтом, если в репликасете окажутся старые инстансы. 1.10 например.**
Сам рафт в адрес старых инстансов никакие служебные сообщения не отправляет, но транцакция PROMOTE реплицируется. Старый инстанс, увидев такую, остановит репликацию. Так что никакого рафта (и никакой синхры), пока весь кластер не обновлён.
---
**Q: Как отключить рафт насовсем?**
Нужно сделать две вещи:
1. `box.cfg({election_mode = 'off'})`
Отключить автовыборы. Не-лидеры останутся read-only так как лидер владеет лимбом.
2. `box.ctl.demote()`
Удалить владельца лимба.
```lua
if box.cfg.read_only then
ro = true
elseif box.info.synchro.queue.owner ~= 0
and box.info.synchro.queue.owner ~= self then
ro = true
elseif election_mode ~= 'off'
and box.info.election.state ~= 'leader' then
ro = true
else
ro = false
end
```
P.S. Писать в синхронные спейсы может только владелец лимба.
---
**Q: Как правильно считать кворум? Ведь инстансы с election_mode off не участвуют в голосовании.**
Не надо комбинировать off и не off в одном репликасете. Для рафта дествительно было бы правильно сказать, что quorum = N(voter+candidate)/2 + 1, но если в репликасете есть синхронные спейсы, то подтверждать их будут все инстансы. В итоге либо рафт рискует остаться без кворума, либо синхра сможет сплитбрейнуться.
---
**Q: Системные спейсы синхронные?**
Нет. По дефолту ни одного синхронного спейса нет.
---
**Q: Что будет если follower начнет новый терм пока мастер жив?**
1. Если он отстал, то никто за него не проголосует.
2. Но мастер станет кандидатом и станет read-only.
Это настоящая штормовая угроза. Как с мембершипом была, только теперь с рафтом.
---
**Q: Настройка кворума не кластервайд?**
Нет, поэтому всегда прописывайте кворум формулой 'N/2 + 1' на всех инстансах.
<!--
https://github.com/tarantool/examples/tree/master/cookbook/synchro
## Cartridge + RAFT = :heart:
- New replicaset flag: `raft = true`.
- Incompatible with `all_rw = true`.
- All instances use `election_mode = 'candidate'`, `replication_synchro_quorum = math.ceil(N/2)`
- Leader monitoring for the WebUI.
- Leader monitoring for RPC.
- -->