引き続きCassandraについて調査中で、今回はCassandraの内部構造のひとつ、Memtableについて。
Cassandraでの書き込み操作はまずディスク上のCommitLog(書き込み操作のログ)に対して行われ、それからメモリ上のMemtableと呼ばれる構造体に対して書き込まれます。Memtableの構造は以下のようになっていて、ColumnFamily毎に保持されています。Key の列の Token は書き込み要求時にデータを保持するノードを決める際に計算されるものです。
Memtable関連の設定について
conf/storage-conf.xml にMemtable関連の設定項目があります。これらはMemtableがディスクにフラッシュされる(ディスク上のSSTableに非同期で書き込まれる)までの種々のしきい値を設定しています。
・ MemtableThroughputInMB
総データ操作量のしきい値
デフォルトは64(MB)、ColumnFamily単位で設定される
・ MemtableOperationsInMillions
保持されるカラム数のしきい値
デフォルトは0.3(Millionsなので300,000個)、ColumnFamily単位で設定される
・ MemtableFlushAfterMinutes
時間のしきい値
ここで設定した時間が経ってもまだフラッシュされてない場合は強制的にフラッシュされる
デフォルトは60(分)、プロダクション環境では1440などの大きな値の設定が推奨されている(storage-conf.xmlでのコメントより)
メモリ不足でノードが落ちてしまわないように、ColumnFamilyの数とそれぞれのColumnFamilyのカラム数などからきちんとこれらのしきい値を設定しておく必要があります。
分散ストレージ周りは個人で検証環境を用意するのは大変なので、会社のデータセンターを使わせてもらって検証しています。社内導入も真剣に考えていきたいなと思っていますがなかなか難しそうです;
* 関連記事
Cassandra Java Client
Cassandra Thrift APIのConsistencyLevel
Cassandraについて