Repro Tech LT発表資料
Cassandraの活⽤事例とパフォーマンス特性joker1007 (Repro inc. CTO)
View Slide
self.inspect@joker1007Ruby/Rails/fluentd/presto/infra⼤体アーキテクト業今はkafkaとkuduに興味がある
話すことReproでのCassandraの活⽤⽬的Cassandraの選定理由Cassandraのパフォーマンス特性と設計時の注意話さないこと運⽤時の細かな注意点
何のために端末情報記録ユーザープロフィール情報イベント実⾏回数 / userリアルタイムで更新される情報の保持がメイン
何故Cassandraを選択したか書き込み回数が⾮常に多いかつ読み込み時に100万件単位で取得しJOINする必要がある組み合わせる対象として、数⼗⽇分の⾏動ログを含む。書き込みがスケールし、当時からセグメンテーションに利⽤していたprestoと連携が可能で、読み込みもある程度分散できるデータストアが必要。→ Cassandraを採⽤。
Cassandraのパフォーマンス特性
書き込みの概要ClientClientR2R2R3R311234456789101112R1R1Write responseChosen nodeCoordinator nodehttps://docs.datastax.com/ja/cassandra-jajp/3.0/cassandra/dml/dmlClientRequestsWrite.html
書き込みの概要https://docs.datastax.com/ja/cassandra-jajp/3.0/cassandra/dml/dmlHowDataWritten.html
書き込みパフォーマンス特性パーティション対象の決定とmemtable、transaction logが書ければOK。最終的なテーブルファイルは不変なので、書き出しがシンプル。パーティションさえ均等なら割と簡単にスケールする⼀件単位の書き込みは、ほぼ100マイクロ秒以下現時点で20000/secぐらいの書き込みがある整合性を保ってカウントアップする処理は重い複数ノードを跨いでCASやロックが必要になる
読み込みの概要ClientClientR2R2R3R311234456789101112R1R1 replica node failedcoodinator noderesends aftertimeoutChosen nodeCoordinator nodehttps://docs.datastax.com/ja/cassandra-jajp/3.0/cassandra/dml/dmlClientRequestsRead.html
読み込みの概要https://docs.datastax.com/ja/cassandra-jajp/3.0/cassandra/dml/dmlAboutReads.html
読み込みパフォーマンス特性⼀件単位の読み込みに向いている多くのデータをまとめて取得するには不向き取得対象のパーティションとノード特定にCPUを使うクラスタのノード間でデータの通信が多く発⽣するパーティション毎のdigest要求read repair
prestoでの利⽤は本来は不向きパーティション数とノード数でバランスを取ることで何とか⽬的のパフォーマンスを維持
テーブル設計の重要性読み込みワークロードに合わせてテーブルを設計する、でないとまともにパフォーマンスが出ない。ユースケース毎にテーブルがあり、データの重複は覚悟する。とにかくパーティションキー以外を条件にクエリしないこと。
まとめ読み込みパターンに合わせたテーブル設計をすること⽤途が適切ならかなりのパフォーマンスが出せるパーティション数とデータの分散度合いのコントロールが重要
その他のTipsCPU、ディスクI/O、ネットワークそれぞれかなり影響があるのでメトリックをちゃんと取得しておくことホットデータはオンメモリで読み書きするのでメモリは多くセカンダリインデックスは基本使えない