As compilações de índice no MongoDB podem ter um impacto adverso na disponibilidade do cluster do MongoDB. Se você acionar uma compilação de índice em primeiro plano em uma coleção grande em seu servidor de produção, poderá descobrir que seu cluster não responde até que a compilação do índice seja concluída. Em uma coleção grande, isso pode levar várias horas ou dias, conforme descrito nos perigos da construção de índice no MongoDB.
A prática recomendada recomendada é acionar compilações de índice em segundo plano, no entanto, em índices de coleções grandes, vimos vários problemas com essa abordagem. No caso de um cluster de três nós, ambos os secundários começam a construir o índice e param de responder a qualquer solicitação. Consequentemente, o primário não tem quórum e passa para o estado secundário, desativando seu cluster. Além disso, as compilações de índice padrão acionadas a partir da linha de comando são compilações de índice em primeiro plano – tornando isso um problema agora generalizado. Em versões futuras, esperamos que isso se torne plano de fundo por padrão.
Depois de acionar um índice, simplesmente reiniciar o servidor não resolve nosso problema; O MongoDB retomará a compilação do índice de onde parou. Se você estava executando uma compilação de índice em segundo plano anteriormente após a reinicialização, agora ela se torna uma compilação de índice em primeiro plano. Nesse caso, a reinicialização pode piorar o problema.
Se você já acionou uma compilação de índice, como você a interrompe? Felizmente, é relativamente fácil interromper uma compilação de índice.
Opção 1:encerre o processo de criação do índice
Localize o processo de compilação do índice usando db.currentOp() e, em seguida, elimine a operação usando 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%" }
Se o nó em que o índice está sendo compilado não responder a novas conexões ou o killOp não funcionar, use a Opção 2 abaixo:
Opção 2:configurar “noIndexBuildRetry” e reiniciar
O MongoDB fornece uma opção “–noIndexBuildRetry” que instrui o MongoDB a parar de construir índices incompletos na reinicialização.
Este parâmetro não parece ser suportado pelo arquivo de configuração, apenas como parâmetro para o processo mongod. Não preferimos executar o mongod manualmente com esta opção porque se você acidentalmente executar o processo do mongod como um usuário elevado (por exemplo, root), ele acaba alterando as permissões de todos os arquivos. Além disso, uma vez executado como “root”, tivemos problemas intermitentes ao executar o processo como mongod novamente.
Uma opção mais simples é editar o arquivo /etc/init.d/mongod. Procura esta linha:
OPTIONS=" -f $CONFIGFILE"
Substitua por esta linha:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
Etapas detalhadas
Para os propósitos desta discussão, estamos fornecendo instruções para CentOS/RedHat/Amazon Linux.
-
Configurar “–noIndexBuildRetry”
Adicione a opção “–noIndexBuildRetry” a todos os nós de dados, conforme explicado acima. -
Reinicie todos os nós criando o índice
Observe o arquivo de log do mongod para cada servidor de dados e determine se ele está construindo o índice. Se estiver, reinicie o servidor “service mongod restart”. -
Retire o índice incompleto
Depois que todos os nós relevantes forem reiniciados, observe a lista de índices e elimine o índice incompleto se você o vir na lista. -
Remover “–noIndexBuildRetry”
Edite o arquivo /etc/init.d/mongod para remover a opção –noIndexBuildRetry que você adicionou na etapa 1 para que possamos voltar ao comportamento padrão de retomar a compilação do índice.
Para mais perguntas, entre em contato conosco em [email protected].
Boa indexação!