mongodbはCAP定理のどこに立っていますか?


121

どこを見ても、MongoDBがCPであることがわかります。しかし、掘り下げてみると、最終的には一貫していることがわかります。safe = trueを使用するとCPになりますか?もしそうなら、それは私がsafe = trueで書いた場合、結果を得る前にすべてのレプリカが更新されることを意味しますか?

回答:


104

MongoDBはデフォルトで強い整合性があります。書き込みを行ってから読み取りを行った場合、書き込みが成功したとすると、読み取った書き込みの結果をいつでも読み取ることができます。これは、MongoDBがシングルマスターシステムであり、すべての読み取りがデフォルトでプライマリに送信されるためです。オプションでセカンダリからの読み取りを有効にすると、MongoDBは最終的に整合性がとれ、古い結果を読み取ることが可能になります。

MongoDBは、レプリカセットの自動フェイルオーバーによって高可用性も実現します。http//www.mongodb.org/display/DOCS/Replica+Sets


13
aphyr.com/posts/322-call-me-maybe-mongodb-stale-readsによると、レプリカセットのプライマリノードから読み取った場合でも、古くなったまたはダーティなデータを取得する可能性があります。MongoDBは強い整合性がありますか?
Mike Argyriou 2015

3
カイルによる素晴らしい実験。本当にモンゴを追い詰めます。MongoDBを使用して支払いトランザクションを行うなど、本番システムはあるのでしょうか。それが個人的なWebサイトである場合、強い一貫性を重視します。
2016年

5
参考までに、MongoDB v3.4はKyleによって設計されたテストに合格しました。そのため、MongoDBは、ReplicaSetとShardingを使用しても非常に一貫しています。mongodb.com/ mongodb
Maxime Beugnet

2
MongoDBは構成に基づいて時々可用性を犠牲にする可能性があるため、この答えは少し単純すぎるかもしれません。JoCaは、CA / CP / APが動作する状況をよりよく説明しています
PaoloC

36

Luccasの投稿に同意します。MongoDBがCP / AP / CAであるとは言えません。これは、データベース/ドライバーの構成と障害の種類の両方に応じて、実際にはC、A、Pの間のトレードオフであるためです。より詳細な説明。

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

一貫性:

MongoDBは、単一の接続または正しい書き込み / 読み取りの懸念レベル実行速度が低下します)を使用する場合に、強い整合性があります。これらの条件を満たさなくなると(特に、セカンダリレプリカから読み取る場合)、MongoDBは最終的に整合性が取れた状態になります。

可用性:

MongoDBは、レプリカセットを通じて高可用性を実現します。プライマリーがダウンするか、他のものが使用できなくなるとすぐに、セカンダリーは新しいプライマリーを決定し、再び使用可能になります。これに欠点があります:古いプライマリで行われますが、セカンダリに同期されませんでしたすべての書き込みがされますバックをロールとロールバック・ファイルに保存された、とすぐにそれがセットに再接続するよう(旧プライマリがセカンダリであります今)。したがって、この場合、可用性を確保するために一貫性がある程度犠牲になります。

パーティションの許容度:

上記のレプリカセットを使用することで、MongoDBはパーティションの許容範囲も実現します。レプリカセットのサーバーの半分以上が相互に接続されている限り、新しいプライマリを選択できます。どうして?2つの分離したネットワークが両方とも新しいプライマリを選択できないようにするため。十分なセカンダリが相互に接続されていない場合でも、セカンダリから読み取ることはできますが(一貫性は保証されません)、書き込むことはできません。このセットは、一貫性を保つために実際には利用できません。


したがって、正しい書き込み/読み取りの関心レベルを使用している場合、すべての書き込みと読み取りがプライマリに移動することを意味します(私が正しく理解している場合)。プライマリがダウンした場合に備えて、スタンバイ状態にしてください。
tomer.z 2018

@ tomer.z マニュアルのこのセクションを読むことをお勧めします:セカンダリを使用して読むことができます。「大多数」の読み取りレベルを使用している場合、メンバーの過半数が読み取りを確認するとすぐに読み取りが有効になります。「大多数」の書き込みレベルについても同様です。両方に「多数派」の懸念レベルを使用している場合は、データベースに一貫性があります。マニュアルでこれについてもっと読みたいかもしれません。
JoCa

18

華麗な新品ともいくつか現れたカイルによって素晴らしい実験をこのフィールドにCまたはAとしてMongoDBの、および他のデータベースを標識する場合、あなたは注意する必要があります

もちろん、CAPはデータベースが何を支配しているかを多くの言葉なしで追跡するのに役立ちますが、たとえばCAPのCは原子の一貫性(線形化可能性)を意味することを忘れがちです。そして、これは分類しようとするときに理解するのに多くの苦痛を引き起こしました。したがって、MongoDB以外にも強い整合性が得られますが、これがCであるという意味ではありません。このように、この分類を行う場合は、疑いを残さないように実際にどのように機能するかについても詳しく説明することをお勧めします。


10

はい、使用時はCP safe=trueです。これは単に、データがマスターディスクに到達したことを意味します。レプリカにも到着したことを確認する場合は、「w = N」パラメーターを調べます。ここで、Nはデータを保存する必要のあるレプリカの数です。

詳細については、こちらこちらをご覧ください。


3

Pモンゴについてはよくわかりません。状況を想像してください:

  • レプリカは2つのパーティションに分割されます。
  • 新しいマスターが選出されたため、書き込みは両側に継続します
  • パーティションが解決されました-すべてのサーバーが再び接続されました
  • 何が起こるかというと、新しいマスターが選択されます-oplogが最も高いマスターですが、他のマスターからのデータはパーティションの前に共通の状態に戻され、手動で回復するためにファイルにダンプされます
  • すべてのセカンダリが新しいマスターに追いつきます

ここでの問題は、ダンプファイルのサイズが制限されていることと、長期間パーティションを使用していた場合、データが永久に失われる可能性があることです。

あなたがそれが起こる可能性は低いと言えます-そうではありませんが、クラウドで考えられているよりも一般的である場合を除きます。

この例が、データベースに文字を割り当てる前に非常に慎重になる理由です。非常に多くのシナリオがあり、実装は完全ではありません。

Mongoの今後のリリースでこのシナリオが対処されているかどうかを誰かが知っている場合は、コメントしてください!(私はしばらくの間起こっていたすべてをフォローしていません。)


2
MongoDBの選挙プロトコルは、(最大で)単一のプライマリを持つように設計されています。プライマリは、構成されたレプリカセット投票メンバー(n / 2 +1)の厳密な過半数によってのみ選出(および維持)できます。ネットワークパーティションが発生した場合、プライマリを選出できるのは1つのパーティション(投票メンバーの過半数を含む)だけです。マイノリティパーティション内の以前のプライマリは、ステップダウンしてセカンダリになります。これは、レプリカセットが常に機能してきた方法です。以前のプライマリがレプリケートされなかった書き込みを受け入れた場合、そのメンバーがレプリカセットに再び参加すると、それらはロールバック(ディスクに保存)されます。
Stennie

2

Mongodbはセカンダリへの書き込みを許可しません。セカンダリからのオプションの読み取りを許可しますが、書き込みは許可しません。したがって、プライマリがダウンした場合、セカンダリが再びプライマリになるまで書き込むことはできません。これが、CAPの定理で高可用性を犠牲にする方法です。プライマリからのみ読み取りを維持することにより、強い整合性を保つことができます。


2

MongoDBは、パーティションがある場合は常に、可用性よりも整合性を選択します。つまり、パーティション(P)がある場合、可用性(A)よりも一貫性(C)が選択されます。

これを理解するために、MongoDBがレプリカセットを機能させる方法を理解しましょう。レプリカセットには、プライマリノードが1つあります。データをコミットする唯一の「安全な」方法は、そのノードに書き込み、そのデータがセット内の大部分のノードにコミットするのを待つことです。(書き込みを送信すると、w = majorityのフラグが表示されます)

パーティションは、次の2つのシナリオで発生します。

  • プライマリノードがダウンした場合:新しいプライマリが選択されるまで、システムは使用できなくなります。
  • プライマリノードがあまりにも多くのセカンダリノードからの接続を失うと、システムは使用できなくなります。他のセカンダリは新しいプライマリを選出しようとし、現在のプライマリは辞任します。

基本的に、パーティションが発生し、MongoDBが何をすべきかを決定する必要があるときはいつでも、可用性よりも一貫性を選択します。システムがそれらの書き込みを安全に完了できると考えるまで、システムへの書き込みの受け入れを停止します。


「システムがそれらの書き込みを安全に完了できると考えるまで、システムへの書き込みの受け入れを停止します。読み取りについてはどうですか?その間、読み取り可能なままですか?
ジョシュ

1

Mongodbは、一貫性パーティションの許容範囲を提供します。

これは、分散(NoSQL)データベースのコンテキストでは、一貫性と可用性の間で常にトレードオフが発生することを意味します。これは、分散システムは常にパーティショントレラントであるためです(つまり、パーティショントレラントでなければ、分散データベースではありません)。

整合性 -システムは最終的に整合性を保ちます。データは遅かれ早かれあらゆる場所に伝播しますが、システムは入力を受け取り続け、次のトランザクションに移る前にすべてのトランザクションの整合性をチェックしていません。

可用性 -デフォルトでは、Mongo DBクライアント(MongoDBドライバー)は、すべての読み取り/書き込み要求をリーダー/プライマリノードに送信します。これにより、システムの一貫性は保たれますが、利用できなくなります。リーダーがクラスターから切断された場合、新しいリーダーが選出されるまで数秒かかります。そのため、その間は書き込みと読み取りができなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.