Ao usar o Data Transmission Service (DTS) para sincronizar ou migrar coleções do MongoDB com índices Time-to-Live (TTL), a exclusão automática baseada em TTL no destino pode causar atrasos na tarefa e inconsistência de dados. Para evitar isso, defina temporariamente os índices TTL do destino com o valor máximo de expiração durante a sincronização ou migração.
Contexto
Ao migrar uma instância do MongoDB que contém coleções com índices TTL (por exemplo, sessões de usuário, logs ou dados de cache), use o DTS para sincronização completa e incremental. O objetivo é garantir zero perda de dados com impacto mínimo no serviço.
No entanto, o mecanismo de exclusão automática por TTL pode entrar em conflito com a sincronização do DTS, resultando em latência da tarefa e inconsistência de dados:
Exclusões redundantes reduzem a eficiência: Quando o índice TTL da origem exclui dados expirados, ele grava um registro DELETE no Oplog. O DTS replica esse DELETE no destino. Se o índice TTL do destino já tiver excluído os mesmos dados, o MongoDB retornará uma contagem de linhas afetadas inesperada. Isso aciona o tratamento de exceções e desacelera a migração.
-
Inconsistência de dados devido à exclusão assíncrona do TTL: Os índices TTL não excluem dados em tempo real. Dados expirados podem ainda existir na origem enquanto o destino já os excluiu, causando inconsistência.
Exemplo:
O Oplog ou ChangeStream do MongoDB registra apenas os campos atualizados para uma operação UPDATE, não o documento completo. Se um UPDATE não encontrar os dados de destino, o DTS ignora a operação.
Momento
Instância de origem
Instância de destino
1
O serviço insere dados
2
O DTS sincroniza a operação INSERT
3
Os dados expiraram, mas o índice TTL ainda não os excluiu
4
O serviço atualiza os dados (por exemplo, atualiza o campo do índice TTL para alterar o tempo de expiração)
5
O índice TTL exclui os dados
6
O DTS sincroniza o UPDATE, mas não encontra os dados. A operação é ignorada.
Como resultado, esse documento fica ausente na instância do MongoDB de destino.
Solução
Defina temporariamente os índices TTL do destino com o valor máximo de expiração durante toda a sincronização ou migração (fases completa e incremental). Restaure as configurações originais de TTL após alternar o tráfego para a nova instância.
Procedimento:
-
Faça backup das configurações de índice TTL: No banco de dados de origem, execute um script para identificar todas as coleções com índices TTL e registre seus valores de expiração.
-
Desative a exclusão automática por TTL no destino:
Verifique se a instância de destino já contém as coleções alvo e os índices TTL.
Caso não contenha, use a migração de esquema para sincronizar as coleções primeiro. Em seguida, conecte-se ao banco de dados de destino e defina o tempo de expiração com o valor máximo para impedir a exclusão automática durante o processo.
Se já contiver, conecte-se ao banco de dados de destino antes de iniciar a tarefa do DTS e defina a expiração do TTL com o valor máximo para impedir a exclusão automática durante o processo.
-
Execute e monitore a tarefa do DTS: Inicie a tarefa de sincronização completa e incremental do DTS. Com a exclusão automática por TTL desativada no destino, o DTS consegue replicar todas as operações da origem sem conflitos.
Crie e inicie a tarefa de sincronização ou migração de dados no console do DTS.
-
Monitore as seguintes métricas durante o processo:
Latência da tarefa do DTS: Verifique na página de detalhes da tarefa se a latência da sincronização incremental permanece baixa.
Uso de armazenamento no destino: Como os dados no destino não expiram durante a migração, o uso de armazenamento cresce continuamente. Garanta espaço de armazenamento suficiente.
Restaure as configurações de TTL: Após a conclusão da sincronização do DTS e a alternância do tráfego para a nova instância, restaure os valores originais de expiração do TTL a partir do seu backup. Um thread em segundo plano do MongoDB limpará os documentos expirados acumulados durante a migração.
Durante a sincronização ou migração incremental, o DTS ainda replica as operações DELETE geradas pelo índice TTL da origem sobre dados expirados.
Com a expiração do TTL no destino aumentada, o destino armazena dados que já expiraram na origem caso ocorra latência durante a sincronização/migração. Provisione armazenamento suficiente no destino com base no volume de escrita da origem.
Para coleções com valores de TTL muito curtos (dados temporários ou logs), evite migrar dados históricos. Em casos extremos, os dados totalmente migrados podem expirar no destino quase imediatamente, deixando a coleção vazia. Considere uma estratégia de escrita dupla ou apenas migração incremental.
Observações: