--- 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. - -->