2

問題: MongoDB の書き込みがエラーで失敗する -

PrimaryServerSelector に一致するサーバーを待機中に 30000 ミリ秒後にタイムアウトしました。クラスタ状態のクライアント ビューは {type=REPLICA_SET, servers=[{address=intdb01:27017, type=REPLICA_SET_SECONDARY, roundTripTime=0.7 ms, state=CONNECTED}] です

これは、プライマリが intdb01 から intdb02 に切り替わったときに発生ます。クライアント ドライバーは、引き続きintdb01 をプライマリ ノードとして探しているようです。

私たちのセットアップ

rs0 というレプリカセットに 3 つの mongoDb ノードがあります。Java を使用して接続する場合、接続文字列で 3 つのサーバーすべてを次のように 指定します。

データベースのバージョン--> 3.0.4

Java ドライバーのバージョン: mongodb-driver-3.0.4.jar、mongodb-driver-core-3.0.4.jar

クライアント接続コード:

if( mongoClient == null) {
    MongoClientURI mcu = new MongoClientURI(mongoConnect);
    mongoClient = new MongoClient(mcu);
}

mongoConnect には、上記の接続文字列が含まれています。

Mongo レプリカセットのステータス情報

> rs.status()
{
  "set" : "rs0",
  "date" : ISODate("2016-07-19T21:14:03.001Z"),
  "myState" : 1,
  "members" : [{
        "_id" : 0,
        "name" : "intdb01",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 439786,
        "optime" : Timestamp(1468521291, 5),
        "optimeDate" : ISODate("2016-07-14T18:34:51Z"),
        "lastHeartbeat" : ISODate("2016-07-19T21:14:01.877Z"),
        "lastHeartbeatRecv" : ISODate("2016-07-19T21:14:01.611Z"),
        "pingMs" : 0,
        "configVersion" : 4
    },
    {
        "_id" : 1,
        "name" : "intdb02:27017",
        "health" : 1,
        "state" : 1,
        "stateStr" : "PRIMARY",
        "uptime" : 2948844,
        "optime" : Timestamp(1468521291, 5),
        "optimeDate" : ISODate("2016-07-14T18:34:51Z"),
        "electionTime" : Timestamp(1468523057, 1),
        "electionDate" : ISODate("2016-07-14T19:04:17Z"),
        "configVersion" : 4,
        "self" : true
    },
    {
        "_id" : 2,
        "name" : "intdb03:27017",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 439779,
        "optime" : Timestamp(1468521291, 5),
        "optimeDate" : ISODate("2016-07-14T18:34:51Z"),
        "lastHeartbeat" : ISODate("2016-07-19T21:14:01.294Z"),
        "lastHeartbeatRecv" : ISODate("2016-07-19T21:14:01.294Z"),
        "pingMs" : 0,
        "configVersion" : 4
    }
  ],
  "ok" : 1
}

ドキュメントでコード/構成を確認して再確認しましたが、何が問題なのかを見つけることができません。プライマリをステップダウンすることで、これをシミュレートできます。セカンダリが引き継ぎますが、アプリの書き込みは失敗し始めます。:-(

ポインタ/ヒントは大歓迎です!

スタック トレースの追加 -

Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches PrimaryServerSelector. Client view of cluster state is {type=REPLICA_SET, servers=[{address=intdb01:27017, type=REPLICA_SET_SECONDARY, roundTripTime=0.7 ms, state=CONNECTED}]
at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:370)
at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101)
at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:75)
at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:71)
at com.mongodb.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:68)
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:175)
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:141)
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:72)
at com.mongodb.Mongo.execute(Mongo.java:747)
at com.mongodb.Mongo$2.execute(Mongo.java:730)
at com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:482)
at com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:474)
at com.mongodb.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:325)
at com.grid.core.persistence.mongodb.dao.GridEventDao.save(GridEventDao.java:69)
... 6 more
2016-07-19 17:05:01,882 [pool-2-thread-2] INFO   org.mongodb.driver.cluster - No server chosen by PrimaryServerSelector from cluster description ClusterDescription{type=REPLICA_SET, connectionMode=SINGLE, all=[ServerDescription{address=intdb01:27017, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 0, 4]}, minWireVersion=0, maxWireVersion=3, electionId=null, maxDocumentSize=16777216, roundTripTimeNanos=724681, setName='rs0', canonicalAddress=intdb01:27017, hosts=[intdb01:27017, intdb02:27017], passives=[intdb03:27017], arbiters=[], primary='intdb02:27017', tagSet=TagSet{[]}}]}. Waiting for 30000 ms before timing out

コーディング エラーなのか構成なのかを調べています。スタック トレースの最後の情報メッセージは、connectionMode が SINGLE であることを示しています。それがこの問題を引き起こしている疑いがありますが、開発者ドキュメント サイトでそれに関する情報を見つけることができません。

4

1 に答える 1

0

すべてのサーバー アドレスがエラー メッセージに表示されます。たとえば、解決されない 3 つの任意のホスト名でこれを試してください。

com.mongodb.MongoTimeoutException: PrimaryServerSelector に一致するサーバーを待機中に 30000 ミリ秒後にタイムアウトしました。クラスタ状態のクライアント ビューは、{java.net.UnknownHostException: が原因で {type=REPLICA_SET, servers=[{address=xxx:27117, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: xxx}] です。 xxx}}、{address=xxx:27118、type=UNKNOWN、state=CONNECTING、例外={com.mongodb.MongoSocketException: xxx}、{java.net.UnknownHostException: xxx}} が原因、{address=xxx:27119 、タイプ = UNKNOWN、状態 = 接続中、例外 = {com.mongodb.MongoSocketException: xxx}、原因 {java.net.UnknownHostException: xxx}}]
    com.mongodb.connection.BaseCluster.createTimeoutException (BaseCluster.java:370) で
    com.mongodb.connection.BaseCluster.selectServer (BaseCluster.java:101) で
    com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:75) で
    com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:71) で
    com.mongodb.binding.ClusterBinding.getWriteConnectionSource (ClusterBinding.java:68) で
    com.mongodb.operation.OperationHelper.withConnection (OperationHelper.java:175) で
    com.mongodb.operation.BaseWriteOperation.execute (BaseWriteOperation.java:106) で
    com.mongodb.operation.BaseWriteOperation.execute (BaseWriteOperation.java:58) で
    com.mongodb.Mongo.execute (Mongo.java:747) で
    com.mongodb.Mongo$2.execute (Mongo.java:730) で
    com.mongodb.DBCollection.executeWriteOperation (DBCollection.java:327) で
    com.mongodb.DBCollection.insert (DBCollection.java:323) で
    com.mongodb.DBCollection.insert (DBCollection.java:314) で
    com.mongodb.DBCollection.insert (DBCollection.java:284) で
    com.mongodb.DBCollection.insert (DBCollection.java:250) で
    com.mongodb.DBCollection.insert (DBCollection.java:187) で
    InsertTest2.main (InsertTest2.java:26) で

3 つのサーバー アドレスすべてがどのように表示されるかに注意してください。このような単純なテスト プログラムを作成して検証し、そこから逆方向に作業することをお勧めします。また、ホスト名が正しく解決されることを確認してください。IP アドレスを試すこともできます。

于 2016-07-20T21:24:05.307 に答える