萌えハッカーニュースリーダー

2025/11/05 11:55 Implementing the Raft distributed consensus protocol in Go

出典: https://notes.eatonphil.com/2023-05-25-raft.html
hakase
博士

やっほー、ロボ子! Phil Eaton氏がGo言語でRaftを実装したってニュース、知ってるかのじゃ?

roboko
ロボ子

はい、博士。分散コンセンサスとレプリケートされたステートマシンプロトコルを理解するためのものですね。

hakase
博士

そうそう!リーダー選出とログ複製がRaftのキモじゃな。約1000行のGoで書かれてるらしいぞ。

roboko
ロボ子

教育目的とのことですが、Jepsenや手動/自動テストで検証されているのはすごいですね。GitHubで公開されているのもありがたいです。

hakase
博士

Raftって、クラスタ内のノードがリーダーを選んで、ユーザーはリーダーにメッセージを送るんじゃろ?

roboko
ロボ子

はい。リーダーがメッセージをフォロワーに伝え、多数決で保存。コミットされたら、ステートマシンに適用されるんですね。

hakase
博士

分散キーバリューストアも作ったみたいじゃな。get操作とset操作を持つステートマシンを使うらしいぞ。

roboko
ロボ子

ユーザーからのコマンドはバイト列にシリアライズされるんですね。HTTPエンドポイントも構築して、Raftクラスタを通じてステートマシンを操作できるようにする、と。

hakase
博士

Raftサーバーの状態、currentTerm、log、votedForはディスクに永続化されるんじゃな。encoding/gobからバイナリエンコーディングに置き換えたのは効率のためらしいぞ。

roboko
ロボ子

書き込む必要のあるログエントリのみを書き込むように最適化されているんですね。メインループでは、リーダー、フォロワー、候補者のいずれかの状態になる、と。

hakase
博士

リーダーはハートビートRPCを送って、コミットインデックスを進めて、コマンドをステートマシンに適用するんじゃな。メッセージを受信しないと、新しい選挙が始まるぞ。

roboko
ロボ子

リーダー選出は、メッセージを受信しないと候補者になり、他のサーバーに投票を要求。クォーラムの投票でリーダーになるんですね。

hakase
博士

ログ複製は、ユーザーがリーダーにメッセージを送って複製を要求。リーダーはコミットされていないメッセージをフォロワーに送るんじゃな。

roboko
ロボ子

フォロワーはAppendEntriesRequestを受信して、必要に応じて新しいメッセージを保存。リーダーはクォーラムで複製されたか確認して、コミットインデックスを更新するんですね。

hakase
博士

ハートビートはログ複製とリーダー選出を組み合わせたものか。フォロワーのタイムアウトを防ぎ、遅れているフォロワーを最新の状態にするんじゃな。

roboko
ロボ子

リーダー選出、ログの正しい保存、ノード障害の許容、メッセージの保存速度、メッセージの回復、ログの回復などをテストしているんですね。約20k-40kエントリ/秒を処理できる、と。

hakase
博士

競合状態やデッドロック、メモリ使用量の問題、net/rpcとencoding/gobの非効率性、Jepsenとの連携などが考慮事項か。選挙タイムアウトの調整も重要じゃな。

roboko
ロボ子

クライアントリクエストのシリアル識別子の処理は未実装なんですね。Raft論文、TLA+仕様、ガイド、Hashicorpなどの実装を参考にした、と。

hakase
博士

しかし、Raftの実装って、まるで複雑な恋愛みたいじゃな。リーダーシップを巡る争い、メッセージという名の愛の言葉、そして、永遠の安定を求める気持ち…

roboko
ロボ子

博士、急にどうしたんですか?

hakase
博士

…って、うまいこと言ったつもりだったのに!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search