データはどのように書き込まれるか

Cassandraはどのようにデータを書き込み格納するかを理解します。

Cassandraは、書き込みの即時ログ記録から始まり、ディスクへのデータの書き込みが終わるまで、書き込みパスの複数の段階でデータを処理します。
  • コミット・ログへのデータのログ記録
  • memtableへのデータの書き込み
  • memtableからのデータのフラッシュ
  • ディスク上のSSTableへのデータの格納

書き込みのログ記録とmemtableへの保存

書き込みが発生すると、Cassandraはmemtableと呼ばれるメモリー構造にデータを格納し、構成可能な永続性を実現します。さらに、書き込みをディスクのコミット・ログに追記します。このコミット・ログは、Cassandraノードへのすべての書き込みを受け取ります。そしてこれらの永続性のある書き込みは、ノードで電源喪失があっても恒久的に存続します。memtableは、Cassandraがキーで検索するデータ・パーティションのライトバック・キャッシュです。memtableは構成可能な制限に達するまで書き込みを格納し、その後でフラッシュされます。

memtableからのデータのフラッシュ

Cassandraはデータをフラッシュするために、トークンを基準にしてmemtableをソートし、ディスクにデータをシーケンシャルに書き込みます。トークンをディスク上の場所にマップするパーティション・インデックスがディスク上に作成されます。memtableの内容が構成可能なしきい値を超えると、memtableは、ディスクにフラッシュされるキューに置かれます。このキューは、cassandra.yamlファイルのmemtable_heap_space_in_mbまたはmemtable_offheap_space_in_mbの設定で構成できます。フラッシュ対象データがキューのサイズを超えると、Cassandraは次のフラッシュが成功するまで書き込みをブロックします。nodetool flushを使用して、手動でテーブルをフラッシュすることができます。コミット・ログのリプレイ時間を短縮するために、ノードを再起動する前にmemtableをフラッシュすることがベスト・プラクティスです。コミット・ログのリプレイは、中断された操作に際して、失われた書き込みを復元させるためのコミット・ログの読み取りプロセスです。

コミット・ログのデータは、memtableの該当するデータがディスク上のSSTableにフラッシュされた後でパージされます。

ディスク上のSSTableへのデータの格納

memtableとSSTableは、テーブルごとに維持されます。SSTableは不変であり、memtableがフラッシュされた後に再度書き込まれることはありません。この結果、パーティションは通常、複数のSSTableファイルにわたって格納されます。読み取り操作を支援するために他の多くのSSTable構造が存在します。

Cassandraでは、SSTableごとに以下の構造が作成されます。

SSTableとはディスクに格納されたファイルです。SSTableファイルの命名規則は、ファイル・パスを短縮するためにCassandra 2.2以降では変更されています。データ・ファイルはデータ・ディレクトリーに格納されますが、インストール時に場所が変わります。キー・スペースごとに、データ・ディレクトリー内のディレクトリーに各テーブルが格納されます。たとえば、/data/data/ks1/cf1-5be396077b811e3a3ab9dc4b9ac088d/la-1-big-Data.dbはデータ・ファイルを表します。ks1はキー・スペース名を表し、ストリーミングまたは一括読み込みデータを区別します。この例の16進数文字列、5be396077b811e3a3ab9dc4b9ac088dは、テーブル名に追加され、一意のテーブルIDを表します。

複数のファイルが書き込まれ、データ、パーティション・サマリー、統計、および他の情報を格納します。

Cassandraではテーブルごとにサブディレクトリーが作成されるため、選択した物理ドライブやデータ・ボリュームに対してテーブルのsymlinkを作成することができます。これにより、非常にアクティブなテーブルをSSDのような高速メディアに移動してパフォーマンスを向上させたり、接続されているすべてのストレージ・デバイスでテーブルを分配して、ストレージ層のI/Oバランスを改善したりすることが可能になります。