Sincronização filtrada
Nesta página
Novidade na versão 1.1.
Cluster-to-Cluster Sync oferece sincronização contínua de dados ou uma migração de dados única entre dois clusters MongoDB . Você pode usar a sincronização filtrada para especificar quais bancos de dados e coleções o utilitáriomongosync do transfere entre os clusters de origem e de destino.
A partir da versão 1.1, o mongosync
suporta filtros de inclusão para especificar quais reconhecimento de data center e collection devem ser incluídos na sincronização. A partir da versão 1.6, mongosync
também suporta filtros de exclusão e expressões regulares.
Com filtros de inclusão,
mongosync
sincroniza bancos de dados e coleções correspondentes.Com filtros de exclusão, o
mongosync
sincroniza todos os bancos de dados e coleções, exceto aqueles que correspondem aos filtros.Com os filtros de inclusão e exclusão, o
mongosync
sincroniza apenas bancos de dados e coleções que correspondem aos filtros de inclusão e exclui aqueles que também correspondem aos filtros de exclusão.Sem filtros, o
mongosync
sincroniza todos os banco de dados e todas as coleções.
Sintaxe de filtro
O endpoint da API start
aceita dois campos que configuram a sincronização filtrada: includeNamespaces
e excludeNamespaces
. Cada campo usa um array de filtros que especifica os bancos de dados e coleções a serem incluídos ou excluídos da sincronização.
Observação
Se a chamada start
usar os parâmetros includeNamespaces
e excludeNamespaces
, mongosync
primeiro fará correspondência com os bancos de dados e as coleções dos filtros de inclusão e, em seguida, excluirá aqueles que também corresponderem a um filtro de exclusão.
Os filtros têm a seguinte sintaxe:
"includeNamespaces": [ { "database": "<database-name>", "collections": [ "<collection-name>" ] "databaseRegex": { "pattern": "<regex-pattern>", "options": "<options>" }, "collectionsRegex": { "pattern": "<regex-pattern>", "options": "<options>" } } ], "excludeNamespaces": [ { "database": "<database-name>", "collections": [ "<collection-name>" ] "databaseRegex": { "pattern": "<regex-pattern>", "options": "<options>" }, "collectionsRegex": { "pattern": "<regex-pattern>", "options": "<options>" } } ]
Os filtros devem incluir o campo database
ou o campo databaseRegex
.
Se precisar que o filtro corresponda a coleção específicas, você pode usar a array collections
para especificar coleção individualmente ou definir uma expressão regular usando o campo collectionsRegex
.
Configurar um filtro
Importante
Depois de iniciar o mongosync
com um filtro em vigor, o filtro não poderá ser modificado. Se você precisar criar um novo filtro, consulte: Substituir um filtro existente.
Identifique bancos de dados e coleções.
Identifique os banco de dados e as coleções que você deseja sincronizar com o cluster de destino.
Ao adicionar um conjunto de bancos de dados ao filtro, você também exclui quaisquer outros bancos de dados no cluster.
Ao especificar uma coleção em seu filtro, você também exclui quaisquer outras coleções que estejam no mesmo banco de dados.
Criar um filtro.
A API start
aceita dois parâmetros que configuram filtros opcionais:
O parâmetro
includeNamespaces
aplica uma array de filtros, que são usados para determinar bancos de dados e coleçõesmongosync
devem ser incluídos na sincronização.O parâmetro
excludeNamespaces
aplica uma array de filtros, que são usados para determinar quais bancos de dados e coleçõesmongosync
devem ser excluídos da sincronização.
Se você não especificar um filtro, o mongosync
executará uma sincronização completa do cluster.
Crie filtros de inclusão e/ou exclusão para identificar os bancos de dados e coleções que você deseja sincronizar.
Por exemplo, esse filtro de inclusão configuraria mongosync
para sincronizar somente coleções cujos nomes comecem com accounts_
do banco de dados sales
, exceto pela coleção accounts_old
:
"includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+?$", "options": "ms" } ], "excludeNamespaces": [ { "database": "sales", "collections": [ "accounts_old" ] } ]
Para obter mais informações sobre filtros, consulte a página Sintaxe de filtro.
Use o Filtro.
Para usar o filtro, anexe o filtro json ao fazer a chamada de API /start para começar a sincronização.
curl -X POST "http://localhost:27182/api/v1/start" --data ' { "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+$", "options": "i" } }, { "database": "marketing" } ] } '
Para obter um exemplo de configuração, consulte a página Como executar o mongosync
com um filtro.
Substituir um filtro existente
Você não pode atualizar um filtro existente. Você deve interromper o processo de sincronização em andamento, preparar o cluster de destino e reiniciar mongosync
com um novo filtro.
Quando mongosync
executou o filtro original, ele criou bancos de dados com seus dados ("bancos de dados do usuário") e o banco de dados do sistema mongosync_reserved_for_internal_use
no cluster de destino. Você deve remover esses bancos de dados antes de reiniciar o mongosync
com seu novo filtro.
Siga estas etapas para preparar o cluster de destino para um novo filtro.
Remova mongosync_reserved_for_internal_use
.
Pare o processo
mongosync
.Conecte-se ao cluster de destino com
mongosh
. Se o destino for um cluster fragmentado, conecte-se à instânciamongos
. Se o destino for um conjunto de réplicas, conecte-se à instânciamongod
primária.Descarte o banco de dados do sistema
mongosync_reserved_for_internal_use
.use mongosync_reserved_for_internal_use db.dropDatabase()
Remova os bancos de dados de usuários.
Listar os bancos de dados no cluster
show databases Remover bancos de dados de usuários. Os bancos de dados
admin
,local
econfig
são bancos de dados do sistema. Você não deve editar esses bancos de dados do sistema sem instruções fornecidas pelo suporte do MongoDB.Se o comando
show databases
listar quaisquer bancos de dados de usuário no cluster de destino, você deverá removê-los.Repita essa etapa para cada lista de banco de dados de usuários:
use <user database name> db.dropDatabase() Observação: depois que a primeira operação de
db.dropDatabase()
for concluída, talvez seja necessário executá-la uma segunda vez para remover o banco de dados.
Configure um novo filtro.
Decida quais bancos de dados e coleções você deseja filtrar. Adicione o banco de dados e as coleções à array
includeNamespaces
. Para obter detalhes de configuração, consulte Configurar um filtro.Execute
mongosync
para reconectar-se aos clusters de origem e destino.Use o ponto final da API
/start
para iniciar a sincronização. Certifique-se de anexar seu novo filtro ao chamar/start
.
Adicionar e renomear coleções
Você pode, com algumas restrições, adicionar ou rename a collection
durante uma sincronização filtrada.
Aviso
Se sua operação de renomeação violar as restrições de renomeação, mongosync
interromperá a sincronização e reportará um erro.
Para limpar e reiniciar após um erro, siga as etapas para substituir um filtro existente.
Adicionando e renomeando em um único banco de dados
Você poderá adicionar novas coleções ou renomear uma coleção existente se todo o banco de dados fizer parte do filtro.
Você também pode renomear uma coleção se o nome antigo e o novo nome forem especificados no filtro.
Veja os exemplos de renomeação.
Renomeando em diferentes bancos de dados
Só é possível renomear uma coleção entre bancos de dados se todo o banco de dados de destino fizer parte de um filtro. Se o filtro especificar coleções individuais no banco de dados de destino, a renomeação entre bancos de dados não funcionará.
Veja os exemplos de renomeação.
Filtragem com mapReduce e $out
Para usar o estágio de agregação $out
ou o comando mapReduce
(quando definido para criar ou substituir uma coleção) com filtragem, é necessário filtrar todo o banco de dados e não só a coleção especificada.
Por exemplo, considere este pipeline de agregação:
use library db.books.aggregate( [ { $group : { _id : "$author", titles: { $push: "$title" } } }, { $out : "authors" } ] )
O estágio $out
cria a coleção authors
no banco de dados library
. Se desejar sincronizar a coleção authors
, especifique todo o banco de dados library
no filtro. O filtro não funcionará se você especificar apenas a coleção authors
.
Este filtro funciona:
"includeNamespaces": [ { "database": "library" } ]
Este filtro não funciona:
"includeNamespaces": [ { "database": "library", "collections": [ "authors", "books" ] // DOES NOT WORK WITH $OUT } ]
Limitações
A filtragem não é compatível com a sincronização reversível.
O cluster de destino não deve conter dados de usuários antes de iniciar.
O cluster de destino não deve conter o banco de dados do sistema
mongosync_reserved_for_internal_use
antes de iniciar.Não é possível modificar um filtro em uso. Para criar um novo filtro, consulte Como substituir um filtro existente.
Só é possível renomear coleções em determinadas situações. Para obter mais detalhes, consulte a página Como adicionar e renomear coleções.
Se um filtro incluir um modo de exibição, mas não a coleção base, somente os metadados do modo de exibição serão sincronizados com o cluster de destino. Para incluir os documentos de visualização, você também deve sincronizar a coleção base.
Não é possível especificar coleções do sistema ou bancos de dados do sistema em um filtro.
Para utilizar o estágio de agregação
$out
ou o comandomapReduce
(quando definido para criar ou substituir uma coleção) com filtragem, você deve configurar o filtro para utilizar o banco de dados inteiro. Você não pode limitar o filtro às coleções dentro do banco de dados.Para obter mais informações, consulte Filtragem com mapReduce e $out.
Exemplos
Iniciar mongosync
com um filtro
O exemplo a seguir inicia uma tarefa de sincronização entre cluster0
e cluster1
. O cluster de origem é cluster0
e o cluster de destino é cluster1
.
cluster0
contém o reconhecimento de data center sales
, marketing
e engineering
.
O banco de dados sales
contém as coleções EMEA
, APAC
e AMER
.
O array includeNamespaces
neste exemplo define um filtro em dois dos bancos de dados: sales
e marketing
.
O banco de dados sales
também filtra as coleções EMEA
e APAC
.
"includeNamespaces" : [ { "database" : "sales", "collections": [ "EMEA", "APAC" ] }, { "database" : "marketing" } ]
Depois de chamar a API /start
com este filtro em vigor, mongosync
:
Sincroniza todas as coleções no banco de dados do
marketing
Filtra o banco de dados
engineering
Sincroniza as coleções
EMEA
eAPAC
a partir do banco de dados dosales
Filtra a coleção
AMER
Adicionar e renomear coleções durante a sincronização
O exemplo a seguir inicia uma tarefa de sincronização entre cluster0
e cluster1
. O cluster de origem é cluster0
e o cluster de destino é cluster1
.
cluster0
contém o reconhecimento de data center students
, staff
e prospects
.
O banco de dados
students
contém as coleçõesundergrad
egraduate
.O banco de dados
staff
contém as coleçõesemployees
econtractors
.
A array includeNamespaces
deste exemplo define um filtro em dois bancos de dados:
{ "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database" : "students", "collections": ["undergrad", "graduate", "adjuncts"] }, { "database" : "staff" } ] }
Com este filtro em vigor, mongosync
sincroniza:
Todo o banco de dados
staff
As coleções
undergrad
,graduate
eadjuncts
no banco de dadosstudents
mongosync
não sincroniza nenhuma informação do banco de dados prospects
.
Adicionando uma coleção
mongosync
sincroniza todo o reconhecimento de data center do staff
. Se você adicionar novas collection ao reconhecimento de data center do staff
, o mongosync
também as sincronizará.
mongosync
não sincroniza novas collection adicionadas ao reconhecimento de data center students
, a menos que a collection faça parte do filtro.
Por exemplo, o mongosync
não sincroniza a nova coleção se você adicionar a coleção postdocs
ao banco de dados students
. Se você adicionar a coleção adjuncts
, o mongosync
sincroniza essa coleção, pois adjuncts
faz parte do filtro.
Renomear uma coleção
Você pode renomear qualquer coleção no banco de dados staff
.
// This code works use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.salaried" } )
Você só poderá renomear uma coleção no banco de dados students
se os nomes novos e antigos estiverem no filtro. Se algum dos nomes não estiver no filtro, monogsync
reportará um erro e existirá.
// This code works use admin db.runCommand( { renameCollection: "students.graduate", to: "students.adjuncts" } )
Se uma coleção for especificada no filtro, você poderá descartá-la, mas não poderá renomeá-la para removê-la do filtro.
// This code produces an error and mongosync stops syncing use admin db.runCommand( { renameCollection: "students.graduate", to: "students.notAFilteredCollection" } )
Quando todo o banco de dados de destino é incluído no filtro, você pode renomear coleções para adicioná-las ao filtro:
A coleção de origem é especificada no filtro
use admin db.runCommand( { renameCollection: "students.adjuncts", to: "staff.adjuncts" } ) A coleção de origem não está especificada no filtro
use admin db.runCommand( { renameCollection: "prospects.current", to: "staff.newHires" } )
Você também pode renomear coleção no banco de dados de origem quando todo o banco de dados de destino estiver no filtro:
use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.onPayroll" } )
Importante
Se você pretende renomear as coleção, considere adicionar o banco de dados inteiro ao filtro em vez de especificar coleção individuais.