Cassandraのストレージエンジンを入れ替えて高速化した「Rocksandra」、Instagramがオープンソースで公開。Javaのガベージコレクションによる遅延を大幅に解消

2018年3月13日

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の位置にある値)のレイテンシを示しています。つまり、全体の処理の一部でしばしば大きな遅延が発生していることが分かります。

Cassandraで発生するレイテンシ

調査の結果、これが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と圧倒的な差がつきました。

Rocksandraによるレイテンシの改善

Instagramでは、今後オープンソースでのRocksandraの開発を進めつつ、セカンダリインデックスやリペアといったまだ実装されていないCassandraの機能へのキャッチアップおよびCassandraへのプラガブルなストレージエンジンアーキテクチャ実装への貢献を行っていくとしています。

あわせて読みたい

NoSQL データベース Cassandra




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本