3

Node.js+Express+Mongoose を使用して MongoDB レプリカ セット (3x インスタンス) に接続しています。Mongoose の「connectSet」コマンドを使用してレプリカ セットに接続すると、レプリカ セット間でクエリの負荷が分散されるという印象を受けました。

ただし、nodetimeを使用すると、すべてのクエリ (find() クエリを含む) がレプリカ セットの PRIMARY インスタンスに送信されることがわかります。

ここで何か誤解していますか?不足している練習やレプリカ セットの設定はありますか? レプリカ セットの目的は、読み取り専用クエリとセット内の SECONDARY MongoDB サーバーとのバランスを取ることだと思いました...

ありがとう。

4

1 に答える 1

5

Mongoose の「connectSet」コマンドを使用してレプリカ セットに接続すると、レプリカ セット間でクエリの負荷が分散されるという印象を受けました。

この印象は正しくありません。

デフォルトでは、MongoDB の読み取りと書き込みはレプリカ セットのプライマリ メンバーに送信されます。レプリカ セットの主な目的は、高可用性 (HA) を提供することです。プライマリ ノードがダウンすると、ドライバーは既存の接続で例外をスローし、新しいプライマリとして選択されたノードに自動再接続します。

ここでの考え方は、ドライバーが介入や構成の変更なしで新しいプライマリを見つけるということです。

不足している練習やレプリカ セットの設定はありますか?

本当にセカンダリにクエリを送信したい場合は、 「このクエリをセカンダリに送信できます」というフラグをクエリに設定できます。これの実装はさまざまです。ここに Mongooseのバージョンがあります。

セカンダリ ノードへのクエリの送信はデフォルトの動作ではなく、ここには多くの落とし穴があることに注意してください。MongoDB のほとんどの実装は単一の書き込みロックによって制限されているため、読み取りの負荷分散は必要ありません。読み取りを分散してもパフォーマンスが向上するとは限らず、簡単にダーティ リードが発生する可能性があります。

このような負荷分散を行う前に、それが絶対に必要かどうかを確認してください。シャーディングはより良いオプションかもしれません。

于 2012-09-07T23:10:21.163 に答える