セキュリティキャンプ2023成果発表Y3分散合意ゼミ 高棟雄斗
View Slide
アジェンダ● 分散合意ゼミのテーマ/目的● Raftについて● 今回実装したもの● 感想
分散合意ゼミのテーマ/目的● コンピュータシステムの耐故障性を高めたい場面で分散システムを使用することがある● 分散合意は、分散システムにおいてノードを共通の値や状態に合意するプロセス● 分散合意アルゴリズムとして代表的なRaftを実装を通して学ぶことがこのゼミの目的
Raftについて● Raftは、分散システム内の複数のノードを同じ状態に合意するためのアルゴリズム● ノードの中から選挙でリーダーを選出する○ リーダーがいなくなった場合は、残りのノードから再選挙される● クラスタに送られてきた通信は全てリーダーに集約され、リーダーから各ノードにレプリケーションされる
今回実装したもの● リーダー選挙● ログレプリケーション● ソースコード: https://github.com/shinbunbun/raft.go
リーダー選挙
リーダー選挙● 全てのノードの中から1台のLeaderを選出する● 2台以上のLeaderが選出された場合 or 1台もLeaderを選出できなかった場合はやり直し
リーダー選挙のフロー● リーダー検出○ リーダーは定期的に FollowerにHeartbeatを送信している○ Followerは、一定時間HeartBeatが送られてこなかった場合に自身を Candidateとしてリーダー選挙に立候補する● リーダー決定○ Candidateは全てのノードに対して投票リクエストを送り、受け取ったノードは Leaderとして受け入れるか否かを回答する○ 過半数以上の賛成を得れた場合はそのノードが Leaderとなる
node01: Leadernode02~05: Followernode01node02node03node04node05HeartBeat
node01: Leadernode02~05: Followernode02node03node04node05node01
node02: Candidatenode03~05: Followernode02node03node04node05投票リクエスト
node02: Candidatenode03~05: Followernode02node03node04node05投票
node02: Leadernode03~05: Followernode02node03node04node05
ログレプリケーション
ログレプリケーション● 全てのノードにおいて有効なログについて合意を取る○ Leaderは過半数以上のFollowerが追加に成功したindexまでのlogを確定■ つまり、状態を問い合わせした際には必ず過半数以上のノードで確定している logが返される○ Logの追加に失敗した場合は Followerが必要としているLogの全てが含まれていないものと判断し、古いLogを含めて再送処理を行う
Client{Log: [hoge]}を追加node01node02node03node04node05node01: Leadernode02~05: FollowerLogをレプリケーション{Log: [hoge]}node01 gya, fuganode02 gyanode03 gya, fuganode04 gya, fuganode05 gya, fuga
node01node02node03node04node05node01: Leadernode02~05: Followernode01 gya, fuga, hogenode02 gyanode03 gya, fuga, hogenode04 gya, fuga, hogenode05 gya, fuga, hoge
node01node02node03node04node05node01: Leadernode02~05: Followernode01 gya, fuga, hogenode02 gyanode03 gya, fuga, hogenode04 gya, fuga, hogenode05 gya, fuga, hoge再送{Log: [fuga, hoge]}
node01node02node03node04node05node01: Leadernode02~05: Followernode01 gya, fuga, hogenode02 gya, fuga, hogenode03 gya, fuga, hogenode04 gya, fuga, hogenode05 gya, fuga, hoge
ビジュアライザ● ノードやデータの動きを可視化するためのビジュアライザを発表用に作成
動画リンクhttps://youtu.be/Wc2IRQNuEp0
感想● Channelまわりでバグったりなど、Goの知識が足りない部分があった● 実際に手を動かすことでRaftの仕組みを理解できてとても楽しかった● 今回の講義では一部扱っていない部分があったので、原著論文を読んでちゃんと実装したい