論文メモ Aerospike: Architecture of a Real-Time Operational Database

November 28, 2020

Aerospikeは、高い対障害性をもった分散データベースで、正式にはCitrusleafという。 CPU, DRAM, HDDやSSDを搭載したコモディティなサーバでクラスタを組める。 ノード同士はTCP/IPで通信し、シェアードナッシングなクラスタを構成する。 処理性能の向上のために、スケールアウトだけでなく、スケールアップも重視しており、ハードウェアを意識した実装で高速化をはかっている。

クラスタの状態は、クラスターのIDであるcluster keyとノードのIDのリストであるsuccession listのペアの値で管理され、これをCluster viewとよぶ。 cluster keyは無作為に生成される8バイトの値で、ノードのIDはノードのMACアドレスとリスナーポートの値で決まる。 各ノードは、ハートビートメッセージを送り合い、クラスタへの参加を維持しているか相互に確認する。 ノードは、隣接リストをもち、ハートビートの送受信に成功したノードをリストで管理する。 一定期間内に応答しなかったノードはリストから外される。 応答のない状態が続けば、クラスタからも除外され、Cluster viewが変化する。

あるノードから見たCluster viewが変わると、ほかのノードと新しいCluster viewについて含意をとる。 そのための含意アルゴリズムにはPaxosが採用されており、隣接リストの先頭ノードがPaxosのProposerとしてはたらく。

Aerospikeのレコードは、主キーをもち、複数のノードに複製される。 下図は、レコードを保存するノードを決める様子を示す。 保存先のノードは、衝突に強いハッシュ関数RipeMD160を主キーに適用して決まる。 ハッシュ値の値域は4096個の区間に分かれ、該当する区間を担うノードにレコードが保存される。 各区間は、succession listを並び変えたリストを管理している。 リストの先頭をマスタとして、続く複数のノードにレコードの複製が保存される。

distribution

スケールアップの工夫はCPU, コンテキストスイッチ、フラグメンテーションにある。 Non-Uniform Memory Access(NUMA)アーキテクチャは、コア数の増加で効率よく処理性能の上げるために、コアに個別のローカルメモリを持たせ、複数のコアが同時にメモリにアクセスできない問題を回避する。 他のコアのメモリへのアクセスはローカルメモリへのアクセスよりも時間がかかる。 Aerospikeは、スレッドをグループ化し特定のコアに割りあてることで、ローカルメモリへのアクセス頻度を上げている。 また、コンテキストスイッチの頻度を下げるために、ネットワークリスナのスレッド上で処理を実行する実装になっている。 さらに、生存期間の長いオブジェクトへの操作の最適化やメモリの断片化を最小限にするためにjemallocに独自拡張を加えている。