13

私はpymongoのMongoClientクラスを採用して、1つのプライマリと2つのセカンダリの3つのノードを持つレプリカセットに接続しました。コード スニペットは次のとおりです。

c = MongoClient([secondary1_hostname, secondary2_hostname], replicaSet='rs0')

3 つの mongod のログを確認すると、プライマリ ホストへの接続が常に作成されていることがわかりましたが、他の 2 つのセカンダリ ホストはクライアントからの接続要求を受信して​​いないか、すぐに接続が切断されました。クライアントが最初に 1 つのセカンダリに到達し、プライマリ アドレスを取得してから接続をドロップし、プライマリへの長期接続を作成したようです。

ただし、MongoReplicaSetClient クラスを使用する場合は、次のコード シンペットを使用します。

c = MongoReplicaSetClient(secondary1_name, replicaSet='rs0')

mongod のログ ファイルから取得した、各レプリカ セット メンバーに対して作成された 3 つの接続が常に存在します。

では、なぜ MongoClient の動作は常にプライマリへの接続のみを作成するのでしょうか? PyMongo のマニュアルを読みましたが、答えが見つかりませんでした。どんな提案でも大歓迎です。

4

3 に答える 3

7

MongoClientは単一の接続専用で、話しかけるとMongoDデータベースのリストの最後のものが選択されます。replicaSetpymongoを追加すると、接続先のレプリカ セットがこの名前と一致することが確認されます。指定されたホストがシード リストであり、pymongo がset のすべてのメンバーを見つけようとする必要があることを意味し、その後、プライマリ ノードに接続します。

MongoClient複数のホストを受け入れるもう 1 つの理由は、処理Mongos可用性のためです。モンゴス。 MongoClient

MongoReplicaSetClient特にレプリカセット接続用であり、セットのすべてのメンバーを見つけようとします。また、レプリカ セット モニターを起動し、レプリカ セット構成の変更に迅速に対応できるようにします。

于 2013-07-25T13:22:36.413 に答える
7

現在の pymongo (=3.2):

c = pymongo.MongoClient('mongodb://user:passwd@node1:p1,node2:p2/?replicaSet=rsname')
time.sleep(2)
print c.nodes
frozenset([(u'node1', p1), (u'node2', p2)])

pymongo の高可用性ドキュメントで説明されているように:

MongoClient() に渡されるアドレスはシードと呼ばれます。シードの少なくとも 1 つがオンラインである限り、MongoClient はレプリカ セット内のすべてのメンバーを検出し、どれが現在のプライマリで、どれがセカンダリまたはアービターであるかを判断します。

于 2017-03-01T11:31:29.510 に答える
0

ドキュメント( http://api.mongodb.org/python/current/api/pymongo/mongo_client.htmlMongoClientにあるように、クラスは単一のホストにのみ接続します。

host:port で単一の MongoDB インスタンスへの新しい接続を作成します。

MongoReplicaSetClientレプリカ セットを操作するには、既に発見したクラスを使用する必要があります。

于 2013-07-25T12:30:13.370 に答える