3

デフォルトの Cassandra キャッシュ設定で Hector を使用して CF から行を読み取っています。これは、キー キャッシュがオンになっていることを意味します。jconsole を使用してキー キャッシュ ヒットを監視しています。

しかし、単一の行を (主キーで) 100 回読み取った後でも、キャッシュ ヒットは増加しません。行は最近更新されました。

キー キャッシュが有効になっている場合、Cassandra の読み取りフローはどうなりますか。こんな感じですか?

  1. メモリ内の MemTable で行がチェックされます (最近の挿入/更新後に存在する可能性があります)。
  2. MemTable に見つからない場合は、キー キャッシュでキーがチェックされます。
  3. キーが見つかった場合 (キャッシュ ヒット)、1 シーク、それ以外の場合は 2 シークで行を取得します。

しかしcassandra-clicassandra-jdbc(CQL) を使用すると、異なる結果が得られます。つまり、最近行を更新した場合でも、行から読み取るたびにキー キャッシュ ヒットが発生します。たとえば、100 回読んだら、100 回ヒットします。

この不一致はなぜですか?

自分でもなんとなくわかったのですが、誰かに確認してもらいたいです。

更新すると、更新する列が MemTable にフェッチされるだけのようです。したがって、ヘクターを使用して行を更新したとき、すべての列を更新していませんでした。列だけで、読み取り操作でx同じ列xを読み取っていました。そのため、MemTable に既にあるため、キャッシュ ヒットはありません。

select * from cfCQL の実行中に、他の列もフェッチする結果となったa を実行していましたy。列yは更新されていないため、メモリ (MemTable) に存在しなかったため、キャッシュヒットが発生したと想定しています。

4

1 に答える 1

5

行を読み取ると、Memtable と SSTable の両方が常にチェックされ、結果がマージされます。キー キャッシュは SSTable にのみ使用され、memtable (基本的にはハッシュマップ) には使用されません。

新しい行を書き込み、その後すぐにそれを読み取ると、memtable はおそらくまだフラッシュされておらず、行を保持したままです。この場合、Cassandra はキー キャッシュを調べる必要さえありません。これは、SSTable ブルーム フィルターをすばやくチェックして、その行がまだどの SSTable にも含まれていないことを確認できるためです。したがって、この場合、memtable からの行データは直接返されます。

(nodetool を使用して) memtable の早期フラッシュを強制し、行を数回読み取ると、キー キャッシュが使用され始めることがわかります。

于 2012-08-15T01:30:11.933 に答える