![MongoDB часто меняет основные параметры](https://rvso.com/image/658725/MongoDB%20%D1%87%D0%B0%D1%81%D1%82%D0%BE%20%D0%BC%D0%B5%D0%BD%D1%8F%D0%B5%D1%82%20%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B.png)
Мы используем набор реплик Mongo 2.6 с 3 участниками: первичный, вторичный, арбитр. Почти каждый день наша MongoDB переключает сервер, который является первичным, и это приводит к прерыванию всех подключений к этой базе данных. Было бы прекрасно, если бы это происходило из-за того, что один из серверов действительно был отключен, проблема в том, что в каждом случае создается впечатление, что «отключенный» сервер на самом деле не был отключен. Он был включен все это время.
Вот что нам известно:
- Процесс
mongod
на всех трех серверах не перезапустился и не остановился. - Все это время серверы продолжали отправлять сообщения в New Relic.
- В журнале Монго мы видим частые сбои сердцебиения.
- Серверы не находятся под очень высокой нагрузкой в любой момент. Я вижу пик загрузки ЦП каждый час примерно через 10 минут после начала часа, но это не совсем соответствует сбоям.
Ниже приведен результат show log rs
выполнения shell-запроса к текущему первичному серверу.
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
Вы можете видеть, что мы часто получаем сбои в работе heartbeat и уведомления о сбоях, но в каждом случае сервер переходил из состояния «упал» в состояние «возобновился» за считанные секунды. Я даже не уверен, с чего начать дальше, чтобы попытаться выяснить, что может быть причиной проблемы.
решение1
Я часто это вижу, и это всегда за пределами процесса mongod
. Проблемы с DNS-резолвером, проблемы со стеком TCP/IP, сетевыми ссылками, физическим оборудованием и т. д. Выйдите из процесса mongod
. Проверьте сетевые ошибки на вашей хостовой ОС, проверьте физические ссылки (если физические есть в уравнении), проверьте вашего облачного провайдера между двумя серверами, если вы охватываете регионы. По всей вероятности, это что-то в хостовой ОС и не связано с самой MongoDB.
решение2
Это было решено. Основная проблема заключалась в том, что наш хостинг-провайдер использовал моментальные снимки VMWare в качестве механизма резервного копирования. Эти моментальные снимки заставляли VM временно входить в период стазиса, я полагаю, технический термин — замирание VM.
После того, как эти снимки были отключены, у нас больше не возникало никаких проблем.