Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Converter um conjunto de réplicas em um cluster fragmentado

Nesta página

  • Sobre esta tarefa
  • Arquitetura de servidor
  • Antes de começar
  • Passos
  • 1. Implemente o Config Server Replica Set
  • 2. Implemente o mongos
  • 3. Criar um Usuário Administrativo para o Cluster Fragmentado
  • 4. Migre o banco de dados admin do conjunto de réplicas iniciais
  • 5. Reinicie o conjunto de réplicas iniciais como fragmento
  • 6. Adicione o conjunto de réplicas iniciais como um fragmento
  • 7. Atualize a string de conexão do seu aplicativo
  • 8. Implemente um segundo conjunto de réplicas
  • 9. Adicione o conjunto de segunda réplica ao cluster como fragmento
  • 10. Mostrar uma Coleção
  • Saiba mais

Os clusters fragmentados particionam dados em vários servidores com base em uma chave de fragmento. Um cluster fragmentado é melhor dimensionado do que um conjunto de réplicas para sistemas 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 interface do usuário para sistemas hospedados no MongoDB Atlas.

Este tutorial utiliza os seguintes servidores:

nome de anfitrião
Porta
Descrição
mongodb0.example.net
27017
Membro do fragmento de suporte de dados inicial, rs0.
mongodb1.example.net
27017
Membro do fragmento de suporte de dados inicial, rs0.
mongodb2.example.net
27017
Membro do fragmento de suporte de dados inicial, rs0.
mongodb3.example.net
27018
Membro do segundo shard que contém dados, rs1.
mongodb4.example.net
27018
Membro do segundo shard que contém dados, rs1.
mongodb5.example.net
27018
Membro do segundo shard que contém dados, rs1.
mongodb6.example.net
27017
O mongos, utilizado para conectar ao agrupamento fragmentado.
mongodb7.example.net
27019
Membro do conjunto de réplica do servidor de configuração.
mongodb8.example.net
27019
Membro do conjunto de réplica do servidor de configuração.
mongodb9.example.net
27019
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 clusters em um horizonte de rede dividido. A partir do MongoDB 5.0, os nós que são configurados apenas com um endereço IP falham na validação de inicialização e não iniciam.

Para converter um conjunto de réplicas em um cluster fragmentado:

  1. Implemente o conjunto de réplica do servidor de configuração.

  2. Implemente um mongos.

  3. Criar um usuário administrativo para o cluster fragmentado.

  4. Migre o banco de dados do admin do conjunto de réplica inicial para o cluster fragmentado.

  5. Reinicie os membros da réplica inicial definida como servidores de fragmento.

  6. Adicione o conjunto de réplicas inicial como fragmento.

  7. Atualize a connection string do seu aplicativo.

  8. Crie um segundo fragmento e adicione-o ao cluster.

  9. Fragmentar uma coleção.

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

1

Selecione a guia do mecanismo de autenticaçã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ão 27019.

2
3

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 e apenas uma instânciamongod para o conjunto de réplicas.

O mongos fornece a interface entre os aplicativos do cliente e o cluster fragmentado.

1
2

Implemente o mongos com sua configuração especificada:

mongos --config <PATH_TO_CONFIG_FILE>

Após implantar o mongos, utilize a exceção do localhost para criar o primeiro usuário no cluster.

1

Use mongosh para se conectar ao mongos.

2

Dica

Especifique um nome de usuário diferente para seu usuário administrativo do cluster fragmentado do que os nomes de usuário em seu conjunto de réplica inicial.

Usar nomes diferentes evita conflitos ao restaurar os usuários da réplica inicial definida para o cluster fragmentado.

O método db.createUser() a seguir cria um usuário chamado admin01 com as funções clusterManager e restore:

use admin
db.createUser(
{
user: "admin01",
pwd: passwordPrompt(),
roles: [
{ role: "clusterManager", db: "admin" },
{ role: "restore", db: "admin" }
]
}
)

Após executar o comando, o banco de dados solicita que você insira uma senha para o usuário do admin01.

O banco de dados admin contém informações do usuário e do sistema. Para migrar o banco de dados admin de seu conjunto de réplicas inicial para o cluster fragmentado, execute as seguintes etapas.

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

A porta padrão para instâncias do mongod com o papel do shardsvr é 27018. Para utilizar uma porta diferente, especifique a configuração do net.port.

1

Use mongosh para se conectar a um dos membros do seu conjunto de réplicas inicial.

2

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.

3

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 6. Adicionar o conjunto de réplicas inicial como um fragmento.

Você também pode reiniciar seu aplicativo para impedir que ele receba CannotVerifyAndSignLogicalTime erros.

4

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 6. Adicionar o conjunto de réplicas inicial como um fragmento.

Você também pode reiniciar seu aplicativo para impedir que ele receba CannotVerifyAndSignLogicalTime erros.

Após converter o conjunto de réplica inicial (rs0) em um fragmento, adicione-o ao cluster fragmentado.

1

A instância do mongos está sendo executada no host mongodb6.example.net.

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.

2

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 do mongos. Não se conecte diretamente às instâncias mongod . Se seus clientes se conectarem diretamente aos fragmentos, você poderá criar inconsistências de dados ou metadados.

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 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

1

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 do mongod, a instância é executada na porta 27018 por padrão.

2
3

Use mongosh para se conectar a um dos membros do conjunto de réplicas. Por exemplo:

4

No mongosh, execute o método rs.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 e apenas uma instânciamongod para o conjunto de réplicas.

5

Depois de implantar o conjunto de réplicas, use a exceção localhost para criar o primeiro usuário do conjunto de réplicas.

1

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.

2

Conecte-se ao conjunto de réplicas primário com mongosh. Por exemplo, se a primária for mongodb4.example.net, execute este comando:

3

Execute o seguinte método do db.createUser() para criar um usuário denominado rs1Admin com o papel userAdmin:

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 novo conjunto de réplicas, rs1, ao cluster fragmentado.

1

Execute o seguinte comando a partir da linha de comando para se conectar à instância do mongos executando no host mongodb6.example.net:

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.

2

Após conectar ao mongos, adicione o conjunto de réplicas rs1 como um fragmento ao cluster com o método sh.addShard() :

sh.addShard( "rs1/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018" )

A etapa final do procedimento é fragmentar uma coleção no cluster fragmentado.

1

Determine a chave fragmentada para a coleção. A tecla Shard 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ção test_collection.

2

Antes de fragmentar uma coleção não vazia, crie um índice na chave de fragmento:

use test
db.test_collection.createIndex( { "number" : 1 } )
3

No banco de dados do test, grite o test_collection. Especifique number 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.

Dica

Agendamento da janela de balanceamento

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.

Para mais tutoriais e procedimentos de fragmentação, consulte estas páginas:

← Converter cluster fragmentado em conjunto de réplicas