CyberAgent エンジニア Advent Calendar 2014の23日目の記事です。
秋葉原ラボの、鈴木(@brfrn169)、Shtykh Roman、柿島です。
普段は、分散DB(主にHBase)やストリーミング処理基盤の開発・運用などをやっています。
今回は、NewSQLの1つであるCockroachDBについて紹介します。
NewSQLとは
CockroachDBについて紹介する前に、NewSQLについて簡単に説明します。
NewSQLとは、一言で言うとNoSQL+SQL機能(トランザクション)です。RDBMSとNoSQLの良いとこどりをしているともいえるでしょう。
従来、RDBはスケールアウトのしづらいモノリシックな作りになっていました。しかし、RDBでは、昨今のビックデータの潮流に対応できず、NoSQLの技術が登場します。NoSQLは、スケールアウトが容易で、高い読み書き性能を持っているものが多いです。ただし、トランザクション機能などの一貫性を求められる処理については不向きでした。そのため、近年、RDBとNoSQLの融合に関心が強まってききました。その結果として、HAやスケラビリティ、SQL機能(トランザクション)を持ったNewSQLが現れました。
NewSQLの代表的なプロダクトとしては、今回紹介するCockroachDBの他に、VoltDB、Clustrix、MemSQL、FoundationDBなどがあります。GoogleのSpannerやF1などもNewSQLに分類されます。
CockroachDB
CockroachDBは、GoogleのSpannerのオープンソースクローンで、Go言語で実装されています。元Google社のエンジニアである、Spencer Kimball氏などによって開発されています。現在は、まだ、Alphaバージョンであり、実用段階ではありませんが、現在とても活発に開発されています。
CockroachDBは、ACIDトランザクションを備えた分散キーバリューストアであり、名前通りのゴキブリのようなresilienceを目指して開発されています。ラック間やデータセンター間でクラスタを組むことを想定しており、ディスクやマシン、ラック、更にはデータセンターの障害が起きたとしても耐えられるようにデザインされています。また、クラスタ内の各ノードには差がなく、CassandraのようにいわゆるP2P型のアーキテクチャとなっています。NoSQLのように、ノード追加により、リニアに性能上がっていくのも特徴の1つとなります。
デザイン
ここからは、CockroachDBのデザインについて説明します。
データモデル
CockroachDBのデータモデルは、Keyでソートされたソートマップになっています。KeyとValueは任意のバイト配列となっていて、Valueはバージョンを持ちます。
レンジ
データは、レンジ(デフォルトで64MB)と呼ばれる単位に分けられ、各ノードのRocksDBに保存されます。レンジは、開始Keyと終了Keyで定義され、設定されたサイズを維持するためにマージされたり分割されたりします。
レプリケーション
レンジは、トータルで3つ以上のノードにレプリケーションされ、ノードがダウンした場合にも、データロストしてしまうことはありません。また、意図的に別のデータセンターにもレプリケーションされるようになっていて、データセンター障害にも耐えることができます。レンジの一貫性のために、Raft合意アルゴリズムが利用される予定となっています。
ゴシッププロトコル
先ほど説明したように、CockroachDBはP2P型のアーキテクチャを採用しています。そのため、集中管理を行わないゴシッププロトコルを用いています。ゴシッププロトコルでは、各ノードは近傍Nノードと連絡を取り合い、次の情報の交換を行っています。その際のノード間のコミュニケーションはProtocol buffersによりエンコードされています。
- ロード情報(CPU, ディスク容量,ノード状態等)
- レンジ情報(利用できないレプリカ,R/Wロード等)
- ネットワーク構成(ラック内/DC間の帯域幅/通信レイテンシ等)
トランザクション
CockroachDBのトランザクションは、Snapshot Isolation(SI)とSerializable Snapshot Isolation(SSI)により実現されています。基本的にどちらも一貫性を保つロックフリーのREAD/WRITEメカニズムですが、write skew現象が起こり得るSIより、パフォーマンスコストが高くても安全なSSIをデフォルトにしてある。
※ CockroachDBは、Spannerと違って原子時計やGPS受信機を想定していないようです。
アーキテクチャ
CockroachDBのアーキテクチャは、複数のレイヤーで構成されています。一番上位のレイヤーはSQLを扱うレイヤーとなっています。次のレイヤーとして、Structured Data APIがあります。Structured Data APIは、スキーマやテーブル、カラム、インデックスなどのリレーショナルモデルに似たコンセプトを提供します。最後のレイヤーは、Distributed Key Value Storeです。Distributed Key Value Storeは、モノリシックなKey Value Storeを提供していて、各ノードのレンジへのアクセスはこのレイヤーで行っています。各ノードは複数のStoreを持っています。Storeは物理デバイスを抽象化する概念です。
各ストアは、複数のレンジを含んでいます。レンジは、Raft合意アルゴリズムによってレプリケーションされます。下の図では、それぞれのStoreを拡大したもので、1つのレンジに付き3つのレプリカが存在しています。
※ 図は、https://github.com/cockroachdb/cockroach/blob/master/README.md から引用
API
現在は、REST API(CRUDのみ)と、DB API(protobuf/json over HTTP)の2種類のAPIが用意されているようです。開発段階
ブログ執筆時点では、MLで以下のような発言がされており、未実装な部分が多数あると思われます。
- None of us is running a cluster in anything other than unittests
- At present, Cockroach would only bother to use a single machine with no replication, no matter how many nodes you have participating in the gossip network.
CockroachDBのドキュメント上は以下のように、書いてあります。
ALPHA
- Gossip network
- Distributed transactions
- Cluster initialization and joining
- Basic Key-Value REST API
- Range splitting
Next Step
- Raft consensus
- Rebalancing
その他のNewSQL
CockroachDB以外のNewSQLは、VoltDB、Clustrix、MemSQL、FoundationDBが上げられます。以下、簡単に特徴を書きます。
VoltDB
- オープンソースのin-memoryデータベース
- 低レイテンシなトランザクション
- コミュニティ版は無償
Clustrix
- リアルタイム解析や大規模なトランザクションのワークロードをサポート
- オープンソースではないが、無償コミュニティ版や個人ユーザ版がある
MemSQL
- in-memoryデータベース
- 低レイテンシなトランザクション
- MySQLとwire-compatible
- ライセンス情報なし(無償トライアル?)
FoundationDB
- CockroachDBのように、トランザクションをサポートしたソートマップ
- 複数のプログラミング言語サポート
- トランザクションの制限あり(時間とサイズ)
- 6プロセスまでの無償版あり
まとめ
今回は、NewSQLの1つであるCockroachDBの概要について紹介しました。
弊社でも、NoSQLを使っている事例が多々ありますが、トランザクションが無いため苦労しているところもあり、NewSQLを早い段階からキャッチアップしていこうと考えていて、今回、CockroachDBを調査することにしました。まだ、未実装な部分が多いため、今回は検証するところまではいきませんでしたが、CockroachDBは現在活発に開発されており、今後に期待できるプロダクトだと思います。これからも、CockroachDBの動向を追っていく予定なので、今後、機会がありましたら、このブログで報告できたらなと考えています。
参考文献
- Spanner: Google's Globally-Distributed Database, http://research.google.com/archive/spanner.html
- CockroachDB, https://github.com/cockroachdb/cockroach, http://cockroachdb.org
- Raft合意アルゴリズム, https://raftconsensus.github.io/
- Snapshot Isolation, http://en.wikipedia.org/wiki/Snapshot_isolation
- Serializable Snapshot Isolation(SSI), M. J. Cahill, U. Rohm, and A. D. Fekete. Serializable isolation for snapshot databases. In SIGMOD, pages 729–738, 2008.
- RocksDB, http://rocksdb.org/
- Protocol Buffers, https://code.google.com/p/protobuf/
- VoltDB, http://voltdb.com/
- Clustrix, http://www.clustrix.com/
- MemSQL, http://www.memsql.com/
- FoundationDB, https://foundationdb.com/