Versão curta : Existe uma maneira de adicionar um novo servidor SECONDARY a um conjunto de réplicas do MongoDB de produção existente sem tempo de inatividade e sem desabilitar temporariamente as configurações de "auth" e "keyfile" nos servidores existentes?
Versão longa : Meu ambiente de produção atual consiste em três servidores Windows 2012 R2 DataCenter executando o MongoDB versão 2.4.9 como um serviço:
PRIMARY - ServerA.example.org:27017
SECONDARY - ServerB.example.org:27017
ARBITER - ServerC.example.org:27017
Eu tenho duas contas de usuário do MongoDB no ambiente:
{ "_id" : ObjectId("XXXXXXXXXX"), "pwd" : "XXXXXXXXXX", "user" : "mongo-admin", "roles" : [ "userAdminAnyDatabase" ] }
{ "_id" : ObjectId("XXXXXXXXXX"), "pwd" : "XXXXXXXXXX", "user" : "mongo-cluster-admin", "roles" : [ "clusterAdmin" ] }
E o arquivo de configuração nos servidores existentes se parece com isso:
logpath=C:\mongo\logs\mongo.log
dbpath=C:\mongo\data
replSet=rs
oplogSize=700
port=27017
auth=true
keyFile=C:\mongo\config\keyfile.txt
Desejo adicionar ServerD e ServerE como novos servidores SECONDARY.
Eu tentei o seguinte na minha estação de trabalho e no console local no ServerA, com e sem o "auth" e o "keyfile" na configuração do ServerD, mas obtive o mesmo resultado em todos os casos:
D:\MongoDB\bin>mongo ServerA.example.org:27017
MongoDB shell version: 2.4.7
connecting to: ServerA.example.org:27017/test
> use admin
switched to db admin
> db.auth("mongo-cluster-admin", "XXXXXXXXXX")
1
rs:PRIMARY> rs.add("ServerD.example.org:27017")
Mon May 19 11:41:42.050 count failed: { "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/query.js:180
A única maneira de fazer isso funcionar em um ambiente de teste é desabilitar as configurações "auth" e "keyfile" em todos os cinco servidores e adicionar os novos servidores ao conjunto de réplicas usando "rs.add() " no PRIMARY e, finalmente, reative "auth" e "keyfile" em todos os servidores. Isso requer algumas reinicializações do serviço MongoDB em cada caixa para atualizar as configurações, o que eu realmente quero evitar.
Existe uma maneira de adicionar os novos servidores SECONDARY ao conjunto de réplicas sem alterar primeiro as configurações de "auth" e "keyfile" nos servidores existentes?
Basta adicionar o novo secundário com autenticação habilitada e usando arquivos de chave idênticos desde o início. Se você fizer isso, eles se conectarão, usarão o arquivo-chave para autenticar e sincronizarão do zero - não há motivo para alterar os membros originais do conjunto, apenas certifique-se de que os novos que você adicionar tenham o arquivo-chave correto (idêntico) como os membros originais.
A outra coisa a garantir é que o usuário com o qual você está autenticado tem as permissões corretas para fazer as adições (já que desativar a autenticação resolveria esse problema também). Para referência, a função integrada com as permissões relevantes é clusterManager para 2.6+ - clusterAdmin também deve funcionar e tem a vantagem de existir em 2.4.
De acordo com a discussão de comentários, a ressalva
clusterAdmin
em 2.4 é que, embora você tenha permissão para executar os comandos relevantes, precisará ter privilégios de leitura no banco de dados local (conforme a seção Acesso Combinado dos documentos 2.4) para usar o rs.conf () comando. Não é estritamente necessário, mas sem ele você terá que construir todo o documento de configuração do zero para um comando de reconfiguração que certamente é inconveniente.