Construção contínua de índices em conjuntos réplicas
Nesta página
As compilações de índice podem afetar o desempenho do conjunto de réplicas. Por padrão, o MongoDB cria índices simultaneamente em todos os membros do conjunto de réplicas com dados portadores. Para cargas de trabalho que não toleram a diminuição do desempenho devido à compilação de índices, considere usar o procedimento a seguir para criar índices de forma contínua.
As construções de índices contínuas retiram no máximo um membro do conjunto de réplicas de cada vez, começando pelos membros secundários, e constroem o índice nesse membro como standalone. As construções de índices contínuas exigem pelo menos uma eleição de conjunto de réplicas.
Observação
Para obter informações sobre como criar índices no Atlas, consulte a página degerenciamento de índice do na documentação do Atlas .
Considerações
Unique Indexes
Para criar índices únicos usando o procedimento a seguir, você deve parar todas as gravações da coleção durante o procedimento.
Se não for possível parar todos os escritos na coleção durante este procedimento, não use o procedimento nesta página. Em vez disso, crie seu índice único na coleção emitindo db.collection.createIndex()
no principal para um conjunto de réplicas.
Tamanho do log
Certifique-se de que seu oplog seja grande o suficiente para permitir que a operação de indexação ou reindexação seja concluída sem ficar muito para trás para recuperar o atraso. Consulte a documentação de dimensionamento do oplog para obter informações adicionais.
Pré-requisitos
- Para construir índices únicos
Para criar índices únicos usando o procedimento a seguir, você deve interromper todas as gravações na coleção durante a criação do índice. Caso contrário, você pode acabar com dados inconsistentes nos membros do conjunto de réplica.
Aviso
Se não for possível parar todos os escritos na coleção, não use o procedimento a seguir para criar índices únicos.
Procedimento
Importante
O procedimento a seguir para criar índices de forma contínua se aplica a sistemas de conjunto de réplicas, e não a clusters fragmentados. Para o procedimento para clusters fragmentados, consulte Rolling Index Builds on Sharded Clusters.
1. Oculte e reinicie um secundário.
Execute os seguintes comandos no seu nó primário para ocultar o secundário que criará o novo índice.
Neste exemplo, o secundário que construirá o novo índice é o terceiro nó em cfg.members
.
var cfg = rs.conf(); // Record originalPriority so that you can reset it later. var originalPriority = cfg.members[2].priority; cfg.members[2].priority = 0; cfg.members[2].hidden = 1; rs.reconfig(cfg);
2. Pare um secundário e reinicie como autônomo.
Interrompa o processo mongod
associado a uma secundária. Reinicie depois de fazer as seguintes atualizações de configuração:
Se você estiver usando um arquivo de configuração, faça as seguintes atualizações de configuração:
Comente a opção
replication.replSetName
.Mude
net.port
para uma porta diferente. [1] Anote a configuração original da porta como comentário.Defina o parâmetro
disableLogicalSessionCacheRefresh
comotrue
na seçãosetParameter
.
Por exemplo, o arquivo de configuração atualizado para um membro do conjunto de réplicas incluirá conteúdo como o exemplo a seguir:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27217 # port: 27017 #replication: # replSetName: myRepl setParameter: disableLogicalSessionCacheRefresh: true
Outras configurações (por exemplo storage.dbPath
, etc.) permanecem inalteradas.
E reinicie:
mongod --config <path/To/ConfigFile>
Se estiver usando opções de linha de comando, faça as seguintes atualizações de configuração:
Remova
--replSet
.Configure o parâmetro
disableLogicalSessionCacheRefresh
paratrue
na opção--setParameter
.
Por exemplo, se o membro do conjunto de réplicas normalmente for executado com a porta padrão de 27017
e a opção --replSet
, você deve especificar uma porta diferente, omitir a opção --replSet
e definir o parâmetro disableLogicalSessionCacheRefresh
como verdadeiro:
mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true
Outras configurações (por exemplo --dbpath
, etc.) permanecem inalteradas.
[1] | (1, 2) Ao executar o mongod em uma porta diferente, você garante que os outros membros do conjunto de réplicas e todos os clientes não entrem em contato com o membro enquanto você estiver construindo o índice. |
3. Construa o Índice.
Conecte-se diretamente à instânciamongod
em execução como standalone na nova porta e crie o novo índice para essa instância.
Por exemplo, conecte mongosh
à instância e use createIndex()
para criar um índice ascendente no campo username
da coleção records
:
db.records.createIndex( { username: 1 } )
4. Reinicie o programa mongod
como membro do conjunto de réplicas.
Quando a criação do índice for concluída, encerre a instância . Para retornar o nó à configuração original, desfaça as alterações de configuração que você fez quando iniciou o nó como autônomo. Em seguida, reinicie o nó como membro do conjunto de mongod
réplicas.
Importante
Certifique-se de remover o parâmetro disableLogicalSessionCacheRefresh
.
Por exemplo, para reiniciar seu membro do conjunto de réplicas:
Se você estiver usando um arquivo de configuração:
Reverta para o número da porta original.
Descomente o
replication.replSetName
.Remova o parâmetro
disableLogicalSessionCacheRefresh
da seçãosetParameter
.
Por exemplo:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27017 replication: replSetName: myRepl
Outras configurações (por exemplo storage.dbPath
, etc.) permanecem inalteradas.
E reinicie:
mongod --config <path/To/ConfigFile>
Importante
Permita que a replicação alcance este membro antes de iniciar a próxima etapa.
5. Mostrar o secundário.
Execute o seguinte comando no seu primary para exibir o nó secundário que criou o índice. Neste exemplo, o nó secundário que criou o índice é o terceiro nó em cfg.members
.
var cfg = rs.conf(); cfg.members[2].priority = originalPriority; cfg.members[2].hidden = false; rs.reconfig(cfg);
6. Repita o procedimento para os secundários restantes.
Quando o membro alcançar os outros membros do conjunto, repita o procedimento um membro por vez para os membros secundários restantes:
7. Construa o índice no primário.
Quando todos os secundários tiverem o novo índice, retire o primário, reinicie-o como standalone usando o procedimento descrito acima e crie o índice no primário anterior:
Use o método
rs.stepDown()
emmongosh
para reduzir o primário. Após a redução bem-sucedida, o primário atual se torna secundário e os nós do conjunto de réplicas elegem um novo primário.Reinicie o programa mongod como um membro do conjunto de réplicas.