SlideShare a Scribd company logo
-  データ読み書き編  - 2010/4/28 Cassandra 勉強会 @yukim の仕組み
翻訳者募集中 ! 森下 雄貴 @yukim Cassandra wiki 翻訳に参加してます http:// wiki.apache.org/cassandra/FrontPage_JP
= Bigtable + Dynamo +  α
Bigtable + α のリッチなデータモデル Keyspace ColumnFamily Column Column Column Column Column Column Column Column Column Key Key Key ColumnFamily Column Column Column Key Key SuperColumn Column Column Column SuperColumn Column Column Column SuperColumn Column Column Column SuperColumn
Dynamo をベースとした P2P の分散ハッシュテーブル キーを元に計算されたトークンがどのレンジに属するかによって、データを保持するノードが決まる。 A D G K O C
Dynamo をベースとした P2P の分散ハッシュテーブル レプリケーション戦略に基づいたデータのレプリカを保持する。 Eventual Consistent A D G K O C
Cassandra はどのノードに対しても読み書き可能。 SPoF なし。 Dynamo をベースとした P2P の分散ハッシュテーブル
操作ごとに制御可能な一貫性レベル W + R > N W:  書き込み時のレベル R:  読み込み時のレベル N:  レプリカ数 強い一貫性が得られる ZERO ANY ONE QUORUM (N/2 + 1) ALL ZERO ANY ONE QUORUM (N/2 + 1) ALL Read Write
現時点で最新の 0.6.1 をベースに 今日は書き込みと読み込みの話 Cassandra の読み書きの仕組みを紐解いてみる
書き込み編
クライアントは一貫性レベルを指定して、データの書き込み ( 登録 / 更新 / 削除 ) 要求をクラスタ内のノードに送信。 要求を受けたノードは、どのノードにデータを保持するかを決定し、要求をフォワードする。 insert batch_mutate remove 書き込み要求 データを保持するノードへ要求をフォワード
書き込み要求 トークンを計算し、データを保持するノードを決定 レプリケーションを保持するノードを決定 Hinted Handoff  の必要性を検証 一貫性レベルに応じて挙動がかわる。 を行い書き込み要求をフォワードするノードを決定。 ( ローカルの場合もある ) ZERO 非同期でフォワードを行う。クライアントにすぐ返るが、何も保証されない。 ANY 以上 指定された一貫性レベルの数だけフォワード先からレスポンスが返った場合のみクライアントにレスポンスを返す。どこかでエラーが発生したら TimeoutException 。
1. トークンを計算し、データを保持するノードを決定 <Partitioner> org.apache.cassandra.dht.RandomPartitioner </Partitioner> プラッガブル パーティショニング方法 (IPartitioner の実装 ) に基づいてどのノードに属するデータかを決定 RandomPartitioner キーの MD5 ハッシュを元にトークン生成。 OrderingPreservedPartitioner CollatingOrderPreservingPartitioner
2.  レプリケーションを保持するノードを決定 レプリケーション戦略 RackUnawareStrategy RackAwareStrategy DatacenterShardStrategy こちらもプラッガブル <ReplicaPlacementStrategy> org.apache.cassandra.locator.RackUnawareStrategy </ReplicaPlacementStrategy>
3. Hinted Handoff の必要性を判定 ノード故障の判定 本来そのデータを保持するはずだったノードの情報( Hint) をつけて、別のノードにそのデータを格納しておく。 Hinted Handoff を受けとったノードは本来保持するノードのアドレスを SYSTEM テーブルへ保持。 Hinted Handoff “ ϕ accrual failure detector” - ϕ 漸増型故障検出器
書き込み要求を受け取ったノードでは… CommitLog Memtable SSTable フラッシュ (flush) =>  非同期 メモリ上 ディスク上
設定 ( デフォルト :128MB) されたサイズに到達するとログがローテートされる コミットログヘッダ RowMutation +  チェックサム (CRC32) CF ごとのダーティフラグ CF ごとのファイルポジション リプレイを開始するポジション リプレイが必要か CommitLog セグメント CommitLog すべての書き込み操作 (RowMutation) を記録。 すべての ColumnFamiliy の Memtable が SSTable に書き込まれたら削除される。 ノード起動時に CommitLog があればリカバリーが実行される。リカバリー後は強制フラッシュされ、一旦 CommitLog はクリア。 RowMutation +  チェックサム (CRC32) RowMutation +  チェックサム (CRC32)
periodic ( デフォルト ) CommitLog への書き込みは待たず、 Memtable へ書き込みに行く。 < CommitLogSyncPeriodInMS > で指定されたミリ秒ごとに CommitLog への書き込みバッファをデバイスへ書き込み。 batch CommitLog への書き込み完了を待ってから、 Memtable へ書き込みに行く。 < CommitLogSyncBatchWindowInMS > ??? <CommitLogSync> CommitLog <CommitLogDirectory> <CommitLogRotationThresholdInMB> CommitLog をローテートする閾値 CommitLog を保持するディレクトリ
Memtable Key Column Column Column Token で ソート カラム名でソート Memtable メモリ上のデータモデル。 ColumnFamily ごとに保持されている。 (Token, Key) ColumFamily (Token, Key) (Token, Key) OrderPreservingPartitioner のみ キーでのソートが保証される
Memtable < MemtableThroughputInMB > < MemtableFlushAfterMinutes > < MemtableOperationsInMillions > フラッシュされるまでの閾値。 保持されるカラム数の最大値  ( デフォルト : 0.3) フラッシュされるまでの閾値。 Memtable に対して行われた操作の総データ量 ( デフォルト : 64) フラッシュされるまでの閾値。 この時間がたってもまだフラッシュされていなければ強制フラッシュ。  本番環境では多めに設定しておいたほうが良い。 ( デフォルト : 60)
Memtable が閾値を超えると、 非同期で Memtable の内容がディスクに書き出される。その際 Bloom Filter 、 Index が一緒にディスクに書き出される。 一度書き出したら不変。 コンパクション (Compaction) で複数の SSTable を 1 つにまとめられる。 SSTable Bloom Filter Index Data Memtable の内容が格納されたデータファイル。 あるキーがデータファイルに存在するか ( ただし偽陽性 ) をコンパクトに 知るためのファイル。 ( おそらく )  キーに対応するデータの位置を保存。
マイナーコンパクション 同じ程度のサイズの SSTable を 1 つにまとめる。 メジャーコンパクション 1 つにマージ。 コンパクション (Compaction) 2 種類のコンパクション ディスクの残りに注意 すべての SSTable ファイルをマージして新しくファイルを作成したあと、元の SSTable ファイルを削除する。 容量が足りない場合はコンパクションが行われない。 ( ログにエラー出力 ) ディスクの残量に注意 !
分散してレプリカを持つため、ノードがダウンしていた場合、削除要求を受け取れない。また、同期をとってすべてのノードからデータを削除するタイミングが難しい。 ( 補足 )  データの削除 分散環境での削除 Tombstone と <GCGraceSeconds> すべてのレプリカに Tombstone フラグが行き渡っていればメジャーコンパクション時に削除される。 削除要求を受け取っていないデータがある場合は、  <GCGraceSeconds> で定義された秒数 ( デフォルト :10 日 ) が経過すると削除可能と判断する。
読み込み編
読み込み要求 一貫性レベルに応じて挙動がかわる。 ONE トークンを計算し、データを保持する一番近いノードを決定。 そのノードに読み取り要求を送信。 データを受け取ったらクライアントに返す。 QUORUM 以上 トークンを計算し、データを保持する一番近いノードを決定。 レプリケーションを保持するノードを決定。 一番近いノードにデータの読み取り要求を送信。ほかのノードにはダイジェストのみの読み取り要求を送信。 一貫性レベルで指定された数のレスポンスが返ってくるまで待つ。 ダイジェストが一致していれば、読み取ったデータをクライアントに返す。 ダイジェストに不一致があれば実データを読み込みにいき、 Read Repair を実行。
Read Repair 読み込み時、各レプリカに違いがあった場合、最新のデータでレプリカを修復。 修復はバックグラウンドで行われる。 読み込み速度を UP したい場合は off にもできる。 ( <DoConsistencyChecksBoolean>)
読み込み要求を受けたノードでは… Memtable SSTable メモリ上 ディスク上 読み込み Row Cache
Row Cache 1 行分のデータをキャッシュ。たとえ 1 部のカラムの値のみの問い合わせてもすべてのカラムをキャッシュとして保持する。 デフォルトではオフ。 Key Cache(0.6.0 から ) SSTable 内のデータの位置をキャッシュ。 キャッシュ Cassandra は 2 種類のキャッシュを備える
Bloom Filter 、 Index の活用 Memtable 、 SSTable からの読み込み すべての SSTable ファイルからあるキーを探し出す必要があるため、極力ムダを省きたい。 まず Bloom Filter をチェックし、読み込む SSTable のファイルを絞り込む。
まとめ Cassandra は内部的に CommitLog 、 Memtable 、 SSTable の 3 つの物理的なデータ構造を持っている。 書き込みは CommitLog への追記  + Memtable への書き込みで終了、なので高速。 読み込み時は Memtable と全ての SSTable からデータを探すので若干遅い。けど Bloom Filter 、 Cache 等で工夫して高速化している。 内部構造を知っておいた方が環境構築にもデータモデルの設計にも運用にも役立つはず。

More Related Content

What's hot (20)

NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例
Amazon Web Services Japan
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
NTT DATA Technology & Innovation
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
Hibino Hisashi
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
MongoDBの監視
MongoDBの監視MongoDBの監視
MongoDBの監視
Tetsutaro Watanabe
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
Akihiro Kuwano
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較
Yoshiyasu SAEKI
 
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Hironobu Isoda
 
ビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年version
Tetsutaro Watanabe
 
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
事例で学ぶApache Cassandra
事例で学ぶApache Cassandra事例で学ぶApache Cassandra
事例で学ぶApache Cassandra
Yuki Morishita
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
takezoe
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
NTT DATA Technology & Innovation
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
Hibino Hisashi
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
Akihiro Kuwano
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較
Yoshiyasu SAEKI
 
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall ) LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Hironobu Isoda
 
ビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年versionビッグデータ処理データベースの全体像と使い分け
2018年version
ビッグデータ処理データベースの全体像と使い分け
2018年version
Tetsutaro Watanabe
 
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
事例で学ぶApache Cassandra
事例で学ぶApache Cassandra事例で学ぶApache Cassandra
事例で学ぶApache Cassandra
Yuki Morishita
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
takezoe
 

Similar to Cassandraのしくみ データの読み書き編 (20)

cassandra調査レポート
cassandra調査レポートcassandra調査レポート
cassandra調査レポート
Akihiro Kuwano
 
社内サーバインフラ勉強会(DB)
社内サーバインフラ勉強会(DB)社内サーバインフラ勉強会(DB)
社内サーバインフラ勉強会(DB)
Masahiro NAKAYAMA
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
Daiyu Hatakeyama
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
弘毅 露崎
 
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識
MKT International Inc.
 
20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public
Amazon Web Services Japan
 
Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズ
SORACOM, INC
 
Guide to Cassandra for Production Deployments
Guide to Cassandra for Production DeploymentsGuide to Cassandra for Production Deployments
Guide to Cassandra for Production Deployments
smdkk
 
第31回「今アツい、分散ストレージを語ろう」(2013/11/28 on しすなま!)
第31回「今アツい、分散ストレージを語ろう」(2013/11/28 on しすなま!)第31回「今アツい、分散ストレージを語ろう」(2013/11/28 on しすなま!)
第31回「今アツい、分散ストレージを語ろう」(2013/11/28 on しすなま!)
System x 部 (生!) : しすなま! @ Lenovo Enterprise Solutions Ltd.
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
tripodworks
 
Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化
Takekazu Omi
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
Shoken Fujisaki
 
AutoDock_Raccoon_japanese_ver.1.0
AutoDock_Raccoon_japanese_ver.1.0AutoDock_Raccoon_japanese_ver.1.0
AutoDock_Raccoon_japanese_ver.1.0
Satoshi Kume
 
SQL Server 入門
SQL Server 入門SQL Server 入門
SQL Server 入門
Tsuyoshi Kitagawa
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
 
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
Insight Technology, Inc.
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
matsuo kenji
 
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
maruyama097
 
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
softlayerjp
 
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
chenree3
 
cassandra調査レポート
cassandra調査レポートcassandra調査レポート
cassandra調査レポート
Akihiro Kuwano
 
社内サーバインフラ勉強会(DB)
社内サーバインフラ勉強会(DB)社内サーバインフラ勉強会(DB)
社内サーバインフラ勉強会(DB)
Masahiro NAKAYAMA
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
Daiyu Hatakeyama
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
弘毅 露崎
 
LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識LTO/オートローダー/仮想テープライブラリの基礎知識
LTO/オートローダー/仮想テープライブラリの基礎知識
MKT International Inc.
 
Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズ
SORACOM, INC
 
Guide to Cassandra for Production Deployments
Guide to Cassandra for Production DeploymentsGuide to Cassandra for Production Deployments
Guide to Cassandra for Production Deployments
smdkk
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
tripodworks
 
Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化Persistence on Azure - Microsoft Azure の永続化
Persistence on Azure - Microsoft Azure の永続化
Takekazu Omi
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
Shoken Fujisaki
 
AutoDock_Raccoon_japanese_ver.1.0
AutoDock_Raccoon_japanese_ver.1.0AutoDock_Raccoon_japanese_ver.1.0
AutoDock_Raccoon_japanese_ver.1.0
Satoshi Kume
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
 
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
Insight Technology, Inc.
 
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
maruyama097
 
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
softlayerjp
 
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
B 8スポンサー講演資料 osnexus steven umbehocker (アファーム・ビジネスパートナーズ株)
chenree3
 

More from Yuki Morishita (11)

Apache cassandra v4.0
Apache cassandra v4.0Apache cassandra v4.0
Apache cassandra v4.0
Yuki Morishita
 
DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門
Yuki Morishita
 
Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界
Yuki Morishita
 
DataStax Enterpriseによる大規模グラフ解析
DataStax Enterpriseによる大規模グラフ解析DataStax Enterpriseによる大規模グラフ解析
DataStax Enterpriseによる大規模グラフ解析
Yuki Morishita
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
Yuki Morishita
 
サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方
Yuki Morishita
 
分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph
Yuki Morishita
 
Apache Cassandra最新情報まとめ
Apache Cassandra最新情報まとめApache Cassandra最新情報まとめ
Apache Cassandra最新情報まとめ
Yuki Morishita
 
Datastax Enterpriseをはじめよう
Datastax EnterpriseをはじめようDatastax Enterpriseをはじめよう
Datastax Enterpriseをはじめよう
Yuki Morishita
 
How you can contribute to Apache Cassandra
How you can contribute to Apache CassandraHow you can contribute to Apache Cassandra
How you can contribute to Apache Cassandra
Yuki Morishita
 
CQL3 in depth
CQL3 in depthCQL3 in depth
CQL3 in depth
Yuki Morishita
 
DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門DataStax EnterpriseでApache Tinkerpop入門
DataStax EnterpriseでApache Tinkerpop入門
Yuki Morishita
 
Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界
Yuki Morishita
 
DataStax Enterpriseによる大規模グラフ解析
DataStax Enterpriseによる大規模グラフ解析DataStax Enterpriseによる大規模グラフ解析
DataStax Enterpriseによる大規模グラフ解析
Yuki Morishita
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
Yuki Morishita
 
サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方サンプルで学ぶCassandraアプリケーションの作り方
サンプルで学ぶCassandraアプリケーションの作り方
Yuki Morishita
 
分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph
Yuki Morishita
 
Apache Cassandra最新情報まとめ
Apache Cassandra最新情報まとめApache Cassandra最新情報まとめ
Apache Cassandra最新情報まとめ
Yuki Morishita
 
Datastax Enterpriseをはじめよう
Datastax EnterpriseをはじめようDatastax Enterpriseをはじめよう
Datastax Enterpriseをはじめよう
Yuki Morishita
 
How you can contribute to Apache Cassandra
How you can contribute to Apache CassandraHow you can contribute to Apache Cassandra
How you can contribute to Apache Cassandra
Yuki Morishita
 

Cassandraのしくみ データの読み書き編

  • 1. - データ読み書き編 - 2010/4/28 Cassandra 勉強会 @yukim の仕組み
  • 2. 翻訳者募集中 ! 森下 雄貴 @yukim Cassandra wiki 翻訳に参加してます http:// wiki.apache.org/cassandra/FrontPage_JP
  • 3. = Bigtable + Dynamo + α
  • 4. Bigtable + α のリッチなデータモデル Keyspace ColumnFamily Column Column Column Column Column Column Column Column Column Key Key Key ColumnFamily Column Column Column Key Key SuperColumn Column Column Column SuperColumn Column Column Column SuperColumn Column Column Column SuperColumn
  • 5. Dynamo をベースとした P2P の分散ハッシュテーブル キーを元に計算されたトークンがどのレンジに属するかによって、データを保持するノードが決まる。 A D G K O C
  • 6. Dynamo をベースとした P2P の分散ハッシュテーブル レプリケーション戦略に基づいたデータのレプリカを保持する。 Eventual Consistent A D G K O C
  • 7. Cassandra はどのノードに対しても読み書き可能。 SPoF なし。 Dynamo をベースとした P2P の分散ハッシュテーブル
  • 8. 操作ごとに制御可能な一貫性レベル W + R > N W: 書き込み時のレベル R: 読み込み時のレベル N: レプリカ数 強い一貫性が得られる ZERO ANY ONE QUORUM (N/2 + 1) ALL ZERO ANY ONE QUORUM (N/2 + 1) ALL Read Write
  • 9. 現時点で最新の 0.6.1 をベースに 今日は書き込みと読み込みの話 Cassandra の読み書きの仕組みを紐解いてみる
  • 11. クライアントは一貫性レベルを指定して、データの書き込み ( 登録 / 更新 / 削除 ) 要求をクラスタ内のノードに送信。 要求を受けたノードは、どのノードにデータを保持するかを決定し、要求をフォワードする。 insert batch_mutate remove 書き込み要求 データを保持するノードへ要求をフォワード
  • 12. 書き込み要求 トークンを計算し、データを保持するノードを決定 レプリケーションを保持するノードを決定 Hinted Handoff の必要性を検証 一貫性レベルに応じて挙動がかわる。 を行い書き込み要求をフォワードするノードを決定。 ( ローカルの場合もある ) ZERO 非同期でフォワードを行う。クライアントにすぐ返るが、何も保証されない。 ANY 以上 指定された一貫性レベルの数だけフォワード先からレスポンスが返った場合のみクライアントにレスポンスを返す。どこかでエラーが発生したら TimeoutException 。
  • 13. 1. トークンを計算し、データを保持するノードを決定 <Partitioner> org.apache.cassandra.dht.RandomPartitioner </Partitioner> プラッガブル パーティショニング方法 (IPartitioner の実装 ) に基づいてどのノードに属するデータかを決定 RandomPartitioner キーの MD5 ハッシュを元にトークン生成。 OrderingPreservedPartitioner CollatingOrderPreservingPartitioner
  • 14. 2. レプリケーションを保持するノードを決定 レプリケーション戦略 RackUnawareStrategy RackAwareStrategy DatacenterShardStrategy こちらもプラッガブル <ReplicaPlacementStrategy> org.apache.cassandra.locator.RackUnawareStrategy </ReplicaPlacementStrategy>
  • 15. 3. Hinted Handoff の必要性を判定 ノード故障の判定 本来そのデータを保持するはずだったノードの情報( Hint) をつけて、別のノードにそのデータを格納しておく。 Hinted Handoff を受けとったノードは本来保持するノードのアドレスを SYSTEM テーブルへ保持。 Hinted Handoff “ ϕ accrual failure detector” - ϕ 漸増型故障検出器
  • 16. 書き込み要求を受け取ったノードでは… CommitLog Memtable SSTable フラッシュ (flush) => 非同期 メモリ上 ディスク上
  • 17. 設定 ( デフォルト :128MB) されたサイズに到達するとログがローテートされる コミットログヘッダ RowMutation + チェックサム (CRC32) CF ごとのダーティフラグ CF ごとのファイルポジション リプレイを開始するポジション リプレイが必要か CommitLog セグメント CommitLog すべての書き込み操作 (RowMutation) を記録。 すべての ColumnFamiliy の Memtable が SSTable に書き込まれたら削除される。 ノード起動時に CommitLog があればリカバリーが実行される。リカバリー後は強制フラッシュされ、一旦 CommitLog はクリア。 RowMutation + チェックサム (CRC32) RowMutation + チェックサム (CRC32)
  • 18. periodic ( デフォルト ) CommitLog への書き込みは待たず、 Memtable へ書き込みに行く。 < CommitLogSyncPeriodInMS > で指定されたミリ秒ごとに CommitLog への書き込みバッファをデバイスへ書き込み。 batch CommitLog への書き込み完了を待ってから、 Memtable へ書き込みに行く。 < CommitLogSyncBatchWindowInMS > ??? <CommitLogSync> CommitLog <CommitLogDirectory> <CommitLogRotationThresholdInMB> CommitLog をローテートする閾値 CommitLog を保持するディレクトリ
  • 19. Memtable Key Column Column Column Token で ソート カラム名でソート Memtable メモリ上のデータモデル。 ColumnFamily ごとに保持されている。 (Token, Key) ColumFamily (Token, Key) (Token, Key) OrderPreservingPartitioner のみ キーでのソートが保証される
  • 20. Memtable < MemtableThroughputInMB > < MemtableFlushAfterMinutes > < MemtableOperationsInMillions > フラッシュされるまでの閾値。 保持されるカラム数の最大値 ( デフォルト : 0.3) フラッシュされるまでの閾値。 Memtable に対して行われた操作の総データ量 ( デフォルト : 64) フラッシュされるまでの閾値。 この時間がたってもまだフラッシュされていなければ強制フラッシュ。 本番環境では多めに設定しておいたほうが良い。 ( デフォルト : 60)
  • 21. Memtable が閾値を超えると、 非同期で Memtable の内容がディスクに書き出される。その際 Bloom Filter 、 Index が一緒にディスクに書き出される。 一度書き出したら不変。 コンパクション (Compaction) で複数の SSTable を 1 つにまとめられる。 SSTable Bloom Filter Index Data Memtable の内容が格納されたデータファイル。 あるキーがデータファイルに存在するか ( ただし偽陽性 ) をコンパクトに 知るためのファイル。 ( おそらく ) キーに対応するデータの位置を保存。
  • 22. マイナーコンパクション 同じ程度のサイズの SSTable を 1 つにまとめる。 メジャーコンパクション 1 つにマージ。 コンパクション (Compaction) 2 種類のコンパクション ディスクの残りに注意 すべての SSTable ファイルをマージして新しくファイルを作成したあと、元の SSTable ファイルを削除する。 容量が足りない場合はコンパクションが行われない。 ( ログにエラー出力 ) ディスクの残量に注意 !
  • 23. 分散してレプリカを持つため、ノードがダウンしていた場合、削除要求を受け取れない。また、同期をとってすべてのノードからデータを削除するタイミングが難しい。 ( 補足 ) データの削除 分散環境での削除 Tombstone と <GCGraceSeconds> すべてのレプリカに Tombstone フラグが行き渡っていればメジャーコンパクション時に削除される。 削除要求を受け取っていないデータがある場合は、 <GCGraceSeconds> で定義された秒数 ( デフォルト :10 日 ) が経過すると削除可能と判断する。
  • 25. 読み込み要求 一貫性レベルに応じて挙動がかわる。 ONE トークンを計算し、データを保持する一番近いノードを決定。 そのノードに読み取り要求を送信。 データを受け取ったらクライアントに返す。 QUORUM 以上 トークンを計算し、データを保持する一番近いノードを決定。 レプリケーションを保持するノードを決定。 一番近いノードにデータの読み取り要求を送信。ほかのノードにはダイジェストのみの読み取り要求を送信。 一貫性レベルで指定された数のレスポンスが返ってくるまで待つ。 ダイジェストが一致していれば、読み取ったデータをクライアントに返す。 ダイジェストに不一致があれば実データを読み込みにいき、 Read Repair を実行。
  • 26. Read Repair 読み込み時、各レプリカに違いがあった場合、最新のデータでレプリカを修復。 修復はバックグラウンドで行われる。 読み込み速度を UP したい場合は off にもできる。 ( <DoConsistencyChecksBoolean>)
  • 27. 読み込み要求を受けたノードでは… Memtable SSTable メモリ上 ディスク上 読み込み Row Cache
  • 28. Row Cache 1 行分のデータをキャッシュ。たとえ 1 部のカラムの値のみの問い合わせてもすべてのカラムをキャッシュとして保持する。 デフォルトではオフ。 Key Cache(0.6.0 から ) SSTable 内のデータの位置をキャッシュ。 キャッシュ Cassandra は 2 種類のキャッシュを備える
  • 29. Bloom Filter 、 Index の活用 Memtable 、 SSTable からの読み込み すべての SSTable ファイルからあるキーを探し出す必要があるため、極力ムダを省きたい。 まず Bloom Filter をチェックし、読み込む SSTable のファイルを絞り込む。
  • 30. まとめ Cassandra は内部的に CommitLog 、 Memtable 、 SSTable の 3 つの物理的なデータ構造を持っている。 書き込みは CommitLog への追記 + Memtable への書き込みで終了、なので高速。 読み込み時は Memtable と全ての SSTable からデータを探すので若干遅い。けど Bloom Filter 、 Cache 等で工夫して高速化している。 内部構造を知っておいた方が環境構築にもデータモデルの設計にも運用にも役立つはず。