3

私はMongoDBとCassandraについて読んでいます。MongoDBはマスター/スレーブですが、Cassandraはマスターレスです(すべてのノードが等しい)。私の疑問は、データがこれらの両方にどのように保存されるかについてです。

ユーザーがMongoDB(マスターと異なるスレーブがそれぞれ別々のマシンにあるクラスター)にリクエストを書き込んでいるとしましょう。これは、マスターが(またはアプリケーションの実装を通じて)この更新を書き込むスレーブを決定することを意味します。つまり、MongoDBのすべてのノードで同じデータを使用できるわけではありません。各ノードサイズは異なる場合があります。私は正しいですか?また、照会すると、マスターはこの要求をどのノードに送信する必要があるかを認識しますか?

cassandraの場合、同じデータがすべてのノードに書き込まれます。つまり、1つのノードサイズが10GBの場合、他のノードサイズも10GBになります。これだけの場合、1つのノードに障害が発生しても、ユーザーは別のノードでクエリを実行してもデータを失うことはありません。私はここにいますか?私が正しければ、すべてのノードで同じデータを利用できます。それでは、Cassandraでmap / reduce関数を使用する利点は何ですか?私が間違っている場合、同じデータが他のノードで利用できないため、Cassandraで可用性がどのように維持されますか?

私はMongoDBとcassandraについてstackoverflowで検索していて、約10の投稿を読みましたが、それらの投稿の回答では質問をクリアできませんでした。私の疑問を解消してください。私が間違って想定していた場合は、私も訂正してください。

4

3 に答える 3

1

私は NoSQL ストアに関する論文を書いたので、Cassandra のほとんどの部分を正しく覚えていることを願っています。

Cassandra は、レプリケーションとシャーディングを継承する Amazon Dynamo と、データモデルを取得する Google の BigTable を組み合わせたものです。そのため、Cassandra は基本的にデータをシャーディングし、そのコピーを他のノードに保持します。A から E までのノードを持つ 5 つのノード クラスターを考えてみましょう。キーはコンシステント ハッシュによってキーリングにハッシュされ、キーリングの連続した領域が特定のノードに格納されます。したがって、値の範囲が 1 から 100 の場合、デフォルトでは各ノードがリングの 1/5 を取得します。A の範囲は [1,20)、B の範囲は [20,40) などです。
Dynamo の重要な概念は、指定された値を読み取り、書き込み、保持する必要があるノードの数を示すトリプル (R、W、N) です。
デフォルトでは、データの 3 (N) 個のコピーがあり、プライマリ ノードとバックアップを保持する 2 つの後続ノードに保存されます。Dynamo の論文を思い出したとき、書き込みは Default に従って N 個のコピーの最初の W ノードに行われ、他のノードは最終的に Gossip Protocol を介して更新されます。
すべてが順調に進んでいる限り、一貫した結果が得られます。プライマリ ノードがしばらくダウンしている場合は、ヒント付きのハンドオフを通じて別のノードがデータを取得します。プライマリが戻ってくると、データがマージされるか、マージされようとします (この部分はよく覚えていませんが、更新履歴を伝えるために使用されるベクトル クロックを確認してください)。そのため、クラスターの大きな部分がダウンしなくても、データの一貫したビューが得られます。ノードの大部分がダウンしている場合、またはコピーのごく一部のみから要求した場合、不整合が発生する可能性がありますが、最終的には一貫性が保たれる可能性があります。お役に立てば幸いです。Amazon DynamoGoogle BigTable
に関する元の論文を読むことを強くお勧めします。、しかし、あなたは主に Amazon Dynamo に興味があると思います。さらに、 Werner Vogelsのこの投稿も役に立つかもしれません。
シャーディングのサイズに関しては、お使いのマシンと、キーリングの特定の領域がどれほど熱くなっているかによって異なると思います。

于 2012-05-30T15:01:30.473 に答える
1

MongoDB に関しては、そうです、プライマリは 1 つしかありません。

セカンダリにすべてのデータがあることを意味するため、すべてが同期している限り、どのセカンダリもプライマリになることができます。各ノードはディスク上のサイズが同じである必要はなく、これはレプリケーションがいつ行われたかによって異なりますが、データは同じです (同期している限り)。

私はカサンドラについてあまり知りません、ごめんなさい!

于 2012-05-30T14:37:43.457 に答える
0

通常、Cassandra はすべてのデータをすべてのノードに保持するわけではありません。あなたが示唆するように、これは分散データモデルによって提供されるいくつかの利点を無効にします (特に、高速書き込みが妨げられます)。必要なレプリケーションの量 (データのコピーを保持する必要があるノードの数) は、クライアントが書き込み時にカスタマイズできます。そのため、すべてのノード間で複製するように設定することも、複製なしで単一のノードにデータを保持するように設定することもできます。それはあなた次第です。データが書き込まれる特定のノードは、キーのハッシュ値によって決定されます。各ノードには、格納するハッシュ値の範囲が割り当てられているため、値を検索すると、再びキーがハッシュされ、データを検索するノードが示されます。

于 2012-05-30T15:16:36.440 に答える