2

MongoDbの現在の構成は次のとおりです。

  • 1 つのプライマリ ( A )、2 つのセカンダリ ( BおよびC )、1 つのレプリカ セットのすべての部分
  • プライマリへの挿入は write-concern で行われます: 多数派
  • レプリカ セットからの読み取り時に読み取り設定が「最も近い」に設定されている

シナリオ:

  • 挿入がトリガーされます。これは、レプリカ セット メンバーの大部分に伝播された後にのみ成功することを意味します。
  • 書き込み操作が戻るまで、アプリケーションはプライマリから読み取ることができません (参照)
  • 書き込みの懸念が「多数」に設定されているため、書き込み操作は、少なくとも 1 つのセカンダリ ( B ) インスタンスに伝播した後にのみ返されます。この場合、3 つのメンバーが設定されています。
  • これは、複製しているため、セカンダリ ( B ) も読み取り用にロックされていることを意味します (これによる)

問題は、アプリケーションが最も近いインスタンスから読み取るように設定されているため、最も近いインスタンスがもう一方のセカンダリ ( C ) であるとしましょう。他の 2 つのインスタンスで書き込み操作がまだ進行中に読み取り要求が送信された場合、読み取りが許可されるかブロックされるか。許可される場合、どうすれば防止できますか?

4

2 に答える 2

1

書き込み懸念は、実際にはそのようには機能しません。B と C は両方とも書き込みを処理し、書き込みに関する懸念がある getLastError を送信するかどうかに関係なく、書き込みを行っている間、同じ db レベルの書き込みロックを取得します。C でロックが保持されている間、C での読み取りはブロックされます。

書き込みの懸念は実際にはクライアントだけのものであり、条件(あなたの場合、レプリカの大部分が書き込みを適用した)が満たされるまでクライアントを待機させます。セカンダリがレプリケーションを優先する方法は変わりません。

于 2014-02-14T12:30:06.300 に答える
0

他の 2 つのインスタンスで書き込み操作がまだ進行中に読み取り要求が送信された場合、読み取りは許可されるかブロックされますか

まあ、あなたは自分でそれを理解しました。最も近いグループにある場合は、「C」から (古いデータ) を読み取ることができます

どうすれば防ぐことができますか?

読み取り優先度は、ドライバー、データベース レベル、コレクション レベル、または操作レベルによってグローバルに適用できます (書き込みに関して多かれ少なかれ同じことが適用できます)。その特定の操作で古いデータに苦しむことができない場合はprimary、挿入を発行した後に、その特定のクエリの読み取り設定をオーバーライドできます (そのシナリオでは、挿入操作は書き込み懸念で設定できることに注意してください{w:1}

于 2014-02-14T11:36:35.770 に答える