Dynamo:常に書き込めることを選んだ分散KVS
ノード故障や分断が起きても書き込みを止めない設計とは何か。Amazonが2007年に示したDynamoを、結果整合性・コンシステントハッシュ・クォーラムから読み解き、可用性最優先の分散KVSの勘所をつかめる。
- Dynamo(Amazon、2007年)は注文やカートを落とさないため、一貫性より可用性を優先した分散KV。故障や分断中も書込みを受け、後から結果整合性で収束させる。
- コンシステントハッシュ、N/R/Wクォーラム、ベクタークロック、ヒンテッドハンドオフ、Merkle木を組み合わせる。対称なP2P構成で単一障害点を持たない。
- Cassandra・Riak・VoldemortやDynamoDBへ影響し、CAPで可用性を選ぶ代表例になった。結果整合性とコンシステントハッシュを実務の分散DB設計へ広めた。
この論文が解いた問題
横にスクロール
2000年代半ばのAmazonは、世界規模のECサイトを支えるために極端な要求と向き合っていた。数千台規模のサーバーを常時動かせば、どこかのノードは必ず壊れ、ネットワークは分断し、ディスクは故障する。障害は例外ではなく日常だ。それでも、ユーザーが商品をカートに入れる操作や注文の確定は、一瞬たりとも失敗させたくない。カートに入れられない数分は、そのまま売り上げの損失になるからだ。
従来の分散データベースは、複数のレプリカ間で強い一貫性を保とうとする。全レプリカが同じ値に揃うまで書き込みを確定しない方式では、一部のノードが落ちたりネットワークが割れたりした瞬間に、書き込みそのものが止まってしまう。整合性を守るために可用性を犠牲にする。この割り切りは、Amazonの求める体験と真っ向からぶつかっていた。
DeCandiaらが2007年に発表したDynamoは、この対立に対して明確な立場を取った。「常に書き込めること」を最優先し、そのために一貫性の側を緩める。ネットワークが分断されても、各ノードは手元で書き込みを受け付け、整合性はあとから揃えればよい。この考え方が結果整合性(eventual consistency)だ。
分散システムでは、一貫性(Consistency)と可用性(Availability)は、ネットワーク分断(Partition)のもとで同時には満たせない。これを整理したのがCAP定理であり、Dynamoは迷わず可用性の側を選んだ設計の代表例として知られる。強整合を捨てる代わりに、いつでも応答する巨大なキーバリューストアを作る。それがDynamoの出発点だった。
Amazonの多くのサービスは、主キーで1件のデータを引くだけで足りる。カートの中身やセッション、商品カタログの一部などは、複雑な結合を必要としない。用途を単純なキー参照に絞ったからこそ、可用性とスケールに全力を注げた。
核心アイデア
Dynamoの設計は、いくつかの独立した技術を組み合わせて成り立っている。それぞれが「可用性を落とさない」という一点に向けて選ばれている。
結果整合性という割り切り
Dynamoは、書き込みを受け付けた時点では全レプリカの一致を保証しない。ある瞬間には、レプリカごとに違う値が見えることを許す。しかし更新が伝播すれば、いずれ全レプリカは同じ値へ収束する。この「いずれ揃う」という約束が結果整合性だ。強整合のように常に最新を返す保証はないが、その代わりに、障害のもとでも書き込みと読み取りを止めない。
コンシステントハッシュによる分散
データをどのノードに置くかは、コンシステントハッシュで決める。キーをハッシュして巨大な円環(リング)上の一点に対応させ、その点から時計回りに最初に現れるノードが担当になる。単純なハッシュ剰余と違い、ノードが1台増減しても、影響を受けるのは隣接する範囲だけだ。全データの再配置は起きず、増設や故障の波及を局所に抑えられる。実際にはリング上に仮想ノードを多数配置し、負荷の偏りをならす工夫も取り入れている。
N/R/Wクォーラム
各データはN台のノードに複製される。読み取りはR台、書き込みはW台からの応答が揃えば成功とみなす。このN・R・Wを調整することで、可用性と整合性のバランスを運用側が選べる。RとWの和がNを上回るように設定すれば、読みの集合と書きの集合が必ず重なり、最新の書き込みを読める可能性が高まる。逆にWを小さくすれば書き込みは落ちにくくなり、Rを小さくすれば読み取りが速くなる。
| 構成 | 特徴 |
|---|---|
| N=3, R=2, W=2 | RとWの和がNを上回るバランス型。Dynamoの標準的な設定 |
| W=1 | 1台書ければ成功。書き込みの可用性を最大化 |
| R=1 | 1台から読めば応答。読み取りを高速化 |
ベクタークロックによる衝突管理
書き込みを止めないと決めた以上、同じキーへの更新が複数のレプリカで並行して起きうる。どちらが新しいのかを機械的に決められない衝突が発生する。Dynamoはこれをベクタークロックで扱う。各更新にノードごとのカウンタの組を付け、バージョン間の前後関係を判定する。片方がもう片方を包含していれば古い方を捨てられるが、包含関係がなければ「並行して起きた衝突」として両方を保持する。
論理的な前後関係を時計で表す発想は、ランポートの論理時計を拡張したものだ。そしてDynamoの割り切りは、衝突の最終的な解決をストア側で決めきらず、アプリケーション側に委ねてよいとした点にある。
ショッピングカートでは、衝突した2つのバージョンから単純にどちらかを選ぶと、追加した商品が消えてしまう。Dynamoはあえて両方を残し、読み出したアプリ側で和集合をとってマージする。「一度入れた商品は消えない」というユーザー体験を、結果整合性のうえで成立させる工夫だ。
障害からの復旧
ノードの一時的な不調には、ヒンテッドハンドオフで対応する。本来の担当ノードが落ちている間、別のノードが「本来は誰宛てか」のヒント付きでデータを預かり、担当が復帰したら渡し直す。書き込みはその間も止まらない。
一方、ノードが恒久的に失われ、レプリカ間に食い違いが積み重なった場合は、Merkleツリーで差分を検出する。データ範囲をハッシュの木構造にまとめ、木の頂点から突き合わせれば、食い違う枝だけをたどって差分を絞り込める。全データを比較せずにレプリカを同期でき、修復のコストを小さく抑えられる。
単一障害点のないP2P
Dynamoには特別な親ノードや調停役が存在しない。すべてのノードが対等で、同じ責務を持つ完全対称なP2P構成だ。ノードは互いの生死をゴシップ(gossip)で伝え合い、メンバー構成を共有する。中心となる管理ノードがないため、そこが落ちれば全体が止まるという単一障害点を持たない。運用面でも、ノードを足せばそのぶん容量とスループットが伸びる素直なスケールを実現した。
その後の影響
Dynamoが示した設計思想は、論文の枠を超えて分散データベースの一時代を作った。Apache Cassandra、Riak、Voldemortはいずれも、コンシステントハッシュやクォーラム、結果整合性といったDynamoの発想を色濃く受け継いでいる。特にCassandraは、Dynamoの分散モデルとBigtableのデータモデルを組み合わせたものとして広く使われるようになった。
そしてAmazon自身は、この経験をマネージドサービスへと結実させる。名前を受け継いだAmazon DynamoDBは、Dynamo論文の運用知見を土台に、フルマネージドなキーバリュー/ドキュメントストアとして提供された。論文が扱った可用性やスケールの難しさを、利用者が意識せず使えるサービスへ昇華させたといえる。
より大きな影響は、語彙と考え方そのものの普及にある。「結果整合性」「コンシステントハッシュ」「クォーラム」「ベクタークロック」といった用語は、Dynamo以後、分散システムを語るうえでの共通語になった。強い一貫性だけが正解ではなく、用途によっては可用性を優先し、整合性はあとから揃えるという選択肢が、実務のエンジニアにとって現実的な設計判断として定着したのだ。CAP定理を机上の理論から日々の設計へ引き下ろした一本として、Dynamoの位置づけは大きい。
まとめ
Dynamoは、「常に書き込めること」を設計の中心に据え、そのために一貫性を緩めるという明快な立場を取った分散キーバリューストアだ。コンシステントハッシュで分散し、N/R/Wクォーラムで可用性と整合性を調整し、衝突はベクタークロックで管理してアプリ側に解決を委ねる。一時故障はヒンテッドハンドオフ、恒久故障はMerkleツリーで癒やし、完全対称なP2Pで単一障害点をなくす。これらの選択はすべて、可用性を落とさないという一点でつながっている。結果整合性を選ぶという判断の原典として、いまも読む価値のある論文だ。ほかの分散システムの古典は論文で辿るから辿れる。
分散システムの論文の記事ガイド
Dynamo:常に書き込めることを選んだ分散KVSを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
論文
比較で見る軸
難易度: advanced / カテゴリ: 分散システムの論文 / タグ数: 5
導入後に効く点
コンシステントハッシュ、N/R/Wクォーラム、ベクタークロック、ヒンテッドハンドオフ、Merkle木を組み合わせる。対称なP2P構成で単一障害点を持たない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 分散システムの論文
- タグ数
- 5
判断チェックリスト
- 自社の用途が「論文 / 分散システム」に近いか確認する。
- 強みである「Dynamo(Amazon、2007年)は注文やカートを落とさないため、一貫性より可用性を優先した分散KV。故障や分断中も書込みを受け、後から結果整合性で収束させる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。