MongoDB индексирует поле IdAccount, чтобы сделать поиск по аккаунту эффективным - PullRequest
0 голосов
/ 22 сентября 2019

В настоящее время я храню данные на своей MongoDB следующим образом:

  • 1 база данных на клиента
  • каждый клиент имеет около 40 коллекций
  • в общей сложности 50 клиентов (существует 40 * 50 = 2000 коллекций)
  • размер базы данных составляет 3 ГБ для всех 50 клиентов

Мой сервис MongoDB аварийно завершает работу с ошибкой

"Слишком много открытых файлов "

и MongoDB" Слишком много открытых файлов "?Повышение лимита показывает, как решить проблему, но я по-прежнему получаю сбои.

Ошибка «Слишком много открытых файлов» означает, что в процессе MongoDB используется слишком много файлов, и операционная системажалуюсь.Вот как я знаю, MongoDB использует много файлов:

  1. Получите id процессов MongoDB с помощью service mongodb status.Идентификатор процесса будет отображаться в информации

  2. Затем, чтобы получить файлы, используемые MongoDB, я использую эту команду lsof -a -p <ProcessId>

  3. Когда я запускаюэтой командой я вижу 1010 файлов, используемых этими процессами!

Чем больше баз данных клиентов я создаю, тем больше становится это число!Поэтому я думаю, что мое решение объединяет все базы данных в одну.Если я сделаю это, мне придется добавить столбец AccountId во все мои коллекции. Если я сделаю это изменение, какой индекс я должен назначить AccountId, чтобы мои поиски были эффективными? Например, я хотел бы получить все PurchaseOrders, где IdAccount = 34, быстро.Вы, ребята, рекомендуете выполнить это изменение?Должен ли я поместить все 50 баз данных в одну?


PS : На другом компьютере Linux я создал базу данных MongoDB только с 1 базой данных и 40 коллекциями.Я заполнил 40 сборников 6 ГБ данных (вдвое больше, чем сейчас).MongoDB использовал 200 файлов, хотя эта база данных в два раза больше!

1 Ответ

0 голосов
/ 25 сентября 2019

В тот же день после публикации этого вопроса я объединил все базы данных в одну.Более того, я добавил следующие индексы:

db.CollectionA.createIndex({Id_Account:1})
db.CollectionB.createIndex({Id_Account:1})
// etc...

Чтобы доказать, что мои запросы продолжали быть такими же эффективными, как и раньше:

db.getCollection('CollectionA').find({"Id_Account":28}).explain("executionStats")

Этот запрос дает статистику выполнения.Он говорит вам, сколько документов он искал и сколько соответствовало.Использование индекса NO приведет к сканированию всей коллекции каждый раз, когда я это делал find({"Id_Account":28})

Монго до сих пор не падал и никогда не блокирует более 300 файлов.Насколько я знаю, я всегда буду использовать одну и ту же базу данных вместо нескольких баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...