Convertendo Replica Set para Standalone.

Originally written for Percona Blog in January, 2023 – MongoDB – Converting Replica Set to Standalone


Um dos motivos para usar o MongoDB é sua facilidade em escalar sua estrutura, seja como um Replica Set (scale-up) ou como um Sharded Cluster (scale-out).

Embora o processo inverso seja um pouco mais complicado em ambientes shardeds, ele também pode ser realizado.

Entre as possibilidades, você pode:

Até aqui, tudo bem.

Mas, se por algum motivo o projeto MongoDB que começou como um Replica Set não precisa mais dessa estrutura e agora um servidor Standalone atende aos requisitos, surge a questão:

  • É possível converter um Replica Set para um servidor Standalone?
    • Se sim, qual é o procedimento para realizar essa configuração?

Este artigo guiará você pelos passos necessários para converter um Replica Set em um servidor Standalone.

Observações:

Antes de começar o processo, é importante mencionar que não é recomendável usar uma configuração Standalone em servidores de produção, pois toda a disponibilidade dependerá de um único ponto, aumentando o risco de falhas.

Outra observação é que essa atividade exige downtime, pois será necessário remover o parâmetro de replicação, algo que não pode ser feito com o processo do banco em execução.

Por fim, para evitar alterações nos dados durante o procedimento, recomenda-se interromper as operações de escrita realizadas pela aplicação.

Ao final do processo, também será necessário ajustar a string de conexão para refletir a nova configuração.

 

How To:

O ambiente de teste utilizado para este artigo é uma configuração padrão de Replica Set com três nós, conforme mostrado no status de replicação:

O nó PRIMARY será a nossa fonte confiável de dados e se tornará o servidor Standalone ao final do processo.

Se você prefere que outro nó seja o Standalone e ele ainda não for o nó Primário, certifique-se de promovê-lo antes de iniciar o procedimento.

  • 1. Removendo os secundários:

No nó Primário, remova os nós node2 e node3:

Nota: Caso o seu Replica Set possua mais de três nós, o processo é o mesmo. Apenas o nó primário deve permanecer no Replica Set nesta etapa.

Após a remoção o status esperado deve ser:

  • 2.Alterando a configuração:

Embora node2 e node3 já não façam parte do Replica Set, pare o processo mongod nos respectivos servidores para garantir que os dados fiquem seguros para possíveis recuperações:

No nó primário, remova o parâmetro de replicação do arquivo de configuração. Edite o arquivo mongo.conf e comente ou remova as linhas:

Nota: Caso você inicie o MongoDB pela linha de comando, remova a opção --replSet.

Quando feito, reinicie o serviço no primário:

  • 3. Removendo objetos de replicação:

Quando você se conectar ao nó PRIMARY convertido para Standalone, o MongoDB exibirá o seguinte aviso:

Document(s) exist in ‘system.replset’, but started without –replSet. Database contents may appear inconsistent…

Esse aviso ocorre porque a configuração do Replica Set ainda está presente no banco de dados local (em local.system.replset). O que foi feito até o momento foi apenas a remoção dos antigos nós secundários e a remoção do parâmetro de Replica Set. Todo o metadata relacionado ainda existe dentro do banco de dados primário.

Para remover esse aviso, você deve excluir o objeto antigo de Replica Set em local.system.replset.

O local.system.replset contém o objeto de configuração do conjunto de réplicas como seu único documento. Para exibir as informações de configuração do objeto, emita rs.conf() de mongosh. Você também pode fazer query desta coleção diretamente.

No entanto, é importante destacar que o local.system.replset é um objeto do sistema, e não há uma Role padrão que permita remover objetos desse tipo – a menos que você crie uma Role personalizada que conceda a permissão anyAction em anyResource ao usuário, ou atribua o papel interno __system ao usuário.

⚠️ Nota: Ambas as opções concedem acesso irrestrito a todos os recursos do sistema e são destinadas apenas para uso interno. Não utilize essas permissões, exceto em circunstâncias excepcionais.

Dito isto.

Para este processo, criaremos um novo usuário temporário com o privilégio __system, que poderá ser removido posteriormente após a execução da ação.

  • 4. Criando o usuário temporário:

  • 5. Removendo o objeto:

Primeiro conecte-se utilizando o usuário criado, e em seguida remova o metadata relacionado a configuração do Replica Set:

Saída de confirmação esperada:

WriteResult({ "nRemoved" : 1 })
  • 6. Removendo o usuário temporário:

Uma vez finalizado a remoção do metadata, desconecte-se do usuário temporário criado. Em seguida, com o usuário admistrativo remova o "dba_system":

  • 7. Reiniciando o serviço:

Reinicie o serviço mongod para aplicar as alterações:

Uma vez reconectado ao servidor, o aviso não será exibido novamente, e o servidor estará pronto! 🎉

  • 8. Orientação para Conexão:

Certifique-se de ajustar a string de conexão na aplicação e nos clientes, apontando apenas para o servidor Standalone.

 

Conclusão:

O processo de conversão, em geral, é simples e não deve apresentar grandes problemas. No entanto, é essencial destacar que é fortemente recomendado testar e executar este procedimento em um ambiente de teste ou desenvolvimento. Caso planeje utilizá-lo em produção, lembre-se das observações feitas anteriormente.

Se tiver alguma dúvida, fique à vontade para entrar em contato na seção de comentários abaixo!

 

Até mais!

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *