初学者であるため、Spannerを理解するため基本的な知識を整理してみました。
ドキュメントに書いてあることを、ただ並べただけになりますmm
Spanner とは何か?
Cloud Spanner とは
https://cloud.google.com/blog/ja/topics/developers-practitioners/what-cloud-spanner
RDSでおなじみのER図で定義される構造と、NoSqlで扱うようなオブジェクトライクな構造のどちらも設計可能な点と、
NoSql等で語られるスケーラビリティをトランザクションやRDSの扱われ方においても発揮される点がユニークであると言っていますね。
Spanner の構成要素
Spannerの仕組み
インスタンス構成とコンピューティング容量
- インスタンス構成とは、データベースの地理的な場所とレプリケーションの種類を定義する。
- 単一リージョンの場合は、リージョンをどこにするかだけ考える必要がある。
- コンピューティング容量とは、サーバー(ノード)とストレージのリソース量を定義する。
ノード
- サーバーや処理単位(Processing Units, PU)とも呼ばれる。
- 読み取り・書き込み・commit トランザクションを処理する。
- ノードはストレージ対してデータの読み書きを行うが、ノード自身もデータを保持する。
- 1ノード = 1,000PU, 0.5ノード = 500PU
- 1,000PU未満は100単位, 1,000PU以上なら1,000単位で調節可能
- あるノードはリージョン内の3つのアベイラビリティゾーンに複製される。(レプリケーション)
ストレージ
- データベースの容量のこと。
- PU数に基づいて決定される。
- 1,000PU未満の場合は 100PU当たり 409.6GB
- 1,000PU以上の場合は 1000PU当たり 4TB
リージョン
- データベースの物理的な場所を指定。
- 北米、南米、ヨーロッパ、アジア、オーストラリアが利用可能。
- リージョンではノードを3つのゾーンにレプリケーションしており、マルチリージョンか否かでレプリカの種類が変わる。
- 通常のリージョンの場合
- 3つとも読み書きレプリカである。
下図は、単一リージョンのインスタンス内部で、ノードとストレージが3つのアベイラビリティゾーンに複製されている様子を表しています。
どのようにして高可用性とスケーラビリティを提供しているか?
レプリケーション
- ノードが3つのゾーンに複製され、それぞれはレプリカの種類によって振る舞いが異なる。
- 単一リージョンの場合
- 3つのレプリカは読み書きレプリカとして扱われる。
- 1つのレプリカがリーダーに選出され、書き込みトランザクションを主に扱う。
- 残り2つのレプリカは基本的に読み取りを担当する。
- もしリーダーが動作しなくなった場合、残りの2つからリーダーを選出し直す。(Paxos コンセンサスプロトコル)
- マルチリージョンは複雑なので割愛
スプリット
- Spannerのデータはテーブルの主キーでソートされていて、各ノードは一定範囲を担当領域として割り当てられている。
- 例: 主キーがIDであれば 0~1000まではAノード, 1001~2000まではBノード
- その担当領域のことをスプリットという。
- 各スプリットは物理的場所が異なるため、スプリットをまたいだデータの読み書きはパフォーマンスが悪化する。
- データ数が増大し、担当しているノードの負荷がリソースの上限に近づくと、動的にスプリットを追加する。(つまり1ノードの割り当て領域を変化させ負担を減らす)
- 例: Bノードの負荷が高い場合スプリットは 0~1000まではAノード, 1001~1500まではBノード, 1501~2000まではCノードという様にリバランシングされる。
- スプリットは親子関係(インターリーブ間)のデータ(連続した行の範囲)は保持されます。
下図は、あるテーブルが3つのゾーンにレプリケーションされており、またテーブルの主キーの範囲が複数スプリットされている様子を表しています。
こうやって整理してみると、意外とスッキリ理解できるかもしれません。