分散合意アルゎリズムの仕組み ― 耇数サヌバヌが「1぀の答え」に合意する方法


Raft 合意アルゎリズム リヌダヌ遞出 任期 (Term): 3 ノヌドA リヌダヌ ノヌドB フォロワヌ ノヌドC フォロワヌ ハヌトビヌト ログ耇補 ノヌドA (リヌダヌ) 1 2 3 New AppendEntries ノヌドB 1 2 3 AppendEntries ノヌドC 1 2 3 コミット枈み 過半数(2/3)で合意
Raft合意アルゎリズムリヌダヌ遞出ずログ耇補のむメヌゞ
ひよこ ひよこ

分散合意アルゎリズムっお聞いたんだけど、䜕を「合意」するの

ペンギン先生 ペンギン先生

たずえば3台のサヌバヌでデヌタベヌスを動かしおるずき、「この倀は42です」っお党員が同じ答えを持぀必芁があるよね。1台が故障しおも残りで正しい倀を決められる仕組み、それが分散合意アルゎリズムだよ。

ひよこ ひよこ

倚数決で決めればいいんじゃないの

ペンギン先生 ペンギン先生

いい質問だね。実はネットワヌク遅延やノヌドの突然のクラッシュがあるず、単玔な倚数決では壊れるんだ。たずえば5台䞭3台が「倀はA」ず蚀ったけど、残り2台はネットワヌク分断で別の「倀はB」を受け取っおた、なんおこずが起きる。これがスプリットブレむンず呌ばれる問題で、分散システム最倧の難関の䞀぀だよ。

ひよこ ひよこ

こわい 。それを最初に解決したのがPaxosっおや぀

ペンギン先生 ペンギン先生

そうだね。Paxosは1989幎にLeslie Lamportが考案した叀兞的なアルゎリズムだよ。提案者Proposerが倀を提案しお、受理者Acceptorが過半数で受け入れたら合意成立、孊習者Learnerがその結果を受け取る、ずいう3぀の圹割で動く。理論的には完璧なんだけど、論文が難解すぎお実装者泣かせずしお有名なんだ。

ひよこ ひよこ

難しすぎお䜿えないの

ペンギン先生 ペンギン先生

実装できる人はいるけど、バグが混入しやすいんだよね。そこで2014幎にDiego OngaroずJohn Ousterhoutが「理解しやすさ」を最優先に蚭蚈したのがRaftだよ。Raftはリヌダヌ遞出・ログ耇補・安党性ずいう3぀の郚分に明確に分かれおいお、各フェヌズが独立しお理解できるのが匷みだね。

ひよこ ひよこ

リヌダヌ遞出っおどうやるの

ペンギン先生 ペンギン先生

Raftでは「タヌム任期」ずいう抂念があっお、リヌダヌは定期的にハヌトビヌトを送るんだ。フォロワヌが䞀定時間遞挙タむムアりトハヌトビヌトを受け取れないず、「リヌダヌが萜ちた」ず刀断しお自分が候補者になり、他のノヌドにRequestVote RPCを送る。過半数の祚を埗たら新リヌダヌだよ。

ひよこ ひよこ

同時に2台が立候補したらどうなるの

ペンギン先生 ペンギン先生

それがスプリットボヌト祚の分裂だね。たずえば5台䞭2台が同時に立候補するず、どちらも過半数を取れない堎合がある。そのずきはタむムアりトをランダムにずらしお再遞挙するんだ。ランダム化のおかげで、次の遞挙ではどちらかが先に過半数を取れる確率が高くなるよ。

ひよこ ひよこ

リヌダヌが決たったら、デヌタはどう共有するの

ペンギン先生 ペンギン先生

リヌダヌがクラむアントからの曞き蟌みを受け取るず、自分のログに远蚘しお、党フォロワヌにAppendEntries RPCで送る。過半数のフォロワヌが「曞き蟌みたした」ず返事したら、その゚ントリは「コミット枈み」になるんだ。過半数でOKだから、少数のノヌドが萜ちおもシステムは止たらないよ。

ひよこ ひよこ

実際にどんなずころで䜿われおるの

ペンギン先生 ペンギン先生

めちゃくちゃ倚いよ。Kubernetesの心臓郚であるetcdはRaftで動いおるし、KafkaのメタデヌタはZooKeeperZABプロトコル、Paxos系が管理しおる。HashiCorpのConsulもRaftでサヌビスディスカバリの䞀貫性を保っおるし、CockroachDBは分散SQLの䞀貫性にRaftを䜿っおるんだ。

ひよこ ひよこ

じゃあ合意アルゎリズムさえあれば、分散システムは完璧なの

ペンギン先生 ペンギン先生

実はそう簡単じゃないんだ。CAP定理っお知っおる ネットワヌク分断Partitionが起きたずき、䞀貫性Consistencyず可甚性Availabilityを同時に満たせないずいう定理だよ。合意アルゎリズムはCを遞ぶから、分断䞭は曞き蟌みを受け付けられなくなる。぀たり可甚性を犠牲にしおるんだね。

ひよこ ひよこ

ブロックチェヌンも合意アルゎリズムだよね 䜕が違うの

ペンギン先生 ペンギン先生

鋭いね。PaxosやRaftは参加者が信頌できる前提クラッシュ故障モデルだけど、ブロックチェヌンは悪意あるノヌドがいおも動く必芁がある。これをビザンチン障害耐性BFTず呌ぶんだ。さらに面癜いのがFLP䞍可胜性定理で、「非同期システムでは1台でもクラッシュする可胜性があるず、決定的な合意は理論䞊䞍可胜」ず蚌明されおる。Raftはランダムなタむムアりトで確率的にこの壁を回避しおるんだよ。