Existem duas maneiras de sincronizar clusters fragmentados. Você pode usar uma instância mongosync ou várias instâncias mongosync . Para obter o melhor desempenho com clusters grandes ou muito carregados, use uma instância mongosync para cada shard no cluster de origem.
Importante
Você deve sempre desabilitar o balanceador em um cluster de destino fragmentado usando balancerStop. Após parar o balanceador, aguarde 15 minutos antes de iniciar mongosync. Isso dá ao cluster tempo para concluir quaisquer migrações de chunk em andamento.
Se o cluster de origem ou destino for um cluster fragmentado e você não estiver executando mongosync com filtragem de namespace, será necessário desativar o balanceador do cluster de origem executando o comando balancerStop e aguardando 15 minutos para que o comando seja concluído.
Se o cluster de origem ou destino for um cluster fragmentado e você estiver executando mongosync com filtragem de namespace , poderá habilitar globalmente o balanceador do cluster de origem, mas deverá desativá-lo para todas as collections dentro do filtro de namespace . Consulte Desativar o Balanceador para Coleções na Sincronização Filtrada. Você também pode desabilitar totalmente o balanceador do cluster de origem.
Durante a migração, não execute os comandos moveChunk ou moveRange. Se você habilitou o balanceador do cluster de origem, mas o desabilitou para coleções dentro do filtro de namespace, não execute shardCollection em coleções dentro do filtro de namespace. Se você executar shardCollection em collections dentro do filtro de namespace durante a migração, mongosync retornará um erro e será interrompido, o que exigirá que você inicie a migração do zero.
Configurar uma única mongosync instância
Para configurar um único mongosync, siga as instruções de conexão para que sua arquitetura de cluster se conecte à instância mongos em seu cluster.
Quando você conectar um único mongosync a um cluster fragmentado, não use a opção replicaSet nem a opção id.
O restante desta página aborda a sincronização de cluster para cluster usando várias instâncias mongosync .
Configurar múltiplas mongosync instâncias
O número de instâncias mongosync deve corresponder ao número de shards no cluster de origem. Você deve usar a mesma versão do mongosync entre todas as instâncias. Para uma origem de conjunto de réplicas, você só pode utilizar uma instância mongosync .
Ao configurar várias instâncias mongosync para sincronizar entre clusters fragmentados, você deve enviar comandos de ponto de conexão da API idênticos para cada instância mongosync .
Para configurar múltiplas instâncias do mongosync :
Determinar os IDs do fragmento
Para obter os IDs de fragmento, conecte-se ao cluster de origem mongos e execute o comando listShards.
db.adminCommand( { listShards: 1 } )
As informações estão na array shards .
shards: [ { _id: 'shard01', host: 'shard01/localhost:27501,localhost:27502,localhost:27503', state: 1, topologyTime: Timestamp({ t: 1656612236, i: 2 }) }, { _id: 'shard02', host: 'shard02/localhost:27504,localhost:27505,localhost:27506', state: 1, topologyTime: Timestamp({ t: 1656612240, i: 4 }) } ]
Conecte as mongosync instâncias de
Estas instruções usam uma string de conexão genérica. Para modificar a string de conexão da arquitetura de clusters, consulte os detalhes de conexão específicos da arquitetura.
Dica
Um único servidor host pode executar múltiplas instâncias do mongosync . Para melhorar o desempenho, execute mongosync em vários servidores host.
Execute a primeira instância mongosync :
mongosync \ --cluster0 "mongodb://user:password@cluster0host:27500" \ --cluster1 "mongodb://user:password@cluster1host:27500" \ --id shard01 --port 27601
Ao executar múltiplas instâncias do mongosync , o número de instâncias deve ser igual ao número de fragmentos. Cada instância mongosync deve ser iniciada com a opção --id ou a configuração id para especificar o fragmento que ela replica.
Execute uma nova instância do mongosync para cada shard no cluster de origem. Edite os campos --id e --port para cada instância mongosync adicional.
mongosync \ --cluster0 "mongodb://user:password@cluster0host:27500" \ --cluster1 "mongodb://user:password@cluster1host:27500" \ --id shard02 --port 27602
A string de conexão para as opções --cluster0 e --cluster1 deve ponto para instâncias mongos . No exemplo, eles usam a mesma instância mongos .
Cada instância mongosync :
Conecta-se a instâncias
mongosno cluster de origem.Conecta-se a instâncias
mongosno cluster de destino.Replica um único shard do cluster de origem, identificado pela opção
--id.Especifica uma porta exclusiva para usar durante a sincronização. Considere a possibilidade de designar uma faixa de portas para simplificar as operações de script do Mongosync.
Iniciar mongosync múltiplas instâncias
Use curl ou outro cliente HTTP para emitir o comando de inicialização para cada uma das instâncias mongosync .
curl mongosync01Host:27601/api/v1/start -XPOST --data \ '{ "source": "cluster0", "destination": "cluster1", \ "reversible": false, "enableUserWriteBlocking": "none" }' curl mongosync02Host:27602/api/v1/start -XPOST --data \ '{ "source": "cluster0", "destination": "cluster1", \ "reversible": false, "enableUserWriteBlocking": "none" }'
As opções de comando start devem ser as mesmas para todas as instâncias mongosync .
Verificar progresso
Para revisar o progresso da sincronização de um fragmento específico, use curl ou outro cliente HTTP para emitir o comando de progresso para a instância mongosync que sincroniza esse fragmento.
curl mongosync02Host:27602/api/v1/progress -XGET
Este comando verifica o progresso da instância do mongosync que está sendo executada no mongosync02Host e usando o port 27602 para sincronização. Para verificar o progresso em outros fragmentos, atualize o host e o número da porta e, em seguida, repita a chamada de API para cada instância mongosync .
Pausar uma mongosync instância do
O comando de pausa interromperá temporariamente o processo de sincronização em um único fragmento. Ele não pausa nenhuma outra instância mongosync que possa estar em execução. Use curl ou outro cliente HTTP para emitir o comando pause para uma instância mongosync .
curl mongosync01Host:27601/api/v1/pause -XPOST --data '{}'
Este comando pausa a instância do mongosync que está executando no mongosync01Host e utilizando o port 27601 para sincronização. Para pausar a sincronização em outros fragmentos, atualize o host e o número da porta e, em seguida, repita a chamada de API para cada instância do mongosync .
Retomar sincronização
Se uma ou mais instâncias mongosync estiverem pausadas, você poderá usar o comando retomar para retomar a sincronização. Execute um comando resume separado em cada instância mongosync pausada para continuar sincronizando.
Use curl ou outro cliente HTTP para emitir o comando resume para cada instância mongosync .
curl mongosync01Host:27601/api/v1/resume -XPOST --data '{}'
Este comando retoma a sincronização na instância do mongosync que está sendo executada no mongosync01Host e usando o port 27601. Para retomar a sincronização em outros fragmentos, atualize o host e o número da porta e, em seguida, repita a chamada de API para cada instância mongosync .
Commit sincronização a partir de múltiplas mongosync instâncias
Quando você deseja concluir a sincronização, emita o comando progresso e verifique os valores para canCommit e lagTimeSeconds.
Para minimizar o bloqueio de gravação no cluster de origem, você só deve executar o comando commit quando o valor lagTimeSeconds for pequeno o suficiente para seu aplicativo.
Se o valor lagTimeSeconds for pequeno o suficiente e canCommit for true, emita o comando commit para confirmar a sincronização. Repita o processo em todas as instâncias do mongosync .
A operação commit está bloqueando. O comando commit não retornará até que commit tenha sido chamado em cada instância mongosync .
// Check progress curl mongosync01Host:27601/api/v1/progress -XGET // Commit curl mongosync01Host:27601/api/v1/commit -XPOST --data '{}'
Esses comandos verificam somente o progresso e confirmam a sincronização para a instância do mongosync que está sendo executada no mongosync01Host e utilizando o port 27601. Para sincronizar todos os fragmentos, faça chamadas adicionais para progress e commit em quaisquer outras instâncias mongosync que possam estar em execução.
Verificação de dados
Antes de transferir a carga do seu aplicativo do cluster de origem para o destino, verifique seus dados para garantir que a sincronização foi bem-sucedida.
Observação
Se mongosync parar durante o commit, antes que o endpoint /progress canWrite: true informe, você deverá reiniciar toda a migração para garantir que ela seja verificada.
Para obter mais informações, consulte Verificar a fonte de dados.
Inverter a direção de sincronização
Observação
Para obter um tutorial detalhado sobre como reverter a direção de sincronização, consulte Inverter direção de sincronização.
Para reverter a sincronização para que o cluster de destino original atue como cluster de origem:
Se ainda não tiver feito isso, emita o comando commit para cada instância do
mongosynce aguarde até que todos os commits terminem. Para verificar se o processo de sincronização foi confirmado, emita o comando progresso para todas as instânciasmongosynce veja se o campostatede cada resposta contém o valorCOMMITTED.Emitir o comando reverso para cada instância do
mongosync.
A operação reverse está bloqueando. O comando reverse não retornará até que reverse tenha sido chamado em cada instância mongosync .
curl mongosync01Host:27601/api/v1/reverse -XPOST --data '{}'
Este comando reverte a sincronização na instância do mongosync que está sendo executada no mongosync01Host e utilizando o port
27601. Faça chamadas adicionais para reverse em quaisquer outras instâncias mongosync que possam estar em execução.
Observação
A sincronização reversa só é possível se reversible e enableUserWriteBlocking estiverem definidos como "sourceAndDestination" quando a API inicial iniciar mongosync.