Meteor теряет соединение с базой данных

Я запускаю экземпляр Meteor в Digital Ocean и размещаю базу данных Mongo в Mongolab. Если сайт простаивает в течение нескольких часов и кто-то переходит на определенную страницу, Meteor, похоже, разрывает свое соединение с базой данных на 3-15 минут без каких-либо ошибок или предупреждений. Вот что мне удалось выяснить:

Сервер Meteor в DigitalOcean

  • Продолжает работать, и Meteor.status() показывает активное соединение
  • Загрузка процессора падает во время эпизода
  • Будет и дальше обслуживать копии веб-приложения.

MongoDB в Mongolab

  • Операции запросов упали почти до нуля
  • Всплеск ошибок страницы
  • Сетевой трафик падает до нуля.
  • Все еще можно получить доступ и запросить напрямую.
  • Другие серверы (рабочие), использующие ту же базу данных, продолжают работать в обычном режиме.

Я подозреваю, что это как-то связано со следующей публикацией:

Meteor.publish('spaceUtilSpace', function(view_id, space_id){
  if(!checkSpaceUtilPermissions(view_id, "View Reader", this.userId)) { this.ready(); return; }

  var thisUser = Meteor.users.findOne({_id: this.userId});
  var thisView = View_SpaceUtil.findOne({_id: view_id});

  if(thisView){
    var thisSpace = Spaces.findOne({_id: space_id});

    return [
      View_SpaceUtil.find({_id: view_id}),
      Bldgs.find({_id: thisSpace.localID.bldg_id}),
      Spaces.find({_id: space_id}),
      Schedule.find({"localID.space_id":space_id, startDateMs:{$lte:thisView.time.toDate}, endDateMs:{$gte:thisView.time.fromDate}})
    ]
  }
})

Я подозреваю, что проблема, скорее всего, в этой строке: Schedule.find({"localID.space_id":space_id, startDateMs:{$lte:thisView.time.toDate}, endDateMs:{$gte:thisView.time.fromDate}}), поскольку это моя самая большая коллекция (~ 80 000 документов, 150 МБ).

Сначала я подумал, что мне может просто понадобиться индекс для этого запроса, что обработка этого конкретного запроса просто занимала слишком много времени, но после создания индекса для {"localID.space_id":1, startDateMs:-1, endDateMs:1} у меня все еще была та же проблема.

У меня заканчиваются идеи, как это исправить, поэтому любые предложения будут невероятно полезными. Спасибо!

Дополнительная информация

Просматривая журналы Mongo, я обнаружил следующие две строки:

2015-12-04T08:11:09.904-0800 I QUERY    [conn51589] query myDatabase.schedule query: { localID.space_id: "mjEYjonRaFrrr8gcX", startDateMs: { $lte: 1451520000000.0 }, endDateMs: { $gte: 1262304000000.0 } } planSummary: COLLSCAN ntoreturn:0 ntoskip:0 nscanned:0 nscannedObjects:78172 keyUpdates:0 writeConflicts:0 numYields:6664 nreturned:0 reslen:20 locks:{ Global: { acquireCount: { r: 13330 } }, MMAPV1Journal: { acquireCount: { r: 6665 } }, Database: { acquireCount: { r: 6665 } }, Collection: { acquireCount: { R: 6665 } } } 232971ms
2015-12-04T08:11:10.429-0800 I QUERY    [conn51593] query myDatabase.schedule query: { localID.space_id: "mjEYjonRaFrrr8gcX", startDateMs: { $lte: 1451520000000.0 }, endDateMs: { $gte: 1262304000000.0 } } planSummary: COLLSCAN ntoreturn:0 ntoskip:0 nscanned:0 nscannedObjects:78172 keyUpdates:0 writeConflicts:0 numYields:610 nreturned:0 reslen:20 locks:{ Global: { acquireCount: { r: 1222 } }, MMAPV1Journal: { acquireCount: { r: 611 } }, Database: { acquireCount: { r: 611 } }, Collection: { acquireCount: { R: 611 } } } 128ms

Похоже, что проблема в том, что один запрос занимает невероятно много времени для выполнения и не позволяет делать новые запросы до тех пор, пока он не завершится.

Что меня сбивает с толку в отношении этих двух, так это то, что сам запрос идентичен, но «acquCount» для первого имеет 10-кратное содержимое, и для возврата потребовалось примерно в 2000 раз больше времени. Эти поля проиндексированы ... есть идеи, почему это могло произойти?


person Itinerati    schedule 04.12.2015    source источник
comment
Я не использовал Mongolab, поэтому не знаю, какую аналитику они вам дают. Надеюсь, у них есть что-то, что показывает измерения производительности запросов - если нет, вы можете использовать профилирование Kadira или MongoDB, чтобы выяснить, создает ли этот конкретный запрос (или какой-либо другой) проблемы. Я сам не сталкивался с этой проблемой, поэтому ничем не могу больше помочь, но я склонен думать, что это, скорее всего, проблема со стороны БД, а не что-либо другое (другие варианты - это проблемы с Meteor или сетью).   -  person Oskar    schedule 04.12.2015
comment
Кроме того, очень важно: это происходит, когда кто-то посещает очень конкретную страницу, верно? До этого производительность БД в порядке (то есть, по крайней мере, не мертвая)? Тогда наверняка проблемы возникают из-за определенного запроса. Используйте профилирование MongoDB, или Mongolab analytics, или Kadira, чтобы выяснить, какой это запрос, а затем сузьте свой вопрос до одного этого запроса и предоставьте более подробную информацию о коллекции и т. Д. Тогда вам будет намного проще помочь.   -  person Oskar    schedule 04.12.2015
comment
Привет, Оскар. Спасибо, я безуспешно просматривал Kadira, но просматривая журналы базы данных, я нашел проблемный запрос, и это тот, который, как я думал, это был ... но я все еще не совсем уверен, что происходит . Я отредактировал свой вопрос, чтобы включить новую информацию.   -  person Itinerati    schedule 04.12.2015
comment
У меня недостаточно информации, чтобы сказать, почему это происходит. Индекс {"localID.space_id":1, startDateMs:1, endDateMs:-1} должен быть лучше, но индекс может быть вовсе не причиной этого. Эта статья поможет вам проанализировать ваш запрос. Также просмотрите статьи в разделе См. Также внизу страницы.   -  person Oskar    schedule 04.12.2015
comment
Спасибо за отзыв и направление.   -  person Itinerati    schedule 04.12.2015


Ответы (1)


После некоторого обсуждения с поддержкой Mongolab у меня есть ответ (вероятно).

Я использую общий кластерный план, поэтому, если запрос не выполнялся в течение нескольких часов, он удаляется из памяти, чтобы другие пользователи могли получить доступ к этому блоку. При следующем запуске запроса он должен перезагрузить эти данные в память, что в данном случае занимало очень много времени. Я переоценил свою стратегию индексирования и обнаружил, что пропустил индекс, который должен был иметь - я проиндексировал "localID.bldg_id", но забыл сделать отдельный индекс, включающий "localID.space_id", который был важным для этого проблема.

Мне придется подождать, пока память не очистится, прежде чем я смогу убедиться, что это решение работает, но это кажется вероятным.

Если это не так, Mongolab предлагает перейти на выделенный кластер, а не использовать общий.

person Itinerati    schedule 04.12.2015
comment
Хм, интересно. Спасибо за информацию, это действительно очень полезно. Я учту это при выборе поставщика БД для своего следующего проекта. - person Oskar; 05.12.2015
comment
Рад быть полезным, спасибо, что помог мне с этим справиться. - person Itinerati; 05.12.2015