2016-07-20 3 views
1

問題: MongoDBはエラーで失敗する書き込み - PrimaryServerSelectorに一致するサーバーを待っている間に のMongoDBのJavaクライアントは、失敗したときにさらにreplicaSetでのプライマリサーバのノードの変更

は30000ミリ秒後にタイムアウトしました。プライマリが切り替わったときにこれが起こる

:クラスター状態のクライアントビューは {タイプ= REPLICA_SET、サーバ= [27017、 タイプ= REPLICA_SET_SECONDARY、roundTripTime = 0.7ミリ秒、状態= CONNECTED} {アドレス= intdb01]でありますからintdb01からintdb02までです。 クライアントドライバが依然としてintdb01 をプライマリノードとして探しているように見えます。

私たちのセットアップ

我々はさらにreplicaSet中3つのMongoDBノードはRS0と呼ばれています。 我々は、Javaを使用して接続すると、以下のように、我々は、接続文字列内のすべての3台のサーバを与える: のMongoDB:// intdb01:27017、intdb02:27017、intdb03:?27017 /さらにreplicaSet = RS0

デシベルを.version - > 3.0.4

Javaドライババージョン:MongoDBのドライバ-3.0.4.jar、MongoDBのドライバコア-3.0.4.jar

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

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

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

モンゴさらにreplicaSetステータス情報

> 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 

をtrace-。 の最後の情報メッセージをスタックトレースはconnectionModeがSINGLEだと言いますが、この問題を引き起こしている疑いがありますが、デベロッパードキュメントサイトでその情報が見つかりません。

+0

質問に投票する場合は、問題を改善しやすくするために十分な人でください。閉鎖する人にも同じことが言えます。 –

+0

完全なスタックトレースを提供できますか。 – helmy

+0

書き込みトレースのスタックトレースが追加されました。 –

答えて

0

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

 
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=xxx:27117, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: xxx}, caused by {java.net.UnknownHostException: xxx}}, {address=xxx:27118, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: xxx}, caused by {java.net.UnknownHostException: xxx}}, {address=xxx:27119, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: xxx}, caused by {java.net.UnknownHostException: xxx}}] 
    at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:370) 
    at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101) 
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:75) 
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(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.BaseWriteOperation.execute(BaseWriteOperation.java:106) 
    at com.mongodb.operation.BaseWriteOperation.execute(BaseWriteOperation.java:58) 
    at com.mongodb.Mongo.execute(Mongo.java:747) 
    at com.mongodb.Mongo$2.execute(Mongo.java:730) 
    at com.mongodb.DBCollection.executeWriteOperation(DBCollection.java:327) 
    at com.mongodb.DBCollection.insert(DBCollection.java:323) 
    at com.mongodb.DBCollection.insert(DBCollection.java:314) 
    at com.mongodb.DBCollection.insert(DBCollection.java:284) 
    at com.mongodb.DBCollection.insert(DBCollection.java:250) 
    at com.mongodb.DBCollection.insert(DBCollection.java:187) 
    at InsertTest2.main(InsertTest2.java:26) 

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

+0

私はそれを試みます。 - 簡単なテストを作成し、そこから行ってください。 私はすべてが独立して接続できるので、セカンダリがプライマリになるのではなく、ホスト/ IP解決ではありません。私は私の接続文字列を持っている方法で何かを疑う。どんな前進をしても私は遊び、更新します。 最後に、org.mongodb.driver.clusterのソースをダウンロードすることができます。 –

関連する問題