Фоновые индексы Mongodb - они все еще созданы после создания?
При создании индекса в mongodb вы можете указать флаг background: true
, который заставляет создание индекса быть неблокирующим. Это здорово в производстве, так как вы не хотите, чтобы вся база данных была заблокирована, создавая индекс, который вам явно не нужен критически (так как у вас его не было).
Считывая docs, кажется, что этот флаг определяет только, как создается индекс, и как только он будет создан, индекс действует точно так же, как обычный индекс, Это то, что я хочу - я бы не хотел, чтобы индекс не синхронизировался с документами, потому что он обновлялся в фоновом режиме, хотя я могу представить базу данных, которая делает это.
Я спрашиваю здесь, потому что команда getIndexes
показывает, что индекс по-прежнему отмечен как background
даже после его создания. Это просто напоминание о том, как оно было создано? Или индексы background
ведут себя по-разному после создания? Может быть, какая-то тонкость с репликацией?
Ответы
Ответ 1
После создания они действуют так же, как и обычные индексы. Они сохраняются в getIndexes
как напоминание, похожее на unique
, sparse
и т.д.
Но это также имеет и другое значение. Просто потому, что индексы переднего плана блокируют всех авторов, в этом случае вы не сможете выполнить db.testCollection.getIndexes()
, пока не будут созданы все индексы. Между тем, когда вы создаете фоновый индекс, вы можете вызвать db.testCollection.getIndexes()
, и вы увидите, что этот индекс, похоже, уже создан.
Но в этом случае мы не можем быть уверены, действительно ли были созданы индексы или нет. В этом случае вам нужно вызвать db.currentOp(), и если вы увидите что-то вроде
{
"inprog": [
{
"opid": 2001060,
"active": true,
"secs_running": 1,
"op": "insert",
"ns": "test.system.indexes",
"insert": {
"v": 1,
"key": {
"a": 1
},
"ns": "test.testCollection",
"name": "a_1",
"background": 1
},
....
"msg": "bg index build Background Index Build Progress: 368640/1000000 36%",
"progress": {
"done": 368640,
"total": 1000000
}
...
}
]
}
то это означает, что создание фоновых индексов все еще продолжается, а также вы можете увидеть некоторую информацию о процессе.
Например, вы можете выполнить грубые вычисления:
368640 из 1000000 занимает 1 секунду (+1 секунда как возможное смещение), поэтому все должно занять 3-6 секунд (в итоге это заняло 4,8 с).
Очевидно, что если вы не видите такую операцию в процессе, то индексы уже созданы.
Примечание. Если у вас много параллельных операций, вы можете указать аргумент поиска для db.currentOp()
, f.e.
db.currentOp({"insert.background":1})
Ответ 2
Существует несколько параметров индексирования - передний план (по умолчанию) и фон. Передний план относительно быстрый, и он блокирует всех писателей и читателей. Другие базы данных, к которым мы все еще можем добраться. Это должно быть сделано не в производственной среде.
Создание фонового индекса немного медленнее, и они не блокируют читателей и писателей. С помощью MongoDB
2.4 и более поздних версий вы можете создавать несколько фоновых индексов параллельно даже в одной базе данных.
Начиная с MongoDB
2.6, создание индекса в фоновом режиме на первичной основе приведет к тому, что индексы будут созданы в фоновом режиме на вторичных. Вторичные начнут создание индекса, когда первичный объект завершит построение своего индекса.
Существует еще один способ создания индекса очень эффективно в производственной системе. То есть для создания индекса на другом сервере, который используется для обслуживания большинства запросов. Скажем, в наборе реплик из нескольких серверов баз данных, работающих в тандеме, можно извлечь и запросы можно перенаправить на доступные. Создание индекса переднего плана может быть выполнено на отдельном сервере. После того, как создание будет выполнено успешно, его можно вернуть в кластер.
Ответ 3
У вас есть три варианта построения индексов
1) Foreground
2) Предыстория
3) Роллинг (сервер по серверу)
Все методы имеют плюсы и минусы. Мой предпочтительный метод для производственного кластера - 3). Подробнее в сообщении в блоге, которое я создал - https://scalegrid.io/blog/the-perils-of-building-indexes-on-mongodb/