2017-05-15 36 views
0

私はCassandraを使用するプロジェクトを行っていますが、私は最適化ポイントで困惑しました。私たちは、読み取り動作がCassandraにかなり負荷がかかることを考慮して、データベース構造を変更したいと考えています。Cassandra書き込みロック

ドキュメントとフォーラムを検索して回答しましたが、次の質問に対する明確な答えが見つかりませんでした。

現在、私たちは小さなバッチでカサンドラに書き込み、読書は継続的に行われます。バッチを大きくして10分から15分ごとにテーブルの半分のように変えたいと思っています。そして、私が見つけることができる限り、カサンドラは書き込み動作を適用するときにだけ行をロックします。しかしこれは本当ですか?それとも、それを書き込むときにテーブル全体をロックしますか?そして、(ちょっと愚かな質問かもしれませんが)書き込みロックがある間に読むことができますか? (なぜなら、書き込みロック権だけがある場合にはまだ読めるチャンスがあるからです)。

ドキュメントにこの種のフローは表示されず、以前に質問されたことがないようです。 ありがとうございました!

+0

こんにちは。 [最小限の完全かつ検証可能なサンプルを作成する方法](http:// stackoverflow。com/help/mcve)を開き、あなたの質問を更新して、動作を示す例とこれまでに試したことを示してください。具体的には、関連する部分は、更新の実行方法、テーブルの行数、実行されている頻度と読み込み、つまり取得された行を意味します。 – danny

答えて

2

Cassandraにはロックがありません。行ロックについてはどこで読んだのですか?

カサンドラは、「追加のみ」の書き込みとして機能し、圧縮中に「古い」データが削除されます。

あなたがやっているすべての変更で、多くの「古くなった」セルを作成することができます。読み込み量が多いので、行の変更回数が多いので、LCSを使用することをおすすめしますそのようなワークフローの多く

5

カサンドラは、Cassandraのバッチ中

行をロックしていないが、原子性を達成するために使用されます。 Atomicは、バッチのいずれかが成功すると、そのバッチのすべてが成功することを意味します。

アトミック性を実現するために、デフォルトでは、Cassandraはシリアル化されたバッチを最初にblobデータとしてシリアル化されたバッチを消費するbatchlogシステムテーブルに書き込みます。バッチ内の行が正常に書き込まれ、永続化(またはヒント)されると、バッチログデータは削除されます。

アトミックバッチはアトミック性を保証しますが、 バッチ分離はありません。クライアントはバッチから最初に更新された行を読み取ることができますが、他の行はサーバー上でまだ更新されています。ただし、パーティションキー内のトランザクション行の更新は隔離されています。クライアントは部分的な更新を読み取ることができません。

出典:http://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html

もう一つはバッチサイズが小さくなければならないことをお勧めします。バッチサイズが50Kであるとき、あなたのバッチサイズは5Kであるとき

batch_size_warn_threshold_in_kb: 5 
batch_size_fail_threshold_in_kb: 50 

だから、警告がログに記録されますと: batch_size_warn_threshold_in_kbbatch_size_fail_threshold_in_kb

デフォルト値を変更することはお勧めしませんcassandra.yamlで2つの構成プロパティがありますが、あなたのバッチは失敗します。

関連する問題