Можно ли запустить несколько экземпляров Mongod на одном наборе файлов базы данных
У нас есть большие многигабайтные наборы данных, к которым мы выполняем очень сложные запросы, например
{
$or: [ { id: 30000001, ... }, { id: 30000005, ... }, ..., { id: 30001005, ... } ]
}
Похоже, что процессор на самом деле является узким местом на этом этапе, поэтому я бы хотел иметь возможность запускать несколько экземпляров mongod на одном и том же наборе файлов базы данных.
Мы рассмотрели возможность использования наборов реплик для этой цели, но предпочли бы не требовать дополнительного дискового пространства просто по причинам, связанным с процессором.
1 ответ
Нет, это невозможно, вы не можете запускать несколько экземпляров в настоящее время, используя одни и те же файлы - ключевой элемент функциональности, который вам понадобится (управление тем, какой экземпляр имеет возможность записи в файл), не существует. Я не думаю, что это также входит в список запросов функций (я не смог его найти), и учитывая количество потенциальных проблем, которые я могу подумать о том, чтобы разрешить это сделать, это может показаться большим шагом с точки зрения запрос, но вы можете запросить его.
$or
Пример запроса, который вы перечисляете (и вы предлагаете более сложные), будет выполнять несколько запросов параллельно, и, судя по всему, у вас будет по существу вложенная логическая структура. $or
с перечислением нескольких _id
в каждом пункте. С несколькими сканированиями для каждого из пунктов в $or
даже с закрытым запросом индекса, который все еще будет большим числом сканирований индекса, когда этот массив большой.
Если вы не используете покрытые индексы (ищите indexOnly, чтобы быть true
в вашем объяснении), то это также будет означать сканирование большого количества документов, и, если весь ваш набор данных не уместится в память, это будет означать много ошибок страниц.
Поскольку вы уже заявляете, что это "единственный способ" сделать это в вашей системе (я думаю, что обзор схемы также будет хорошей идеей), то в настоящее время, если вы сталкиваетесь с проблемами ЦП на одном хосте, тогда репликация или шардинг - это два варианта горизонтального масштабирования. Я также хотел бы убедиться, что ЦП находится на земле пользователя, а не в системе (самый простой способ сделать это - установить MMS с munin-узлом и отслеживать пользователя (обычно mongod, если это выделенная система) по сравнению с системным ЦП с течением времени.
Но прежде чем делать это, убедитесь, что вы работаете на 2.2 - одним из основных улучшений в 2.2 стал переход на TCMalloc - я не могу быть уверен, потому что проблемы с malloc могут быть трудно диагностировать / определять в лучшие времена, но если вы работаете 2.0, TCMalloc может помочь вам здесь.