![MongoDB が頻繁にプライマリを切り替える](https://rvso.com/image/658725/MongoDB%20%E3%81%8C%E9%A0%BB%E7%B9%81%E3%81%AB%E3%83%97%E3%83%A9%E3%82%A4%E3%83%9E%E3%83%AA%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B.png)
私たちは、プライマリ、セカンダリ、アービターの 3 つのメンバーを持つ Mongo 2.6 レプリカ セットを実行しています。ほぼ毎日、MongoDB はプライマリ サーバーを切り替えており、これによりその DB へのすべての接続が中断されます。サーバーの 1 つが本当にダウンしているためにこのような状態になっているのであれば、まったく問題ありません。問題は、いずれの場合も、ダウンしているサーバーが実際にはダウンしていないように見えることです。サーバーはずっと稼働していました。
私たちが知っていることは次のとおりです:
- 3 台のサーバーすべてのプロセス
mongod
は再起動もダウンもしませんでした。 - サーバーはずっと New Relic にレポートし続けていました。
- mongo ログを見ると、ハートビート障害が頻繁に発生していることがわかります。
- サーバーの負荷は、実際にはどの時点でもそれほど高くありません。毎時約 10 分後に CPU スパイクが発生していますが、これは障害と正確に一致していません。
show log rs
以下は、現在のプライマリにシェルでログインしたときの結果です。
2015-05-17T15:05:49.339+0000 [rsBackgroundSync] replSet sync source problem: 10278 dbclient error communicating with server: server1:27017
2015-05-17T15:05:49.358+0000 [rsBackgroundSync] replSet syncing to: server1:27017
2015-05-17T15:05:56.444+0000 [rsBackgroundSync] replset setting syncSourceFeedback to server1:27017
2015-05-17T22:11:36.638+0000 [rsHealthPoll] replSet info server1:27017 is down (or slow to respond):
2015-05-17T22:11:36.644+0000 [rsHealthPoll] replSet member server1:27017 is now in state DOWN
2015-05-17T22:11:37.495+0000 [rsMgr] not electing self, we are not freshest
2015-05-17T22:11:38.656+0000 [rsHealthPoll] replSet member server1:27017 is up
2015-05-17T22:11:38.656+0000 [rsHealthPoll] replSet member server1:27017 is now in state PRIMARY
2015-05-17T22:11:39.140+0000 [rsBackgroundSync] replSet syncing to: server1:27017
2015-05-17T22:11:39.147+0000 [rsBackgroundSync] replset setting syncSourceFeedback to server1:27017
2015-05-17T23:05:47.431+0000 [rsBackgroundSync] replSet sync source problem: 10278 dbclient error communicating with server: server1:27017
2015-05-17T23:05:47.431+0000 [rsBackgroundSync] replSet syncing to: server1:27017
2015-05-17T23:05:47.876+0000 [rsBackgroundSync] replset setting syncSourceFeedback to server1:27017
2015-05-18T10:05:46.821+0000 [rsBackgroundSync] replSet sync source problem: 10278 dbclient error communicating with server: server1:27017
2015-05-18T10:05:46.822+0000 [rsBackgroundSync] replSet syncing to: server1:27017
2015-05-18T10:05:51.014+0000 [rsBackgroundSync] replset setting syncSourceFeedback to server1:27017
2015-05-18T22:12:11.433+0000 [rsHealthPoll] replSet info server1:27017 is down (or slow to respond):
2015-05-18T22:12:11.434+0000 [rsHealthPoll] replSet member server1:27017 is now in state DOWN
2015-05-18T22:12:11.507+0000 [rsMgr] replSet info electSelf 3
2015-05-18T22:12:14.708+0000 [rsMgr] replSet PRIMARY
2015-05-18T22:12:14.709+0000 [rsHealthPoll] replSet member server1:27017 is up
2015-05-18T22:12:14.709+0000 [rsHealthPoll] replSet member server1:27017 is now in state PRIMARY
2015-05-18T22:12:21.610+0000 [rsHealthPoll] replSet member server1:27017 is now in state ROLLBACK
2015-05-18T22:12:23.612+0000 [rsHealthPoll] replSet member server1:27017 is now in state SECONDARY
2015-05-19T22:13:13.004+0000 [rsHealthPoll] couldn't connect to server1:27017: couldn't connect to server server1:27017 (x.x.x.x), connection attempt failed
2015-05-19T22:13:24.127+0000 [rsHealthPoll] couldn't connect to server1:27017: couldn't connect to server server1:27017 (x.x.x.x) failed, connection attempt failed
2015-05-19T22:13:29.267+0000 [rsHealthPoll] replset info server1:27017 just heartbeated us, but our heartbeat failed: , not changing state
2015-05-20T22:14:35.832+0000 [rsHealthPoll] replset info server1:27017 just heartbeated us, but our heartbeat failed: , not changing state
ハートビート障害とダウン通知が頻繁に発生していることがわかりますが、いずれの場合も、サーバーはダウン状態から数秒で復旧しています。問題の原因を突き止めるために、次に何を調べればよいのか、よくわかりません。
答え1
私はこれを頻繁に目にしますが、常にプロセス外にありますmongod
。DNS リゾルバの問題、TCP/IP スタックの問題、ネットワーク リンク、物理ハードウェアなどです。プロセスから抜け出す方法を探してくださいmongod
。ホスト OS のネットワーク エラーを確認し、物理リンク (物理が関係する場合) を確認し、リージョンをまたいでいる場合は 2 つのサーバー間のクラウド プロバイダーを確認してください。これはおそらくホスト OS の問題であり、MongoDB 自体とは関係ありません。
答え2
これは解決されました。根本的な問題は、ホスティング プロバイダーがバックアップ メカニズムとして VMWare スナップショットを実行していたことです。これらのスナップショットにより、VM が一時的に停止状態になりました。専門用語では VM が静止する、ということだと思います。
これらのスナップショットを無効にすると、問題は発生しなくなりました。