4

2 つのデータセンターがあり、両方のデータセンターから Mongo にデータを書き込んでいます。コレクションはシャード化されており、データセンター A に 1 つのシャードのプライマリがあり、データセンター B にもう 1 つのシャードのプライマリがあります。データセンター間の接続が失敗する場合があります。

IN BOTH DATACENTERS で引き続き書き込みできるようにしたいと考えています。書き込み中のデータは競合しません。どちらもドキュメントを追加するか、2 つの場所で更新されないドキュメントを更新するだけです。

次に、接続が回復したとき (場合によっては数秒または数分)、データベースがこの状況にうまく対処し、すべてのデータが自動的に更新されるようにします。

これが可能かどうか誰かがアドバイスできますか?レプリカ セットを 2 つの独立した DB に分割し、再接続するまで両方をマスターにするとどうなるかについて、ドキュメントにはあまり書かれていません。何が起こるのですか?これを設定するにはどうすればよいですか?

4

3 に答える 3

2

セカンダリがプライマリと同じデータセンターにあると仮定すると、これが既に設定されている方法で機能しない理由がわかりません。

つまり、シャード A のプライマリとセカンダリがデータ センター A にあり、シャード B のプライマリとセカンダリがデータ センター B にある場合、両方のデータ センターで既に書き込みを行っています。

2 つのデータ センター間の接続が失われた場合、データ センター A のクライアントはシャード B への読み取りまたは書き込みができなくなり、データ センター B のクライアントはシャード A への書き込みができなくなりますが、両方のデータ センター クライアントが同じデータセンターにあるシャードへの書き込みを続行します。

したがって、それは簡単です。レプリカセットの大部分を同じデータセンターに保持し、そのデータセンターが稼働している限り、そのシャードに書き込みを続けます。

切断されたデータセンターからのクライアントが魔法のように、他のデータセンターのシャードへの書き込みをどこかに隠しておくことを期待しているように感じますが、それは起こり得ません。彼らは他のデータセンターを見ることができません。そのため、接続が回復したときに、DB が対処することは何もありません (切断フェーズ中に大量の書き込みが失敗したという事実を除いて)。

于 2012-05-17T06:26:31.417 に答える
0

「レプリカ セットを分割」して、同じセットに 2 つのプライマリを含めることはできません。

したがって、mongos をルーターとして使用して 1 つのキーで分割する 2 つのレプリカ セットがあります。1 つの解決策は、シャーディング キーの最初の部分が「A」または「B」で始まるように設定されている場合です。つまり、新しいレコードが A で始まる場合は最初のセットにルーティングされ、B の場合は 2 番目にルーティングされます。設定。これは、mongos がデータを配置しようとする場所を制御できる唯一の方法です。

新しいエントリに壊れたレプリカセットと一致するシャーディング キーがない限り、mongos と異なるレプリカセット間の接続の問題は問題になりません。

たとえば、データを書き込むデータセンター A の mongo クライアントに、常に A でシャーディング キーを開始させることができます。つまり、データセンター B がダウンしている場合、A を含むレコードのみが作成されます。

両方のセンターのクライアントは、両方のシャードが稼働している限り、両方のシャードからの読み取りにアクセスできます。

Mongos は各クライアントの近くで実行する必要があるため、これらは両方の場所にあり、それぞれがシャーディング構成にアクセスできます。

于 2012-05-17T00:46:21.223 に答える
0

レプリカ セット ノードは、ノードの少なくとも半分を認識しない限り、マスターになることはできません。これは、プライマリがあるデータセンターへのリンクがない場合、そのシャードに書き込むことができないことを意味します。

このために自家製のソリューションを実装する方法がわかります。しかし、それには多少の努力が必要です。

CouchDB も参照してください。また、スキーマレスで JSON ベースであり、状況を適切に処理できます (基本的に、このような状況向けに構築されています)。

于 2012-05-17T06:14:44.357 に答える