3

設定:

私はmongodbの1つのPRIMARYインスタンスと2つのSECONDARYインスタンスを持っています。2つのセカンダリインスタンスの1つは、私のWebアプリと同じリージョンでホストされています。

接続にはpymongoを使用しています。

質問:

レイテンシーの低いSECONDARYに接続するにはどうすればよいですか。

現在私はこれを行っています:

  from pymongo import ReplicaSetConnection
  from pymongo import ReadPreference

  db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
  db.read_preference = ReadPreference.SECONDARY

SECONDARYのいずれかに接続します。レイテンシーの低いインスタンスから接続を強制的に取得するにはどうすればよいですか?

ありがとう!!

4

2 に答える 2

9

読み取り設定は次のとおりです。

  • プライマリ:クエリはレプリカセットのプライマリに送信されます。
  • PRIMARY_PREFERRED:クエリは、利用可能な場合はプライマリに送信され、それ以外の場合はセカンダリに送信されます。
  • SECONDARY:クエリはセカンダリに分散されます。セカンダリが使用できない場合、エラーが発生します。
  • SECONDARY_PREFERRED:クエリはセカンダリ間で分散されます。セカンダリが使用できない場合はプライマリ間で分散されます。
  • 最寄り:クエリはすべてのメンバーに分散されます。

したがって、最も近いセカンダリに特定のものはありません。これは、NEARESTとtag_setsを組み合わせて、セカンダリにタグを付けることで実現できます。

次に、セカンダリにタグが付けられている場合は、{'secondaries': 1}次のように最も近いセカンダリから読み取ることができます。

from pymongo import ReplicaSetConnection
from pymongo import ReadPreference

db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
db.read_preference = ReadPreference.NEAREST
db.tag_sets = [{'secondaries': 1}]

アップデート:

選択が行われ、レプリカセットのトポロジが変更された場合は、新しいセカンダリを表すようにtag_setsを手動で変更する必要があることに注意してください。

于 2012-11-23T14:38:47.707 に答える
3

この回答は私の状況に非常に固有です。これは、最も近いセカンダリがWebサーバーと同じリージョンにあるため(同じマシンで実行するのと同じくらい良い)、データ転送がめちゃくちゃ速くなり、さらに料金を支払う必要がないためです。帯域幅の使用量(データ量を考慮すると、1か月で重要になる可能性があります)。

それ以外の場合、「secondary_acceptable_latency_ms」のデフォルト値=15ms。ですから、それは本当に重要ではありません。

したがって、誰かが同じ状況にいることに気付いた場合は、次のようにします。

    from pymongo import ReplicaSetConnection
    from pymongo import ReadPreference

    db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
    db.read_preference = ReadPreference.SECONDARY
    db.secondary_acceptable_latency_ms = 0.001

ありがとう!!

于 2012-12-04T10:36:20.650 に答える