開閉ボタン
ユーザーメニュー
ユーザーメニューコンテンツ
ログイン

  • 2018/03/23

インスタグラムがCassandraを高速化、さらにオープンソースで公開

Instagramは、NoSQLデータベースのCassandraで発生していたJavaのガベージコレクションに起因する遅延を解消し、高速化した改良版Cassandraをオープンソースで公開したと発表しました。

Publickey 新野淳一

Publickey 新野淳一

ITジャーナリスト/Publickeyブロガー。大学でUNIXを学び、株式会社アスキーに入社。データベースのテクニカルサポート、月刊アスキーNT編集部 副編集長などを経て1998年退社、フリーランスライターに。2000年、株式会社アットマーク・アイティ設立に参画、オンラインメディア部門の役員として2007年にIPOを実現、2008年に退社。再びフリーランスとして独立し、2009年にブログメディアPublickeyを開始。現在に至る。


 ストレージエンジンとしてキーバリューストアの「RocksDB」を用いたことから、同社はこの改良版Cassandraを「Rocksandra」と呼んでいます。

JavaのガベージコレクションがCassandraの遅延を発生させている

 同社がRocksandraの開発に至った経緯は、エンジニアブログ「Open-sourcing a 10x reduction in Apache Cassandra tail latency」で詳しく解説されています。

 それによると、InstagramではCassandraを使用しているものの、しばしばレイテンシが悪化するという課題を抱えていました。

 下記は青の線が平均的なレイテンシを示し、オレンジの線は99パーセンタイル(値全体のうち、良い方から数えて100分の99の位置にある値)のレイテンシを示しています。つまり、全体の処理の一部でしばしば大きな遅延が発生していることが分かります。

photo
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と圧倒的な差がつきました。

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

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

オープンソースソフトウェア ジャンルのトピックス

オープンソースソフトウェア ジャンルのIT導入支援情報

PR

ビジネス+IT 会員登録で、会員限定コンテンツやメルマガを購読可能、スペシャルセミナーにもご招待!