• 2018/03/23 掲載

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

  • icon-mail
  • icon-print
  • icon-hatena
  • icon-line
  • icon-close-snsbtns
記事をお気に入りリストに登録することができます。
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へのプラガブルなストレージエンジンアーキテクチャ実装への貢献を行っていくとしています。


※本記事は、ブログ「Publickey」から転載、一部を再構成したものです。

関連記事

関連タグ

関連コンテンツ

あなたの投稿

    PR

    PR

    PR

処理に失敗しました

人気のタグ

投稿したコメントを
削除しますか?

あなたの投稿コメント編集

機能制限のお知らせ

現在、コメントの違反報告があったため一部機能が利用できなくなっています。

そのため、この機能はご利用いただけません。
詳しくはこちらにお問い合わせください。

通報

このコメントについて、
問題の詳細をお知らせください。

ビジネス+ITルール違反についてはこちらをご覧ください。

通報

報告が完了しました

コメントを投稿することにより自身の基本情報
本メディアサイトに公開されます

必要な会員情報が不足しています。

必要な会員情報をすべてご登録いただくまでは、以下のサービスがご利用いただけません。

  • 記事閲覧数の制限なし

  • [お気に入り]ボタンでの記事取り置き

  • タグフォロー

  • おすすめコンテンツの表示

詳細情報を入力して
会員限定機能を使いこなしましょう!

詳細はこちら 詳細情報の入力へ進む
報告が完了しました

」さんのブロックを解除しますか?

ブロックを解除するとお互いにフォローすることができるようになります。

ブロック

さんはあなたをフォローしたりあなたのコメントにいいねできなくなります。また、さんからの通知は表示されなくなります。

さんをブロックしますか?

ブロック

ブロックが完了しました

ブロック解除

ブロック解除が完了しました

機能制限のお知らせ

現在、コメントの違反報告があったため一部機能が利用できなくなっています。

そのため、この機能はご利用いただけません。
詳しくはこちらにお問い合わせください。

ユーザーをフォローすることにより自身の基本情報
お相手に公開されます