3

3つのノード(プライマリ、セカンダリ、アービター)があるMongoDBレプリカセットがあり、プライマリノードがダウンし、セカンダリがプライマリを想定している場合、クライアントでその変更を動的に処理して、クライアントがプライマリに書き込むようにするにはどうすればよいですか?

私はこれを開発環境で経験し、これを処理するための最良のアプローチについて考え始めました。これはシャードクラスターではなく、スタンドアロンのレプリカセットです。

「IsPrimary」のような接続で何かをチェックして、そうでない場合は書く場所を変更しますか?

任意の提案をいただければ幸いです。

ありがとう、

S

4

2 に答える 2

2

これまでのところ、私が見つけたものは、これを実際に適切に指示するのはドライバーであると私に信じさせます。C#ドライバーの設定は正しいと思いますが、Pythonクライアント(PyMongo)を介して接続する方法は正しくありません。pymongo.ReplicaSetConnectionのようなものを使用する必要があります

ここに表示されます。

掘り下げていきますが、これまでに見つけたものを共有したいと思いました。

編集:

C#-ドライバーは接続を適切に処理していたので、

Python:書き込みを新しいプライマリにルーティングするように、上記のように接続を変更する必要がありました

Python(pymongo)コード:

from pymongo.replica_set_connection import ReplicaSetConnection

MongoConnection = ReplicaSetConnection('localhost:27017',replicaSet='myReplSet')

--S

于 2012-08-16T17:50:42.727 に答える
1

接続を設定すると、ドライバーはデータの送信先ノードを分類できるほど賢くなります。

C#ドライバーの場合

レプリカセットに接続するには、コンマで区切って複数のホスト名(および必要に応じてポート番号)を指定してシードリストを指定します。例えば:

mongodb://server1,server2:27017,server2:27018

Pythonドライバーの場合

レプリカセットへの接続は、セットの1つ以上のメンバーを指定して、通常のConnection()コンストラクターを使用して行うことができます。たとえば、次のいずれかにより、作成したセットへの接続が作成されます。

Connection("morton.local", replicaset='foo')
Connection([u'morton.local:27019', 'morton.local:27017', u'morton.local:27018'])
Connection("morton.local:27018", replicaset='foo')
Connection([u'morton.local:27019', u'morton.local:27017', 'morton.local:27018'])
Connection("morton.local", 27019, replicaset='foo')
Connection(['morton.local:27019', u'morton.local:27017', u'morton.local:27018'])
Connection(["morton.local:27018", "morton.local:27019"])
Connection(['morton.local:27019', u'morton.local:27017', 'morton.local:27018'])
Connection("mongodb://morton.local:27017,morton.local:27018,morton.local:27019")
Connection(['morton.local:27019', 'morton.local:27017', 'morton.local:27018'])

Connection()に渡されるノードはシードと呼ばれます。ホストが1つだけ指定されている場合は、replicasetパラメーターを使用して、これが単一ノードへの接続ではないことを示す必要があります。シードの少なくとも1つがオンラインである限り、ドライバーはセット内のすべてのノードを「検出」し、現在のプライマリーに接続することができます。

于 2012-08-17T12:29:25.290 に答える