MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да спрете изграждането на Runaway Index в MongoDB

Изграждането на индекси в MongoDB може да има неблагоприятно въздействие върху наличността на вашия MongoDB клъстер. Ако задействате изграждане на индекс на преден план върху голяма колекция на вашия производствен сървър, може да откриете, че вашият клъстер не реагира, докато изграждането на индекса не завърши. При голяма колекция това може да отнеме няколко часа или дни, както е описано в опасностите от изграждане на индекси в MongoDB.

Препоръчителната най-добра практика е да се задейства изграждането на индекси във фонов режим, но при индекси на големи колекции сме виждали множество проблеми с този подход. В случай на клъстер с три възли, и двете вторични започват да изграждат индекса и спират да отговарят на всякакви заявки. Следователно първичният няма кворум и се премества във вторичното състояние, като сваля клъстера ви. Също така, изграждането на индекс по подразбиране, задействано от командния ред, е изграждане на индекс на преден план – което прави това вече широко разпространен проблем. В бъдещи издания се надяваме това да стане на заден план по подразбиране.

След като задействате индекс, простото рестартиране на сървъра не решава проблема ни; MongoDB ще продължи изграждането на индекса от мястото, където е спряло. Ако сте изпълнявали изграждане на фонов индекс след рестартирането, то сега става изграждане на индекс на преден план, така че в този случай рестартирането може да влоши проблема.

Ако вече сте задействали изграждане на индекс, как да го спрете? За щастие е сравнително лесно да спрете изграждането на индекс.

Опция 1:Прекратете процеса на изграждане на индекс

Намерете процеса на изграждане на индекс, като използвате db.currentOp() и след това прекратете операцията с помощта на db.killOp(). Операцията с индекс ще изглежда така:

{
"opid" : 820659355,
"active" : true,
"lockType" : "write",
....
"op" : "insert",
"ns" : "xxxx",
"query" : {
},
"client" : "xxxx",
"desc" : "conn",
"msg" : "index: (2/3) btree bottom up 292168587/398486401 64%"
}

Ако възелът, където се изгражда индексът, не отговаря на нови връзки или killOp не работи, използвайте опция 2 по-долу:

Опция 2:Конфигуриране на „noIndexBuildRetry“ и рестартиране

MongoDB предоставя опция „–noIndexBuildRetry“, която инструктира MongoDB да спре изграждането на непълни индекси при рестартиране.

Изглежда, че този параметър не се поддържа от конфигурационния файл, а само като параметър за процеса mongod. Не предпочитаме да стартираме mongod ръчно с тази опция защото ако случайно стартирате процеса на mongod като потребител с повишени права (напр. root), той в крайна сметка променя разрешенията на всички файлове. Също така, след като стартираме като „root“, имахме периодични проблеми при стартиране на процеса като mongod отново.

По-проста опция е да редактирате файла /etc/init.d/mongod. Търси този ред:

OPTIONS=" -f $CONFIGFILE"

Заменете с този ред:

OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"

Подробни стъпки

За целите на тази дискусия предоставяме инструкции за CentOS/RedHat/Amazon Linux.

  1. Конфигурирайте „–noIndexBuildRetry“

    Добавете опцията „–noIndexBuildRetry“ към всичките си възли с данни, както е обяснено по-горе.

  2. Рестартирайте всички възли, изграждащи индекса

    Вижте регистрационния файл на mongod за всеки сървър на данни и определете дали той изгражда индекса. Ако е така, рестартирайте сървъра „service mongod restart“.

  3. Изхвърлете непълния индекс

    След като всички съответни възли са рестартирани, погледнете списъка с индекси и пуснете непълния индекс, ако го видите в списъка.

  4. Премахнете „–noIndexBuildRetry“

    Редактирайте файла /etc/init.d/mongod, за да премахнете опцията –noIndexBuildRetry, която сте добавили в стъпка 1, за да можем да се върнем към поведението по подразбиране за възобновяване на изграждането на индекса.

За всякакви допълнителни въпроси се свържете с нас на [email protected].

Приятно индексиране!


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Meteor:Неочакван изходен код на mongo 100. Рестартиране. Не може да се стартира mongo сървър

  2. Актуализиране на обект на масив въз основа на идентификатора?

  3. Бързо или насипно вдигане в pymongo

  4. Безопасно ли е да изтриете дневника на mongodb?

  5. Вземете брой на общите документи с MongoDB, когато използвате лимит