🦔

Cloud Spannerのスプリット分散をわかった気になる

2022/12/07に公開

この記事はUniposアドベントカレンダー2022の8日目の記事です!

はじめに

Uniposのサーバサイドエンジニアの周東です。アドカレの穴あきがまた気になったので埋めにきました。Cloud Spannerの分散ファイルシステムの仕組みを解説する公式のホワイトペーパーを読んだので、それを初見の自分が喜びそうな感じでまとめます。

ストライピングとミラーリング

分散データベースを勉強する前に、ディスクアクセスの基礎であるRAIDを復習しておくのが良いです。

RAID0では、ストライピングでデータを分割し、複数のディスクに分散配置することで並列アクセスによるR/W効率を向上させます。

RAID1では、ミラーリングで同じデータを複数のディスクに書き込むことで、データを冗長化し、可用性を向上させます。

RAID0+1は、ストライピングとミラーリングを両方採用したものです。

データの分散化はストライピングで、データの冗長化はミラーリングくらいの認識でいればよさそうです。

スプリット分散

Cloud SpannerではNode・Zone・Splitの三つの概念を用いてデータの分散化と冗長化を行います。Nodeはすごくザックリ言うとSpannerのリソースのことで、利用者は確保したNode上でDBを構築します。NodeはZone単位で区切られています。Splitは実際のデータを格納する単位であり、SplitはNodeとZoneの両方に分散化・冗長化を行うことができます。

言葉だけだとわかりにくいと思うので、例を出して考えていきます。RAIDの説明で使ったような数値データを考えていきます。1〜100の範囲のデータを持つテーブルをsplitに分割する場合、下記のようにキーの範囲を区切って分割することになります。

このSplitをNodeの中で分散化(ストライピング) するとこうなります。NodeはZoneで区切られているので、各Zoneにsplitが散らばります。

これにNode内でさらに冗長化(ミラーリング) してみるとこのようになります。

これで、複数のZoneごとにジョブを投げて並列にデータを取得することができますし、ZoneXで障害が発生した場合でもZoneYとZoneZのレプリカを用いて業務を継続することができます。Nodeにはリソースの上限などがあるので、サービスの規模が大きくなってくるとコンピューティングリソースおよびストレージリソースが不足するため、Nodeを増やすこともできます。Nodeを増やすと、さらにNodeを跨いだ分散化と冗長化を実現できます。

また、Cloud Spannerは全世界規模での分散トランザクションを実現している訳なので、マルチリージョン構成にすることもできます。その場合は、Nodeがリージョンを跨いで作成されることになります。

ホットスポット問題

ここで、ホットスポット問題についても触れておきます。

split分散の仕組みで説明したように、splitはNodeとZoneを跨いで複製されています。これらはTrueTime(今回は説明しない)などの仕組みで整合性を保っています。split間での一環したレプリケーションを実現するために、Cloud SpannerではPaxosというアルゴリズムを採用しており、複数のsplitの中からリーダーを選定します。リーダーが書き込みを処理し、それ以外のsplitが読み込みを処理します。

今回例に使っているHOGEテーブルは数値の連続値で、挿入のたびに新しく連番を採番していくようなテーブルです。今テーブルに1から84までデータが入っているとすると、これから挿入されるデータは84,85...と単調なキーでDBにINSERTされていくことになります。[81,100]の範囲を担当するsplitはEなので、以降の書き込みはNode3のZoneYにあるsplitEのリーダーに集中してしまうことになります。

このように、キーが単調増加するようなレコードをDBに追加していくと、一部のsplitへの書き込みが集中し、処理が重くなってしまうホットスポットという状態が発生し、DBの書き込み系のパフォーマンスが著しく低下してしまう状況になります。書き込みを分散させるには、キーの先頭をUUIDにしたり、単調増加しない値を採番する必要があります。読み込み系に関してはリーダ以外のsplitに対して分散処理が可能なので、パフォーマンスに影響は出ませんが、書き込み系においてはホットスポットを発生させるアンチパターンのID採番が存在することをおさえておく必要があります。

おわりに

今回は、Cloud SpannerのSplitの仕組みについて、ザックリと図でイメージをつかめるようにまとめてみました。やっぱり最初は公式のドキュメントとか読んでもいまいちわからないことも多いので、とにかく図を書いて知識を整理することが大事だなと、記事を書いていて実感しました。

またSpannerの仕組みに関してホワイトペーパーや論文の読解が進んだら、図でステップを踏んでまとめるような記事を出してみようかなと思いました。それでは。

Discussion