2016-04-26 4 views
6

Mongoデータベース(バージョン3.0.5)をプライマリDBサーバからスレーブに、より正確にはコミット時にソケットエラー110(接続タイムアウト)が発生するそのデータベースの複製(スレーブのログは以下のとおりです)。私はおそらく、その理由は、データベースが大きく、コミットする操作を送信するには時間がかかりすぎるという理由があると思います。MongoDBサーバスレーブレプリカのソケットタイムアウトを指定する方法

mongoサーバーに異なるソケットタイムアウトを指定するにはどうすればよいですか? 複製できない場合、複製を修復する他の方法はありますか?

このようなオプションはmongoクライアント(接続文字列オプションsocketTimeoutMS)に対してのみ見つかりましたが、Mongoサーバーには役立ちません。

2016-04-26T13:36:34.693+0100 I INDEX [rsSync]   done building bottom layer, going to commit  
2016-04-26T13:36:34.693+0100 I INDEX [rsSync] build index done. scanned 30980334 total records. 4072 secs  
2016-04-26T13:36:34.772+0100 I REPL  [rsSync] initial sync cloning db: {skipped db name}  
2016-04-26T13:36:34.823+0100 I NETWORK [rsSync] Socket say send() errno:110 Connection timed out {skipped ip}:27017  
2016-04-26T13:36:34.828+0100 E REPL  [rsSync] 9001 socket exception [SEND_ERROR] server [{skipped ip}:27017]  
2016-04-26T13:36:34.828+0100 E REPL  [rsSync] initial sync attempt failed, 9 attempts remaining 

更新。は、私がコメントにrs.status()の出力のために頼まれた:

{  "set" : "<skippedsetname>", 
     "date" : ISODate("2016-05-04T15:35:06.717Z"), 
     "myState" : 5, 
     "syncingTo" : "<skipped domain name of other server>:27017", 
     "members" : [ 
       { 
         "_id" : 0, 
         "name" : "<skipped domain name of this server>:27017", 
         "health" : 1, 
         "state" : 5, 
         "stateStr" : "STARTUP2", 
         "uptime" : 29, 
         "optime" : Timestamp(0, 0), 
         "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 
         "syncingTo" : "<skipped domain name of other server>:27017", 
         "configVersion" : 9, 
         "self" : true 
       }, 
       { 
         "_id" : 2, 
         "name" : "10.0.1.7:27017", 
         "health" : 1, 
         "state" : 7, 
         "stateStr" : "ARBITER", 
         "uptime" : 26, 
         "lastHeartbeat" : ISODate("2016-05-04T15:35:05.859Z"), 
         "lastHeartbeatRecv" : ISODate("2016-05-04T15:35:06.347Z"), 
         "pingMs" : 3, 
         "configVersion" : 9 
       }, 
       { 
         "_id" : 3, 
         "name" : "<skipped domain name of other server>:27017", 
         "health" : 1, 
         "state" : 1, 
         "stateStr" : "PRIMARY", 
         "uptime" : 26, 
         "optime" : Timestamp(1462376105, 196), 
         "optimeDate" : ISODate("2016-05-04T15:35:05Z"), 
         "lastHeartbeat" : ISODate("2016-05-04T15:35:05.859Z"), 
         "lastHeartbeatRecv" : ISODate("2016-05-04T15:35:06.086Z"), 
         "pingMs" : 4, 
         "electionTime" : Timestamp(1461688501, 1), 
         "electionDate" : ISODate("2016-04-26T16:35:01Z"), 
         "configVersion" : 9 
       } 
     ], 
     "ok" : 1 } 

を更新。私は使用するホスティングがAzureであると言及してはいけませんでした。 Answer and explanationは、「azure mongodb connection timeout」というクエリで完全に検出されます。私の悪い。

+1

あなたは推測に基づいて解決策を求めています。おそらく、その理由はデータベースが大きく、コミットするために操作を送信するには時間がかかりすぎるからです。私はこれが真実ではないと思うし、あなたの問題はネットワーク問題です。 'telnet {skipped ip} 27017'できますか? –

+0

@HéctorValverdeParejaはい私は試して、そのIPとポートでtelnetできます。さらに、私が言ったように、上記のエラーは、レプリカインスタンスがログに記録されているようにデータベースのすべてのデータをダウンロードした後に発生します。そのため、データをダウンロードするためにソケットに接続できても、その操作をコミットするために同じポートに接続できなかったのは不思議です。 – boqapt

+0

'rs.status()'の出力は何ですか? –

答えて

2

エラーの原因を前提としています。

  • Connection timed out

    は:TCP接続を確立しようとする時には、何の応答が与えられた制限時間内に反対側から来ませんでした。

つまり、ソケットの確立には問題があり、データベースの複製にかかる時間は問題になりません。

TCPタイムアウトの調整はシステム設定であり、アプリケーションごとに行うものではありません。 linuxの設定はシステム全体で/etc/sysctl.confであり、net.ipv4.tcp_syn_retries - play aroundとすることができますが、ではソケットを確立するためのタイムアウトをほとんど変更しません。(mongoを含むどのプログラムでも)それを増やすのではなく、エラーを速めるために短くすることに変更しました。それを増やすことは、あらゆる地上のアプリケーションで正しい解決策になる可能性は低いです。

設定に問題があります。設定に問題があります。ネットワークに問題があります。ファイアウォール、ルーティングテーブル、ネットワークスイッチなど、60-120で動作しないことがあります。一度に数秒。

+0

うん、私はエラーコードを誤解していた。しかし、上記のエラーは、レプリカインスタンスがログに記録されているデータベースのすべてのデータをダウンロードした後に発生します。それは、データをダウンロードするためにソケットに接続できるようですが、その後、その操作をコミットするために同じポートに接続できませんでした。また、レプリカセットは、同期が失われるまで長期間存在します。その後、私はスレーブにDBを落として再起動し、プライマリからデータを受信し始めましたが、コミットに失敗しました。だから私はそのネットワークや設定の問題を疑う。問題はmongodbに接続されていますが、ネットワークやOSには接続されていないようです – boqapt

+0

AからBに接続できるからといって、BからAに接続できるという意味ではありません。 /リーダーノード。すべてのノードで 'rs.status()'が同じであるかどうかを確認し、他の各ノードと各mongoマシンのnc(またはtelnet)を確認できるかどうかを確認します。 – Soren

0

スレーブ内のファイルシステムをロックするファイルがあります。どこにいたら、レプリカからノードを削除したら、dbpathの下にあるすべてのファイルを消去し、mongoユーザーがこのディレクトリにアクセスして、mongodを再起動できることを確認します。実行したら、それをRSに追加してそれを待ちます。また、https://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/#mongod-lock

+0

私は、dbpathの下で論理的にファイルを消去することは、スレーブ上のロックされたファイルに関連していることを理解しました。しかし、レプリカからスレーブを削除して、もう一度追加することはどうしたらよいですか? – boqapt

+0

私はそれが安全であることを見ているだけです(私はあなたに何か言及を与えることはできませんが、私はそれを他の場所で読んだことがある漠然とした記憶を持っています)。これは、残りのレプリカセットとのすべての通信を切断することによって、ノードを単独で修復することです。 –

関連する問題