分散合意アルゎリズムの仕組み ― 耇数サヌバヌが「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はランダムなタむムアりトで確率的にこの壁を回避しおるんだよ。