Как изменить существующий индекс MongoDB? - PullRequest
3 голосов
/ 30 мая 2011

У меня есть ряд индексов в моей MongoDB, и я думаю , что одна из причин, по которой я работаю в системе с таким высоким ЦП, заключается в том, что обновление индексов блокирует. (Микроэкземпляр AWS работает с 50% + ЦП при нормальной работе, 99,9% при тяжелых операциях записи).

У меня есть достаточно горстки индексов для быстрых запросов, и теперь я думаю, что смогу показать некоторые дальнейшие улучшения, переместив построение индекса в фоновую операцию.

Я не хочу полностью удалить индексы (по крайней мере, я так не думаю), вместо этого я был бы рад, если бы "фоновые операции" выполнялись в фоновом режиме.

Я посмотрел документацию по созданию индекса mongo http://www.mongodb.org/display/DOCS/Indexes и вижу флаги включения фоновой операции (см. Ниже), но ничего не вижу о том, как изменить существующий индекс.

 db.things.ensureIndex({x:1}, {background:true});
 > db.things.ensureIndex({name:1}, {background:true, unique:true,
 ... dropDups:true});

Я попытался выполнить исходную команду индекса во второй раз с обновленным параметром, но когда я повторно выполняю db.colection.getIndexes(); comant, он не показывает параметр 'background' в выводе.

{
    "_id" : ObjectId("4de2c1a5c9907a4e77467826"),
    "ns" : "mydb.items",
    "key" : {
        "itemA" : 1,
        "itemB" : -1,
        "itemC" : -1
    },
    "name" : "itemA_1_itemB_-1_itemC_-1",
    "v" : 0
}

Должен ли я сбросить индекс и начать заново? или параметр index-in-background просто не отображается?

@ TTT из комментариев: Вы хотите асинхронное обновление индекса после того, как вы вставили, обновили или удалили документ?

Я думаю так. Я бы хотел, чтобы скорость запросов системы всегда была максимальной, поэтому мне определенно нужны индексы, но бывают и случаи, когда я запускаю десятки тысяч вставок. Это становится проблемой для всей системы, поскольку загрузка ЦП Mongo увеличивается до 99,9% в течение всего периода обновления.

Я думаю, что обновление индексов в фоновом режиме - это ответ, но я читал в документах MONGO, что если индекс пересчитывается, он не используется в запросах до тех пор, пока не будет выполнен перерасчет.

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

1 Ответ

3 голосов
/ 31 мая 2011

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

EC2 Микроэкземпляры, как известно, плохо работают, когда речь заходит о какой-либо устойчивой работе. Обслуживание веб-страниц - это хорошо, но любое длительное использование процессора со временем приведет к ухудшению производительности. Это является результатом того, что доступный устойчивый ЦП намного меньше, чем серийный ЦП, доступный для более коротких операций.

Со страницы EC2 Amazon:

Экземпляры этого семейства обеспечивают небольшое количество согласованных ресурсов ЦП и позволяют увеличивать емкость ЦП, когда доступны дополнительные циклы. Они хорошо подходят для приложений с низкой пропускной способностью и веб-сайтов, которые периодически потребляют значительные вычислительные циклы.

И

до 2 вычислительных блоков EC2 (для коротких периодических пакетов)

Я бы порекомендовал перейти на установку с более доступным ЦП, например, небольшим экземпляром или, если одной из ваших основных задач, является стоимость, - Linode VPS.

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