O MongoShake é uma ferramenta open-source desenvolvida pela Alibaba Cloud para sincronizar dados entre bancos de dados MongoDB. Ela atende a casos de uso como análise de dados, recuperação de desastres e replicação ativa-ativa. Este tópico explica como configurar a sincronização em tempo real entre instâncias do ApsaraDB for MongoDB.
MongoShake
Desenvolvido em Go pela Alibaba Cloud, o MongoShake é uma ferramenta de service de uso geral. Ele replica dados do MongoDB lendo os logs de operações (oplogs) e os reexecutando na instância de destino.
A ferramenta também oferece recursos de assinatura e consumo de dados. Com integração a SDKs, Kafka e MetaQ, ela suporta cenários como assinatura de logs, sincronização entre data centers e evicção assíncrona de cache.
Para mais informações, consulte o repositório do MongoShake no GitHub.
Fontes de dados suportadas
|
Origem |
Destino |
|
Banco de dados MongoDB autogerenciado em uma instância ECS |
Banco de dados MongoDB autogerenciado em uma instância ECS |
|
Banco de dados MongoDB autogerenciado on-premises |
Banco de dados MongoDB autogerenciado on-premises |
|
Instância do ApsaraDB for MongoDB |
Instância do ApsaraDB for MongoDB |
|
Banco de dados MongoDB em cloud de terceiros |
Banco de dados MongoDB em cloud de terceiros |
Observações
Evite executar qualquer operação DDL no banco de dados de origem antes da conclusão da sincronização completa. Caso contrário, pode ocorrer inconsistência de dados.
Não há suporte para sincronização do banco de dados local. Para sincronizar dados do banco de dados admin, consulte Migrate business data from the admin database to a non-admin database.
Permissões necessárias
Origem | Permissões necessárias |
Instância MongoDB de origem | Permissão Nota O programa MongoShake cria automaticamente o banco de dados |
Instância MongoDB de destino | Permissão |
Para obter informações sobre como criar e autorizar usuários de banco de dados MongoDB, consulte Use DMS to manage MongoDB database users ou o comando db.createUser.
Pré-requisitos
Para garantir o melhor desempenho de sincronização, certifique-se de que a instância de conjunto de réplicas do MongoDB de origem utilize uma VPC. Se ela usar a rede clássica, altere o tipo de rede para VPC. Para mais informações, consulte Switch the network type of an instance from classic network to VPC.
Crie uma instância de conjunto de réplicas do MongoDB de destino. Para minimizar a latência de rede, crie a instância de destino na mesma VPC da instância de origem. Para mais informações, consulte Create a replica set instance.
Crie uma instância ECS para executar o MongoShake. Para reduzir a latência de rede, crie a instância ECS na mesma VPC da instância de origem. Para mais informações, consulte Create an ECS instance.
Adicione o endereço IP privado da instância ECS às listas de permissões das instâncias MongoDB de origem e de destino e verifique se a instância ECS consegue se conectar a ambas. Para mais informações, consulte Modify a whitelist.
Se a sua configuração de rede não atender aos requisitos anteriores, solicite um endpoint público para as instâncias MongoDB de origem e de destino. Em seguida, adicione o endereço IP público da instância ECS às listas de permissões de ambas as instâncias MongoDB para realizar a sincronização pelos endpoints públicos. Para mais informações, consulte Apply for a public endpoint e Modify a whitelist.
Procedimento
Este procedimento considera que o MongoShake esteja instalado no diretório /test/mongoshake.
-
Faça login na instância ECS.
NotaEscolha um método de login adequado ao seu cenário. Para mais informações, consulte Overview of logon methods for ECS servers.
-
Execute o comando abaixo para baixar o programa MongoShake e renomeá-lo para
mongoshake.tar.gz.wget "https://github.com/alibaba/MongoShake/releases/download/release-v2.8.7-20251218/mongo-shake-v2.8.7.tgz" -O mongoshake.tar.gzNotaO comando baixa a versão 2.8.7 do MongoShake. Para baixar a versão mais recente, consulte a página de releases.
-
Execute o comando a seguir para extrair o pacote do MongoShake no diretório /test/mongoshake.
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshake -
Execute o comando
vi collector.confpara modificar o arquivo de configuração do MongoShake collector.conf. A tabela a seguir descreve os principais parâmetros.Parâmetro
Descrição
Exemplo
mongo_urls
URI da string de conexão da instância MongoDB de origem. No exemplo, a conta do banco de dados é test, localizada no banco de dados admin.
NotaRecomendamos o uso de um endpoint de VPC para minimizar a latência de rede.
Para detalhes sobre o formato da URI da string de conexão, consulte Connection description for a replica set instance.
mongo_urls = mongodb://test:**@dds-bp19f409d7512.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512**.mongodb.rds.aliyuncs.com:3717NotaA senha não pode conter o caractere arroba (
@). Caso contrário, a conexão falhará.tunnel.address
URI da string de conexão da instância MongoDB de destino. No exemplo, a conta do banco de dados é test, localizada no banco de dados admin.
NotaRecomendamos o uso de um endpoint de VPC para minimizar a latência de rede.
Para detalhes sobre o formato da URI da string de conexão, consulte Connection description for a replica set instance.
tunnel.address = mongodb://test:**@dds-bp19f409d7512.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512**.mongodb.rds.aliyuncs.com:3717NotaA senha não pode conter o caractere arroba (
@). Caso contrário, a conexão falhará.sync_mode
Modo de sincronização de dados. Valores válidos:
all: executa uma sincronização completa e uma incremental.
full: executa apenas a sincronização completa.
incr: executa apenas a sincronização incremental.
NotaO valor padrão é
incr.sync_mode = allNotaPara obter a lista completa de parâmetros em collector.conf, consulte a seção "parâmetros do collector.conf" em Appendix.
-
Execute o comando a seguir para iniciar a tarefa de sincronização e imprimir os logs.
./collector.linux -conf=collector.conf -verbose -
Observe a saída do log. Quando aparecer uma entrada semelhante à seguinte, isso indica que a sincronização completa foi concluída e a sincronização incremental começou.
[09:38:57 CST 2019/06/20] [INFO] (mongoshake/collector.(*ReplicationCoordinator).Run:80) finish full sync, start incr sync with timestamp: fullBeginTs[1560994443], fullFinishTs[1560994737]
Monitoramento de status
Após o início da sincronização incremental, abra uma nova janela de terminal e execute os seguintes comandos:
cd /test/mongoshake && ./mongoshake-stat --port=9100
O mongoshake-stat é um script Python e requer a instalação do Python 2.7. Para mais informações, consulte o site oficial do Python.
Saída de exemplo:
./mongoshake-stat --port=9100
logs_get/sec | logs_repl/sec | logs_success/sec | lsn.time | lsn_ack.time | lsn_ckpt.time | now.time | replset
none | none | none | 2019-06-20 10:34:14 | 2019-06-20 10:34:13 | 2019-06-20 10:33:36 | 2019-06-20 10:34:14 | mgset-10
545 | 768 | 768 | 2019-06-20 10:34:15 | 2019-06-20 10:34:15 | 2019-06-20 10:34:14 | 2019-06-20 10:34:15 | mgset-10
541 | 511 | 511 | 2019-06-20 10:34:15 | 2019-06-20 10:34:15 | 2019-06-20 10:34:14 | 2019-06-20 10:34:16 | mgset-10
639 | 512 | 512 | 2019-06-20 10:34:16 | 2019-06-20 10:34:16 | 2019-06-20 10:34:14 | 2019-06-20 10:34:17 | mgset-10
543 | 512 | 512 | 2019-06-20 10:34:17 | 2019-06-20 10:34:17 | 2019-06-20 10:34:14 | 2019-06-20 10:34:18 | mgset-10
546 | 768 | 768 | 2019-06-20 10:34:19 | 2019-06-20 10:34:19 | 2019-06-20 10:34:14 | 2019-06-20 10:34:19 | mgset-10
538 | 512 | 512 | 2019-06-20 10:34:20 | 2019-06-20 10:34:20 | 2019-06-20 10:34:19 | 2019-06-20 10:34:20 | mgset-10
550 | 511 | 511 | 2019-06-20 10:34:21 | 2019-06-20 10:34:21 | 2019-06-20 10:34:19 | 2019-06-20 10:34:21 | mgset-10
546 | 512 | 512 | 2019-06-20 10:34:22 | 2019-06-20 10:34:22 | 2019-06-20 10:34:19 | 2019-06-20 10:34:22 | mgset-10
531 | 512 | 512 | 2019-06-20 10:34:23 | 2019-06-20 10:34:23 | 2019-06-20 10:34:19 | 2019-06-20 10:34:23 | mgset-10
547 | 512 | 512 | 2019-06-20 10:34:24 | 2019-06-20 10:34:24 | 2019-06-20 10:34:19 | 2019-06-20 10:34:24 | mgset-10
541 | 512 | 512 | 2019-06-20 10:34:24 | 2019-06-20 10:34:24 | 2019-06-20 10:34:19 | 2019-06-20 10:34:25 | mgset-10
Descrição dos parâmetros:
|
Parâmetro |
Descrição |
|
logs_get/sec |
Quantidade de oplogs buscados por segundo. |
|
logs_repl/sec |
Número de operações de reexecução de oplog realizadas por segundo. |
|
logs_success/sec |
Total de operações de reexecução de oplog bem-sucedidas por segundo. |
|
lsn.time |
Timestamp do último oplog enviado. |
|
lsn_ack.time |
Momento em que a instância de destino confirmou a operação de escrita. |
|
lsn_ckpt.time |
Timestamp em que o checkpoint foi persistido. |
|
now.time |
Hora atual. |
|
replset |
Nome do conjunto de réplicas do banco de dados de origem. |
Migrar dados do banco de dados admin
O MongoDB não recomenda oficialmente armazenar dados de negócios no banco de dados admin, pois comportamentos de bloqueio e conflitos com comandos internos podem degradar o desempenho da instância.
O MongoShake permite sincronizar dados de negócios do banco de dados admin para um banco de dados não-admin.
Para fazer isso, siga o Procedure. Na Etapa 4, ao modificar o arquivo collector.conf, adicione os seguintes itens de configuração:
filter.pass.special.db = admin
# Migrate all business collections from the admin database to newDB.
transform.namespace = admin:newDB
# Or, migrate the abc collection in the admin database to the def collection in the target database. You can configure multiple rules.
transform.namespace = admin.abc:target.def
Apêndice
Tabela 1. Parâmetros do collector.conf
Categoria | Parâmetro | Descrição | Exemplo |
N/A | conf.version | Versão do arquivo de configuração. Não modifique este valor. |
|
Opções globais | id | ID da tarefa de sincronização. Você pode personalizar este valor. Ele é usado para o nome do arquivo de log, o nome do banco de dados para armazenar informações de checkpoint e o nome do banco de dados na instância de destino. |
|
master_quorum | Opção de alta disponibilidade. Quando nós primário e standby do MongoShake sincronizam dados da mesma origem, defina este parâmetro como Valores válidos:
Nota O valor padrão é false. |
| |
full_sync.http_port | Porta HTTP para visualizar o status da sincronização completa. Nota O valor padrão é 9101. |
| |
incr_sync.http_port | Porta HTTP para visualizar o status da sincronização incremental. Nota O valor padrão é 9100. |
| |
system_profile_port | Porta de profiling usada para visualizar informações internas de pilha. |
| |
log.level | Nível de log. Valores válidos:
Valor padrão: info. |
| |
log.dir | Diretório para arquivos de log e arquivos PID. Se este parâmetro não for definido, o diretório logs no caminho atual será usado por padrão. Nota É necessário especificar um caminho absoluto para este parâmetro. |
| |
log.file | Nome do arquivo de log. Você pode personalizar este valor. Nota O valor padrão é collector.log. |
| |
log.flush | Frequência de atualização do log na tela. Valores válidos:
Nota O valor padrão é false. |
| |
sync_mode | Modo de sincronização de dados. Valores válidos:
Nota O valor padrão é incr. |
| |
mongo_urls | URI da string de conexão da instância MongoDB de origem. No exemplo, a conta do banco de dados é test, localizada no banco de dados admin. Nota
|
| |
mongo_cs_url | Se a origem for uma instância de cluster sharded, você deve especificar a URI da string de conexão do nó ConfigServer (CS). Para obter informações sobre como obter a URI da string de conexão de um nó ConfigServer, consulte Apply for an endpoint for a shard. No exemplo, a conta do banco de dados é test, localizada no banco de dados admin. |
| |
mongo_s_url | Se a origem for uma instância de cluster sharded, especifique a URI da string de conexão de pelo menos um nó mongos. Separe vários endereços mongos com vírgulas (,). Para obter informações sobre como obter a URI da string de conexão de um nó mongos, consulte Apply for an endpoint for a shard. No exemplo, a conta do banco de dados é test, localizada no banco de dados admin. |
| |
tunnel | Tipo de canal de sincronização. Valores válidos:
Nota O valor padrão é direct. |
| |
tunnel.address | Endereço do destino. O formato de endereço suportado varia conforme o tipo de tunnel:
No exemplo, a conta do banco de dados é test, localizada no banco de dados admin. |
| |
tunnel.message | Tipo de dados no canal. Este parâmetro é válido apenas quando
Nota O valor padrão é raw. |
| |
mongo_connect_mode | Modo de conexão da instância MongoDB. Este parâmetro é válido apenas quando
Nota O valor padrão é secondaryPreferred. |
| |
filter.namespace.black | Define uma lista de bloqueios para sincronização de dados. Os namespaces especificados não são sincronizados com o banco de dados de destino. Separe vários namespaces com ponto e vírgula (;). Nota Um namespace é o nome canônico de uma coleção ou índice no MongoDB. É uma combinação do nome do banco de dados e do nome da coleção ou índice, como |
| |
filter.namespace.white | Define uma lista de permissões para sincronização de dados. Apenas os namespaces especificados são sincronizados com o banco de dados de destino. Separe vários namespaces com ponto e vírgula (;). |
| |
filter.pass.special.db | Ativa a sincronização de bancos de dados especiais. Por padrão, bancos de dados como |
| |
filter.ddl_enable | Especifica se deve ativar a sincronização DDL. Valores válidos:
Nota Este recurso não é suportado quando a origem é uma instância de cluster sharded. |
| |
checkpoint.storage.url | Endereço de armazenamento para checkpoints, usado para suportar sincronização retomável. Se este parâmetro não for configurado, o programa grava checkpoints em um dos seguintes bancos de dados, dependendo do tipo de instância:
No exemplo, a conta do banco de dados é test, localizada no banco de dados admin. |
| |
checkpoint.storage.db | Nome do banco de dados para armazenar checkpoints. Nota O valor padrão é mongoshake. |
| |
checkpoint.storage.collection | Nome da coleção para armazenar checkpoints. Quando nós primário e standby do MongoShake sincronizam dados da mesma origem, você pode alterar este nome de coleção para evitar conflitos. Nota O valor padrão é ckpt_default. |
| |
checkpoint.start_position | Posição inicial para a sincronização. Este parâmetro é usado apenas se nenhum checkpoint for encontrado. O formato é Nota O valor padrão é 1970-01-01T00:00:00Z. |
| |
transform.namespace | Renomeia um banco de dados ou coleção de origem e o sincroniza com o destino. Por exemplo, você pode renomear |
| |
Opções de sincronização completa | full_sync.reader.collection_parallel | Número máximo de coleções que o MongoShake pode puxar simultaneamente por vez. |
|
full_sync.reader.write_document_parallel | Número de threads de escrita concorrentes por coleção para o MongoShake. |
| |
full_sync.reader.document_batch_size | Tamanho do lote para gravar documentos na instância de destino. Por exemplo, um valor de 128 indica que 128 documentos são agrupados antes da gravação. |
| |
full_sync.collection_exist_drop | Especifica o que fazer se uma coleção de destino tiver o mesmo nome de uma coleção de origem. Valores válidos:
|
| |
full_sync.create_index | Especifica se deve criar um índice após a conclusão da sincronização. Valores válidos:
|
| |
full_sync.executor.insert_on_dup_update | Especifica se deve converter uma instrução
|
| |
full_sync.executor.filter.orphan_document | Especifica se deve filtrar documentos órfãos caso a origem seja uma instância de cluster sharded. Valores válidos:
|
| |
full_sync.executor.majority_enable | Especifica se deve ativar a escrita por maioria na instância de destino. Valores válidos:
|
| |
Opções de sincronização incremental | incr_sync.mongo_fetch_method | Método para buscar dados incrementais. Valores válidos:
Valor padrão: oplog. |
|
incr_sync.oplog.gids | Usado para configurar replicação bidirecional para clusters em cloud. |
| |
incr_sync.shard_key | Método interno de concorrência do MongoShake. Não modifique este parâmetro. |
| |
incr_sync.worker | Número de threads concorrentes para transmitir oplogs. Você pode aumentar este valor se o desempenho do host for suficiente. Nota Se a origem for uma instância de cluster sharded, o número de threads deve ser igual ao número de shards. |
| |
incr_sync.worker.oplog_compressor | Ativa a compressão de dados para reduzir o consumo de largura de banda da rede. Valores válidos:
Nota Este parâmetro é válido apenas quando o parâmetro |
| |
incr_sync.target_delay | Atraso, em segundos, antes que as alterações da origem sejam aplicadas ao destino. Você pode definir este parâmetro para evitar operações acidentais. Por exemplo, Nota Um valor de 0 indica sincronização em tempo real. |
| |
incr_sync.worker.batch_queue_size | Parâmetros de configuração da fila interna do MongoShake. Não modifique estes parâmetros a menos que seja necessário. |
| |
incr_sync.adaptive.batching_max_size |
| ||
incr_sync.fetcher.buffer_capacity |
| ||
Opções de sincronização do MongoDB (apenas para modo | incr_sync.executor.upsert | Especifica se deve converter uma instrução
|
|
incr_sync.executor.insert_on_dup_update | Especifica se deve converter uma instrução
|
| |
incr_sync.conflict_write_to | Especifica se deve registrar documentos conflitantes caso ocorra um conflito de escrita durante a sincronização. Valores válidos:
|
| |
incr_sync.executor.majority_enable | Especifica se deve ativar a escrita por maioria na instância de destino. Valores válidos:
Nota Ativar este recurso pode afetar o desempenho. |
|
FAQ
Consulte o FAQ do MongoShake. Se encontrar outros problemas ao usar o MongoShake, abra uma issue em GitHub Issues.