2016-04-08 2 views
1

私は、私のFacebookアカウントの投稿詳細を保存するために使用される列ファミリー投稿を持っています。私はcassandra 2.0.9とdatastax java driver 3.0を使用しています。同じ列が頻繁に削除され、同じ列が挿入されるため、cassandraでデータが失われる

CREATE TABLE posts (
    key blob, 
    column1 text, 
    value blob, 
    PRIMARY KEY ((key), column1) 
) WITH COMPACT STORAGE; 

ここで、rowkeyはmyuserid、columnkeyはpostid、valueはpost jsonです。ブラウザでアプリケーションを更新するたびに、Facebookのデータをフェッチし、既存のpostidのデータを削除して追加します。キャサンドラからの投稿が欠けていることがあります。行の同じ列に頻繁に削除して挿入するとデータが失われることがありますか?どうすればこれを管理できますか?

答えて

3

それはあなたが(何千もの更新/秒のような)非常に高い周波数で同じ列を更新している場合は、予測不可能な結果を​​有することができ、本当にdatalossではありません。

なぜですか? カッサンドラは、タイムスタンプを使用しているため、異なるレプリカからの同じ列のタイムスタンプを比較することによって、読み取り時に正しい値を判断できます。

現在のところ、タイムスタンプの解像度はミリ秒のオーダーであるため、更新レートが非常に高い場合(たとえば、同じミリ秒で同じ列で2回更新された場合)、JSONの大きなポストが勝ちます。

大きくすると、postJson1.compareTo(postJson2)を使用しています。順序はカラムのタイプで決定されます。その場合は文字列なので、カサンドラはポストJSONデータを辞書的に比較することでネクタイを解きます。

これを避けるには、独自のtimmeuuid()を生成してクライアント側で書き込みタイムスタンプを指定します。

たとえば、Javaドライバクラスを使用して、このようなTimeUUIDを生成するための多くの手段がありますcom.datastax.driver.core.utils.UUIDs.timeBased()

関連する問題