合意アルゴリズム

分散システムで複数のノードが同じ値に合意するためのアルゴリズム

分散システムアルゴリズム

合意アルゴリズムとは

合意アルゴリズム (Consensus Algorithm) は、分散システムで複数のノードが同じ値に合意するためのアルゴリズムである。ノードの障害やネットワーク分断が発生しても、システム全体として一貫した状態を維持する。

なぜ必要か

ノード A: 「値は 42
ノード B: 「値は 42   全ノードが同じ値に合意
ノード C: 「値は 42

ノード B が障害で応答しない場合でも、A  C で合意を形成できるか?

主要なアルゴリズム

アルゴリズム 提唱者 特徴 採用例
Paxos Leslie Lamport (1989) 理論的に正しいが実装が複雑 Google Chubby
Raft Diego Ongaro (2014) Paxos を理解しやすく再設計 etcd, Consul
PBFT Castro & Liskov (1999) ビザンチン障害に対応 ブロックチェーン

Raft の仕組み

リーダー選出:
  [Follower A] [Follower B] [Follower C]
  → タイムアウト → ACandidate に → 投票 → ALeader に

ログレプリケーション:
  ClientLeader A → ログに追記 → Follower B, C にレプリケーション
                    → 過半数 (2/3) が確認 → コミット → Client に応答

Raft はリーダー選出 (Follower がタイムアウトすると Candidate になり投票を要求)、ログレプリケーション (Leader がログエントリを Follower に送信)、コミット (過半数が確認したらコミット) の 3 フェーズで動作する。

CAP 定理との関係

CAP 定理により、ネットワーク分断時に Consistency (全ノードが同じデータを返す) と Availability (全リクエストに応答する) を同時に満たすことはできない。Raft は CP (Consistency + Partition Tolerance) を選択する。

AWS での合意

DynamoDB は内部的に Paxos ベースのレプリケーション、Aurora はクォーラムベースの書き込み (6 コピー中 4 に書き込み)、EKS (etcd) は Raft、ElastiCache (Redis Cluster) は Gossip プロトコルを使用する。

詳しくは関連書籍を参照。

関連用語