0

http://www.ibm.com/developerworks/library/os-apache-cassandra/の例から抜粋。本とタグの 2 つのエンティティに関係しているとします。1 つの本には複数のタグがあるため、それらの関係は 1:M です。

記事によると、2 つの列ファミリーを作成する必要があります:BooksTags2BooksIndex. 前者は本に関するすべての情報 (すべてのタグを含む) を格納しますが、後者はタグから本にマップするインデックスであるため、特定のタグについて、そのタグを持つすべての本をすばやく見つけることができます。これらはすべて正常に見えます。しかし、私は質問があります:

データベースに新しい本を追加する方法を検討します: (1) 列ファミリーに新しい行を追加し、(2)この本に関連付けられたすべてのタグ行に新しい本を追加するためにBooks更新します。Tags2BooksIndex

ステップ (1) を完了してから 2 秒後に、新しい本の行がすべてのノードにレプリケートされ、ステップ (2) がまだ進行中であるとします。からこの新しい本の行を読み取っbooksてタグを取得し、このタグを使用して をチェックすると、まだ完全に更新されていないか、更新が行われていTags2BooksIndexないために新しい本が見つからないことがあります。Tags2BooksIndexまだすべてのレプリカ ノードにレプリケートされていません。

このような状況をどのように処理しますか?2 秒を 2 ミリ秒に置き換えます。まだ不整合の時間枠があります。このような状況に対処するための「正しい/実用的な」方法を知りたいです。

4

1 に答える 1

0

Cassandra は CAP の AP 側に分類されます。一貫性を犠牲にします。Cassandra 2.x のバッチ ステートメントを使用すると、役立つ方法があります

ここでの本当の問題は、そのような矛盾の結果がどうなるかということですが? 検索でタグの新しい本が返されないのは 2 分間のウィンドウですか? それは悲惨なことですか?フォールト トレラントな分散システムでは、多くの場合、不整合のポケットを受け入れるか、パーティションが発生する可能性があるため、可用性を犠牲にする必要があります。データモデルに 2 つの個別のアトミック ミューテーションが必要な場合は、バッチ ステートメントが役立ちますが、可用性が少し損なわれます。多少の矛盾があっても問題ない場合は、引き続き利用できます。許容できるものと許容できないものに関する特定のビジネス要件に帰着します。

于 2014-10-22T15:00:31.507 に答える