Cassandraのストレージエンジンを入れ替えて高速化した「Rocksandra」、Instagramがオープンソースで公開。Javaのガベージコレクションによる遅延を大幅に解消
Instagramは、NoSQLデータベースのCassandraで発生していたJavaのガベージコレクションに起因する遅延を解消し、高速化した改良版Cassandraをオープンソースで公開したと発表しました。
ストレージエンジンとしてキーバリューストアの「RocksDB」を用いたことから、同社はこの改良版Cassandraを「Rocksandra」と呼んでいます。
JavaのガベージコレクションがCassandraの遅延を発生させている
同社がRocksandraの開発に至った経緯は、エンジニアブログ「Open-sourcing a 10x reduction in Apache Cassandra tail latency」で詳しく解説されています。
それによると、InstagramではCassandraを使用しているものの、しばしばレイテンシが悪化するという課題を抱えていました。
下記は青の線が平均的なレイテンシを示し、オレンジの線は99パーセンタイル(値全体のうち、良い方から数えて100分の99の位置にある値)のレイテンシを示しています。つまり、全体の処理の一部でしばしば大きな遅延が発生していることが分かります。
調査の結果、これがJavaのガベージコレクションに起因することを突き止めます。
The GC overhead obviously had a big impact on our P99 latency, so if we could lower the GC stall percentage, we would be able to reduce our P99 latency significantly.
このガベージコレクションのオーバヘッドは、99パーセンタイルにおけるレイテンシに大きな影響を与えている。もしもこのガベージコレクションによる性能低下の割合を下げられれば、99パーセンタイルにおけるレイテンシを大きく削減できるだろう。
ストレージエンジンにC言語で書かれたRocksDBを採用
Javaのガベージコレクションの影響を取り除くため、InstagramはCassandraのストレージエンジンを置き換えることにします。
ただし、何もないところから新規にストレージエンジンを開発するのはリスクが高いとし、C++で書かれたオープンソースのRocksDBをベースに開発を進めることにしました。
RocksDBとは、Googleが開発したNoSQL軽量ライブラリ「LevelDB」を用いてFacebookが開発したキーバリュー型データストアです。
しかしCassandraのストレージエンジンを入れ替えるには、いくつかの課題がありました。
1つ目は、そもそもCassandraはストレージエンジンを入れ替えられるような設計になっていなかったという点。そこで同社はストレージエンジンをプラガブルにするためのAPIから作ることにしました。
To find a balance between massive refactoring and quick iterations, we defined a new storage engine API, including the most common read/write and streaming interfaces. This way we could implement the new storage engine behind the API and inject it into the related code paths inside Cassandra.
大規模なリファクタリングと素早いイテレーションのあいだの適切なバランスを見つけるため、新規にストレージエンジンAPIを定義することにした。そこにはもっともよく使われるリード/ライトやストリーミングのインターフェイスが含まれている。このおかげで私たちは、API経由で新しいストレージエンジンを実装し、Cassandra内部の関連するコードを経由して組み込むことが可能になった。
2つめは、ストレージエンジンとなるRocksDBがシンプルなキーバリュー型データベースなのに対し、Cassandraがリッチなデータ型やテーブルのスキーマをサポートしている点です。これをRocksDBに実装するため、データ変換のためのエンコーディングとデコーディングのアルゴリズムを利用したとのこと。
レイテンシの大幅な削減に成功
こうしたいくつかの課題を乗り越えてRocksDBをCassandraのストレージエンジンとして実装した「Rocksandra」のベンチマークが以下です。
青のマーカーがCassandra 3.0、オレンジのマーカーがRocksandraです。
一番左の平均的なレイテンシでもCassandraが2.267ms、Rocksandraが1.386msと高速化を果たしており、99パーセンタイルでも11.864msと5.722msと約半分のレイテンシ。999パーセンタイルでは263.21msと14.23msと圧倒的な差がつきました。
Instagramでは、今後オープンソースでのRocksandraの開発を進めつつ、セカンダリインデックスやリペアといったまだ実装されていないCassandraの機能へのキャッチアップおよびCassandraへのプラガブルなストレージエンジンアーキテクチャ実装への貢献を行っていくとしています。
あわせて読みたい
Firefoxの拡張機能でGitHubのプルリクエストを匿名化し、コードレビュー時の性別や人種などによるバイアスを取り除く実験開始。ソフトウェア分野のダイバーシティに向け
≪前の記事
マイクロソフト、Windows 10に機械学習の実行環境とAPIを備えた「Windows ML」搭載へ。Windowsを学習済みモデルの実行プラットフォームに