Converter um conjunto de réplicas autogerenciadas em um cluster fragmentado
Os clusters fragmentados particionam dados em vários servidores com base em uma chave de fragmento. Um cluster fragmentado é mais bem dimensionado do que um conjunto de réplicas para implantações com grandes conjuntos de dados e operações de alta taxa de transferência.
Este tutorial converte uma única réplica de três membros definida em um cluster fragmentado com dois fragmentos. Cada fragmento no novo cluster é um conjunto independente de réplica de três membros.
Você pode converter em um cluster fragmentado na IU para implantações hospedadas no MongoDB Atlas.
Sobre esta tarefa
Algumas etapas deste tutorial causam tempo de inatividade para seu sistema. Etapas individuais indicam quando o tempo de inatividade ocorrerá.
Este tutorial é para sistemas que têm autenticação habilitada.
Neste tutorial, você especifica as configurações do servidor com arquivos de configuração. Os arquivos de configuração contêm configurações que são equivalentes às opções de linha de comando
mongod
emongos
.O cluster fragmentado que você implementa com este tutorial contém dez servidores:
Um servidor para o
mongos
.Três servidores cada para os dois fragmentos no cluster (seis servidores no total).
Três servidores para o conjunto de réplicas do servidor de configuração.
Arquitetura de servidor
Este tutorial utiliza os seguintes servidores:
nome de anfitrião | Porta | Descrição |
---|---|---|
|
| Membro do fragmento de suporte de dados inicial, |
|
| Membro do fragmento de suporte de dados inicial, |
|
| Membro do fragmento de suporte de dados inicial, |
|
| Membro do segundo shard que contém dados, |
|
| Membro do segundo shard que contém dados, |
|
| Membro do segundo shard que contém dados, |
|
| O |
|
| Membro do conjunto de réplica do servidor de configuração. |
|
| Membro do conjunto de réplica do servidor de configuração. |
|
| Membro do conjunto de réplica do servidor de configuração. |
Os nomes de host utilizados neste tutorial são exemplos. Substitua os nomes de host utilizados nos comandos de exemplo pelos nomes de host utilizados em seus sistemas.
Importante
Para evitar atualizações de configuração devido a alterações de endereço IP, use nomes de host DNS em vez de endereços IP. É particularmente importante usar um nome de host DNS em vez de um endereço IP ao configurar membros de conjunto de réplicas ou membros de cluster fragmentado.
Use nomes de host em vez de endereços IP para configurar cluster em um horizonte de rede dividido. Começando no MongoDB 5.0, nós configurados apenas com um endereço IP falham na validação de inicialização e não são iniciados.
Antes de começar
Para concluir este tutorial, você deve ter um conjunto de réplica que utilize um arquivo de chave ou autenticação de certificado x.509. Para implementar um conjunto de réplicas seguro que utiliza um destes métodos de autenticação, consulte:
Este tutorial utiliza os diretórios de dados padrão
/data/db
e/data/configdb
. Para usar caminhos diferentes, defina a configuraçãostorage.dbPath
no arquivo de configuração.O MongoDB oferece suporte à transição online de um conjunto de réplicas para um cluster 1-shard, permitindo que os comandos sejam executados diretamente em um shard. No entanto, quando o cluster tiver mais de um shard, somente os comandos listados poderão ser executados diretamente no shard sem a função
directShardOperations
somente de manutenção.
Passos
Observação
A partir do MongoDB 8.0, você só pode executar determinados comandos em shards. Se você tentar se conectar diretamente a um fragmento e executar um comando não suportado, o MongoDB retornará um erro:
"You are connecting to a sharded cluster improperly by connecting directly to a shard. Please connect to the cluster via a router (mongos)."
Para executar um comando de banco de dados de dados não suportado diretamente em um shard, você deve se conectar a mongos
ou ter a função directShardOperations
somente de manutenção.
Implemente o Config Server Replica Set
Implemente um conjunto de réplica de três membros para os servidores de configuração. Neste exemplo, os servidores de configuração usam os seguintes hosts:
mongodb7.example.net
mongodb8.example.net
mongodb9.example.net
Configure os servidores de configuração
Configure uma instância
mongod
em cada host do servidor de configuração. Especifique essas opções no arquivo de configuração para cada instânciamongod
:OpçãoValorconfigReplSet
configsvr
localhost
, seguido por quaisquer outros nomes de host nos quaismongod
deve escutar conexões de cliente.replication: replSetName: configReplSet sharding: clusterRole: configsvr net: bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para seu sistema.
Inicie os servidores de configuração.
Implemente o
mongod
com sua configuração especificada:mongod --config <PATH_TO_CONFIG_FILE> Os servidores de configuração usam o directoria de dados padrão
/data/configdb
e a porta padrão27019
.Conecte-se a um dos servidores de configuração.
Utilize o
mongosh
para conectar a um dos servidores de configuração. Por exemplo:mongosh "mongodb://mongodb7.example.net:27019" Inicie o conjunto de réplica do servidor de configuração.
Para iniciar o conjunto de réplicas, execute
rs.initiate()
:rs.initiate( { _id: "configReplSet", configsvr: true, members: [ { _id: 0, host: "mongodb7.example.net:27019" }, { _id: 1, host: "mongodb8.example.net:27019" }, { _id: 2, host: "mongodb9.example.net:27019" } ] } ) O comando anterior utiliza a exceção Localhost para executar ações administrativas sem autenticação.
Importante
Execute
rs.initiate()
em apenas uma instânciamongod
para o conjunto de réplicas.
Restaurar usuários e roles existentes para a nova configuração
Restaure os usuários e as funções existentes que você obteve ao executar mongodump
.
mongorestore ./adminDump --nsInclude "admin.*" --host <configPrimaryURI>
O comando anterior utiliza a exceção Localhost para executar ações administrativas sem autenticação.
A saída da execução desse comando pode ser semelhante a:
0 document(s) restored successfully
Essa mensagem não indica um problema. Essa saída significa que os documentos 0, exceto os usuários e as funções, foram restaurados.
Conjunto de réplicas do servidor de configuração segura
Reconfigurar e reiniciar o conjunto de réplicas do servidor de configuração.
Reconfigurar os servidores de configuração
Selecione a guia do mecanismo de autenticação:
Reinicie uma instância
mongod
em cada um destes hosts:mongodb7.example.net
mongodb8.example.net
mongodb9.example.net
Especifique estas opções no arquivo de configuração para cada instância
mongod
:OpçãoValorO caminho para o arquivo-chave usado para seu conjunto de réplicas inicial.
security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: configReplSet sharding: clusterRole: configsvr net: bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para seu sistema.
Reinicie uma instância
mongod
em cada um destes hosts:mongodb7.example.net
mongodb8.example.net
mongodb9.example.net
Especifique essas opções no arquivo de configuração para cada instância
mongod
, além das opções que você já configurou:OpçãoValorx509
requireTLS
O caminho absoluto para o arquivo
.pem
que contém o certificado e a chave TLS.O caminho absoluto para o arquivo
.pem
que contém a sequência de certificados raiz da autoridade de certificação.localhost
, seguido por quaisquer outros nomes de host nos quaismongod
deve escutar conexões de cliente.AVISO: antes de vincular sua instância a um endereço IP acessível publicamente, você deve proteger seu cluster contra o acesso não autorizado. Para obter uma lista completa de recomendações de segurança, consulte a Lista de verificação de segurança para implementações autogerenciadas. No mínimo,procure habilitar a autenticação e fortalecer a infraestrutura de rede.
sharding: clusterRole: configsvr replication: replSetName: configReplSet security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para sua implantação, como
net.tls.certificateKeyFilePassword
se o arquivo de chave de certificado TLS estiver criptografado com uma senha.Reinicie o MongoDB.
Reinicie o
mongod
com sua configuração especificada:mongod --config <PATH_TO_CONFIG_FILE> --shutdown mongod --config <PATH_TO_CONFIG_FILE>
Implemente o mongos
O mongos
fornece a interface entre os aplicativos do cliente e o cluster fragmentado.
Crie um arquivo de configuração para os mongos.
Especifique estas opções em seu arquivo de configuração do
mongos
:OpçãoValorconfigReplSet
, seguido por uma barra/
e pelo menos um dos nomes de host e portas do servidor de configuração.O caminho para o arquivo-chave usado para seu conjunto de réplicas inicial.
localhost
, seguido por quaisquer outros nomes de host nos quaismongos
deve escutar conexões de cliente.sharding: configDB: configReplSet/mongodb7.example.net:27019,mongodb8.example.net:27019,mongodb9.example.net:27019 security: keyFile: <PATH_TO_KEYFILE> net: bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para seu sistema.
Especifique estas opções em seu arquivo de configuração do
mongos
:OpçãoValorconfigReplSet
, seguido por uma barra/
e pelo menos um dos nomes de host e portas do servidor de configuração.x509
requireTLS
O caminho absoluto para o arquivo
.pem
que contém o certificado e a chave TLS.O caminho absoluto para o arquivo
.pem
que contém a sequência de certificados raiz da autoridade de certificação.localhost
, seguido por quaisquer outros nomes de host nos quaismongos
deve escutar conexões de cliente.sharding: configDB: configReplSet/mongodb7.example.net:27019,mongodb8.example.net:27019,mongodb9.example.net:27019 security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<hostname(s)> Inclua quaisquer opções adicionais apropriadas para sua implantação.
Implemente os mongos.
Implemente o
mongos
com sua configuração especificada:mongos --config <PATH_TO_CONFIG_FILE>
Reinicie o conjunto de réplicas iniciais como fragmento
Neste exemplo, seu conjunto de réplicas inicial é um conjunto de réplicas de três membros. Essa etapa atualiza o conjunto inicial de réplicas para que ele possa ser adicionado como um fragmento ao seu cluster fragmentado.
O conjunto de réplicas é executado nestes hosts:
mongodb0.example.net:27017
mongodb1.example.net:27017
mongodb2.example.net:27017
Para clusters fragmentados, você deve definir a função de cada instância mongod
no fragmento como shardsvr
. Para especificar a função do servidor, defina a configuração sharding.clusterRole
no arquivo de configuração mongod
.
Observação
Conecte-se a um membro do seu conjunto de réplicas inicial.
Use
mongosh
para se conectar a um dos membros do seu conjunto de réplicas inicial.mongosh "mongodb://<username>@mongodb0.example.net:27017" Se sua implantação usar a autenticação x.509, especifique estas
mongosh
opções:Por exemplo:
mongosh "mongodb://<username>@mongodb0.example.net:27017" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Determine o primário e os secundários do conjunto de réplicas.
Execute
rs.status()
para determinar a primária e as secundárias:rs.status() Na saída de comando, o campo
replSetGetStatus.members[n].stateStr
indica qual membro é o principal e quais membros são secundários.Reinicie os secundários com a opção
--shardsvr
.Aviso
Essa etapa exige algum tempo de inatividade para os aplicativos conectados aos secundários do conjunto de réplicas.
Após reiniciar uma secundária, todos os aplicativos conectados a essa secundária retornarão um erro
CannotVerifyAndSignLogicalTime
até que você execute as etapas em Adicionar o conjunto de réplicas iniciais como um fragmento.Você também pode reiniciar seu aplicativo para impedir que ele receba
CannotVerifyAndSignLogicalTime
erros.Conecte-se a um secundário.
Utilize
mongosh
para se conectar a um dos secundários.mongosh "mongodb://<username>@<host>:<port>" Desative o secundário.
Execute os seguintes comandos:
use admin db.shutdownServer() Edite o arquivo de configuração do secundário.
No arquivo de configuração do secundário, defina
sharding.clusterRole
parashardsvr
:security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs0 sharding: clusterRole: shardsvr net: port: 27017 bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para seu sistema.
Reinicie o secundário como um servidor shard.
Execute o seguinte comando no host que contém o secundário:
mongod --config <PATH_TO_CONFIG_FILE> Repita o desligamento e reinicie as etapas para o outro secundário.
Conecte-se a um secundário.
Utilize
mongosh
para se conectar a um dos secundários.Se sua implantação usar a autenticação x.509, especifique estas
mongosh
opções:mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Desative o secundário.
Execute os seguintes comandos:
use admin db.shutdownServer() Edite o arquivo de configuração do secundário.
No arquivo de configuração do secundário, defina
sharding.clusterRole
parashardsvr
:replication: replSetName: rs0 sharding: clusterRole: shardsvr security: clusterAuthMode: x509 net: port: 27017 tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para sua implantação, como
net.tls.certificateKeyFilePassword
se o arquivo de chave de certificado TLS estiver criptografado com uma senha.Reinicie o secundário como um servidor shard.
Execute o seguinte comando no host que contém o secundário:
mongod --config <PATH_TO_CONFIG_FILE> Repita o desligamento e reinicie as etapas para o outro secundário.
Reinicie o primary com a --shardsvr
opção.
Aviso
Esta etapa exige algum tempo de inatividade para aplicativos conectados à primária do conjunto de réplicas.
Depois de reiniciar o primário, todos os aplicativos conectados ao primário retornarão um erro CannotVerifyAndSignLogicalTime
até que você execute as etapas em Adicionar o conjunto de réplicas iniciais como um fragmento.
Você também pode reiniciar seu aplicativo para impedir que ele receba CannotVerifyAndSignLogicalTime
erros.
Conecte-se ao primary.
Use
mongosh
para se conectar ao primário:mongosh "mongodb://<username>@<host>:<port>" Rebaixe o primário.
Execute o seguinte comando:
rs.stepDown() Verifique se a redução foi concluída.
Execute
rs.status()
para confirmar que o membro ao qual você está conectado foi rebaixado e agora é secundário:rs.status() Encerrar o primary antigo.
Execute os seguintes comandos:
use admin db.shutdownServer() Aguarde a conclusão do desligamento.
Edite o arquivo de configuração do primary.
No arquivo de configuração do primary, defina
sharding.clusterRole
parashardsvr
:security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs0 sharding: clusterRole: shardsvr net: port: 27017 bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para seu sistema.
Reinicie o primary como um servidor fragmentado.
Execute o seguinte comando no host que contém o primary:
mongod --config <PATH_TO_CONFIG_FILE>
Conecte-se ao primary.
Utilize
mongosh
para se conectar a um dos secundários.Se sua implantação usar a autenticação x.509, especifique estas
mongosh
opções:Se sua implantação usar a autenticação x.509, especifique estas
mongosh
opções:mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Rebaixe o primário.
Execute o seguinte comando:
rs.stepDown() Verifique se a redução foi concluída.
Execute
rs.status()
para confirmar que o membro ao qual você está conectado foi rebaixado e agora é secundário:rs.status() Encerrar o primary antigo.
Execute os seguintes comandos:
use admin db.shutdownServer() Aguarde a conclusão do desligamento.
Edite o arquivo de configuração do primary.
No arquivo de configuração do primary, defina
sharding.clusterRole
parashardsvr
:replication: replSetName: rs0 sharding: clusterRole: shardsvr security: clusterAuthMode: x509 net: port: 27017 tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para sua implantação, como
net.tls.certificateKeyFilePassword
se o arquivo de chave de certificado TLS estiver criptografado com uma senha.Reinicie o primary como um servidor fragmentado.
Execute o seguinte comando no host que contém o primary:
mongod --config <PATH_TO_CONFIG_FILE>
Adicione o conjunto de réplicas iniciais como um fragmento
Após converter o conjunto de réplica inicial (rs0
) em um fragmento, adicione-o ao cluster fragmentado.
Conecte ao
mongos
como o usuário administrativo do seu cluster.A instância do
mongos
está sendo executada no hostmongodb6.example.net
.Para conectar
mongosh
aomongos
, execute o seguinte comando:mongosh "mongodb://admin01@mongodb6.example.net:27017" Esse comando autentica você como o usuário
admin01
que você criou no cluster fragmentado. Depois de inserir o comando, digite a senha do usuário.Adicione o fragmento.
Para adicionar um fragmento ao cluster, execute o método
sh.addShard()
:sh.addShard( "rs0/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" ) Aviso
Após o novo fragmento estar ativo, o
mongosh
e outros clientes devem sempre conectar à instância domongos
. Não se conecte diretamente às instânciasmongod
. Se seus clientes se conectarem diretamente aos fragmentos, você poderá criar inconsistências de dados ou metadados.
Atualize a string de conexão do seu aplicativo
Depois de adicionar o primeiro fragmento ao cluster, atualize a connection string usada pelos aplicativos para a connection string do cluster fragmentado. Em seguida, reinicie seus aplicativos.
Implemente um segundo conjunto de réplicas
Implemente um novo conjunto de réplicas chamado rs1
. Os membros do conjunto de réplica rs1
estão nos seguintes hosts:
mongodb3.example.net
mongodb4.example.net
mongodb5.example.net
Inicie cada membro do conjunto de réplicas.
Para cada instância do
mongod
no conjunto de réplica, crie um arquivo de configuração com estas opções:OpçãoValorO caminho para o arquivo-chave usado para seu conjunto de réplicas inicial.
rs1
shardsvr
localhost
, seguido por quaisquer outros nomes de host nos quaismongod
deve escutar conexões de cliente.security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs1 sharding: clusterRole: shardsvr net: bindIp: localhost,<hostname(s)> Inclua opções adicionais conforme apropriado para seu sistema.
Para cada membro, inicie um
mongod
com as seguintes opções:OpçãoValorrs1
shardsvr
x509
requireTLS
O caminho absoluto para o arquivo
.pem
que contém o certificado e a chave TLS.O caminho absoluto para o arquivo
.pem
que contém a sequência de certificados raiz da autoridade de certificação.localhost
, seguido por quaisquer outros nomes de host nos quaismongod
deve escutar conexões de cliente.replication: replSetName: rs1 sharding: clusterRole: shardsvr security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<hostname(s)> Implemente o
mongod
com sua configuração especificada:mongod --config <PATH_TO_CONFIG_FILE> Observação
Quando você especifica a opção
--shardsvr
para uma instância domongod
, a instância é executada na porta27018
por padrão.Inicie cada membro do conjunto de réplicas.
Conecte a um membro do conjunto de réplicas.
Use
mongosh
para se conectar a um dos membros do conjunto de réplicas. Por exemplo:mongosh "mongodb://mongodb3.example.net:27018" mongosh "mongodb://mongodb3.example.net:27018" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Inicie o conjunto de réplicas.
No
mongosh
, execute o métodors.initiate()
para iniciar um conjunto de réplica que contém o membro atual:rs.initiate( { _id : "rs1", members: [ { _id: 0, host: "mongodb3.example.net:27018" }, { _id: 1, host: "mongodb4.example.net:27018" }, { _id: 2, host: "mongodb5.example.net:27018" } ] } ) O comando anterior exige que a exceção Localhost execute ações administrativas sem autenticação.
Importante
Execute
rs.initiate()
em apenas uma instânciamongod
para o conjunto de réplicas.Adicione um usuário administrativo para o conjunto de réplicas.
Depois de implantar o conjunto de réplicas, use a exceção localhost para criar o primeiro usuário do conjunto de réplicas.
Determine o conjunto de réplicas primário.
Para determinar a primária, execute
rs.status()
:rs.status() Na saída do comando, o campo
replSetGetStatus.members[n].stateStr
indica qual membro é o principal.Conecte-se ao conjunto de réplicas primário.
Conecte-se ao conjunto de réplicas primário com
mongosh
. Por exemplo, se o primário formongodb4.example.net
, execute este comando:mongosh "mongodb://mongodb4.example.net:27018" Crie um usuário administrativo.
Execute o seguinte método do
db.createUser()
para criar um usuário denominadors1Admin
com o papeluserAdmin
:use admin db.createUser( { user: "rs1Admin", pwd: passwordPrompt(), roles: [ { role: "userAdmin", db: "admin" } ] } ) Após executar o comando, o banco de dados solicita que você insira uma senha para o usuário do
rs1Admin
.
Adicione o conjunto de segunda réplica ao cluster como fragmento
Adicione o novo conjunto de réplicas, rs1
, ao cluster fragmentado.
Conecte
mongosh
aomongos
.Execute o seguinte comando a partir da linha de comando para se conectar à instância do
mongos
executando no hostmongodb6.example.net
:mongosh "mongodb://admin01@mongodb6.example.net:27017/admin" mongosh "mongodb://admin01@mongodb6.example.net:27017/admin" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Esse comando autentica você como o usuário
admin01
que você criou no cluster fragmentado. Depois de inserir o comando, digite a senha do usuário.Adicione o segundo fragmento.
Após conectar ao
mongos
, adicione o conjunto de réplicasrs1
como um fragmento ao cluster com o métodosh.addShard()
:sh.addShard( "rs1/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018" )
Fragmentar uma Coleção
A etapa final do procedimento é fragmentar uma coleção no cluster fragmentado.
Determine a chave de fragmento.
Determine a chave fragmentada para a coleção. A chave de fragmento indica como o MongoDB distribui os documentos entre fragmentos. Boas chaves de fragmentos:
Ter valores distribuídos uniformemente entre todos os documentos.
Agrupe documentos que são frequentemente acessados ao mesmo tempo em chunks contíguas.
Permitir a distribuição eficaz da atividade entre os fragmentos.
Para mais informações, consulte Escolher uma chave de fragmento.
Este procedimento utiliza o campo
number
como a chave de fragmento para a coleçãotest_collection
.Crie um índice na chave de fragmento.
Antes de fragmentar uma coleção não vazia, crie um índice na chave de fragmento:
use test db.test_collection.createIndex( { "number" : 1 } ) Fragmentar a coleção.
No banco de dados do
test
, grite otest_collection
. Especifiquenumber
como a chave de fragmento.sh.shardCollection( "test.test_collection", { "number" : 1 } ) Da próxima vez que o balanceador for executado, ele redistribuirá blocos de documentos entre fragmentos. À medida que os clientes inserem documentos adicionais nessa coleção, o
mongos
roteia os documentos para o fragmento apropriado.Quando o balanceador redistribui blocos, isso pode afetar negativamente o desempenho do seu aplicativo. Para minimizar o impacto no desempenho, você pode especificar quando o balanceador é executado para que ele não seja executado durante os horários de pico. Para saber mais, consulte Agendar a janela de equilíbrio.
Saiba mais
Para mais tutoriais e procedimentos de fragmentação, consulte estas páginas: