Nuevo en la versión 1.1.
Mongosync migra datos entre dos clústeres de MongoDB. Puede usar la sincronización filtrada para especificar qué bases de datos y colecciones... La utilidadmongosync transfiere datos entre los clústeres de origen y destino.
A partir de 1.1, mongosync Admite filtros de inclusión para especificar qué bases de datos y colecciones se incluirán en la sincronización. A partir de 1.6, mongosync también admite filtros de exclusión y expresiones regulares.
Con filtros de inclusión,
mongosyncsincroniza las bases de datos y colecciones coincidentes.Con filtros de exclusión,
mongosyncsincroniza todas las bases de datos y colecciones, excepto aquellas que coinciden con los filtros.Con filtros de inclusión y exclusión,
mongosyncsolo sincroniza las bases de datos y colecciones que coinciden con los filtros de inclusión y luego excluye todas aquellas que también coinciden con los filtros de exclusión.Sin filtros,
mongosyncsincroniza todas las bases de datos y colecciones.
Sintaxis de filtro
El start punto final de la API acepta dos campos que configuran la sincronización filtrada: includeNamespaces excludeNamespacesy. Cada campo acepta una matriz de filtros que especifican las bases de datos y colecciones que se incluirán o excluirán de la sincronización.
Nota
Si la llamada utiliza start los includeNamespaces excludeNamespaces parámetros y, mongosync primero coincide con las bases de datos y colecciones de los filtros de inclusión y luego excluye aquellas que también coinciden con un filtro de exclusión.
Los filtros tienen la siguiente sintaxis:
"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>" } } ]
Para obtener más información sobre la pattern sintaxis de las options expresiones regulares y, consulte Expresiones regulares en filtros.
Los filtros deben incluir el campo database o el campo databaseRegex.
Si necesita que el filtro coincida con colecciones específicas, puede utilizar la matriz collections para especificar colecciones individualmente o definir una expresión regular utilizando el campo collectionsRegex.
Configurar un filtro
Importante
Una vez que inicie mongosync con un filtro, este no se podrá modificar. Si necesita crear un filtro nuevo, consulte: Reiniciar Mongosync.
Identificar bases de datos y colecciones.
Identifique las bases de datos y colecciones que desea sincronizar con el clúster de destino.
Cuando agrega un conjunto de bases de datos al filtro, también excluye cualquier otra base de datos en el clúster.
Cuando especifica una colección en su filtro, también excluye cualquier otra colección que esté en la misma base de datos.
Crear un filtro.
La API acepta dos parámetros que configuran filtros start opcionales:
El parámetro
includeNamespacestoma una matriz de filtros, que se utilizan para determinar qué bases de datos y coleccionesmongosyncdeben incluirse en la sincronización.El parámetro
excludeNamespacestoma una matriz de filtros, que se utilizan para determinar qué bases de datos y coleccionesmongosyncdeben excluirse de la sincronización.
Si no especifica un filtro, mongosync realiza una sincronización completa del clúster.
Cree filtros de inclusión y/o exclusión para identificar las bases de datos y colecciones que desea sincronizar.
Por ejemplo, este filtro de inclusión configuraría mongosync para sincronizar únicamente las colecciones cuyos nombres comiencen con accounts_ de la base de datos sales, excepto la colección accounts_old:
"includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+?$", "options": "ms" } ], "excludeNamespaces": [ { "database": "sales", "collections": [ "accounts_old" ] } ]
Para obtener más información sobre los filtros, consulte Sintaxis de filtro.
Utilice el filtro.
Para usar el filtro, adjunte el json del filtro cuando realice la llamada API /start para comenzar la sincronización.
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 ver un ejemplo de configuración, consulte: Iniciar mongosync con un filtro.
Reemplazar un filtro existente
No se puede actualizar un filtro existente. Debes detener el proceso de sincronización en curso, preparar el clúster de destino y reiniciar mongosync con un nuevo filtro. Para reiniciar mongosync, consulta: Reiniciar Mongosync.
Añadir y renombrar colecciones
Puede, con algunas restricciones, agregar o durante una sincronización rename a collection filtrada.
Advertencia
Si su operación de cambio de nombre viola las restricciones de cambio de nombre, mongosync deja de sincronizar y reporta un error.
Para limpiar y reiniciar después de un error, siga los pasos para reemplazar un filtro existente.
Agregar y renombrar dentro de una sola base de datos
Puede agregar nuevas colecciones o cambiar el nombre de una colección existente si toda la base de datos es parte del filtro.
También puedes cambiar el nombre de una colección si el nombre antiguo y el nuevo están especificados en el filtro.
Vea los ejemplos de cambio de nombre.
Renombrar en diferentes bases de datos
Solo se puede renombrar una colección en distintas bases de datos si toda la base de datos de destino forma parte de un filtro. Si el filtro especifica colecciones individuales en la base de datos de destino, no es posible renombrar entre distintas bases de datos.
Vea los ejemplos de cambio de nombre.
Filtrado con mapReduce y $out
Para utilizar la $out etapa de agregación o el comando (cuando mapReduce se configura para crear o reemplazar una colección) con filtrado, debe filtrar toda la base de datos y no solo la colección especificada.
Por ejemplo, considere esta canalización de agregación:
use library db.books.aggregate( [ { $group : { _id : "$author", titles: { $push: "$title" } } }, { $out : "authors" } ] )
La etapa $out crea la colección authors en la base de datos library. Si desea sincronizar la colección authors, debe especificar toda la base de datos library en su filtro. El filtro no funcionará si solo especifica la colección authors.
Este filtro funciona:
"includeNamespaces": [ { "database": "library" } ]
Este filtro no funciona:
"includeNamespaces": [ { "database": "library", "collections": [ "authors", "books" ] // DOES NOT WORK WITH $OUT } ]
Limitaciones
El filtrado no es compatible con la sincronización reversible.
El clúster de destino no debe contener datos de usuario antes de iniciarse a menos que establezca el parámetro preExistingDestinationData en
truecuando llame/starta.El clúster de destino no debe contener la base de datos del sistema
mongosync_reserved_for_internal_useantes de iniciar.No se puede modificar un filtro en uso. Para crear un filtro nuevo, consulte: Reemplazar un filtro existente.
Solo se pueden renombrar colecciones en ciertas situaciones. Para más información, consulte: Agregar y renombrar colecciones.
Si un filtro incluye una vista, pero no la colección base, solo los metadatos de la vista se sincronizan con el clúster de destino. Para incluir los documentos de la vista, también debe sincronizar la colección base.
No se pueden especificar colecciones del sistema ni bases de datos del sistema en un filtro.
Para usar la
$outetapa de agregación o el comando (cuandomapReducese configura para crear o reemplazar una colección) con filtrado, debe configurar el filtro para que use toda la base de datos. No puede limitar el filtro a colecciones dentro de la base de datos.Para obtener más información,consulte Filtrado con mapReduce y $out.
El filtrado no admite el bloqueo de escritura dual. Puede usar el bloqueo de escritura solo en el destino.
Ejemplos
Comience mongosync con un filtro
El siguiente ejemplo inicia un trabajo de sincronización entre el clúster de origen cluster0 y el clúster de destino cluster1.
cluster0 contiene las bases de datos sales, marketing y engineering.
La base de datos sales contiene las colecciones EMEA, APAC y AMER.
La matriz includeNamespaces en este ejemplo define un filtro en dos de las bases de datos, sales y marketing.
La base de datos sales también filtra las colecciones EMEA y APAC.
"includeNamespaces" : [ { "database" : "sales", "collections": [ "EMEA", "APAC" ] }, { "database" : "marketing" } ]
Después de llamar a la API /start con este filtro implementado, mongosync:
Sincroniza todas las colecciones en la base de datos
marketingFiltra la base de datos
engineeringSincroniza las colecciones
EMEAyAPACde la base de datossalesFiltra la colección
AMER
Añadiendo y cambiando el nombre de colecciones mientras se mantiene la sincronización
El siguiente ejemplo inicia un trabajo de sincronización entre el clúster de origen cluster0 y el clúster de destino cluster1.
cluster0 contiene las bases de datos students, staff y prospects.
La base de datos
studentscontiene las coleccionesundergrad,graduateyadjuncts.La base de datos
staffcontiene las coleccionesemployeesycontractors.
La matriz includeNamespaces en este ejemplo define un filtro en dos de las bases de datos:
{ "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database" : "students", "collections": ["undergrad", "graduate", "adjuncts"] }, { "database" : "staff" } ] }
Con este filtro activado, mongosync se sincroniza:
Toda la base de datos
staffLas colecciones
undergrad,graduateyadjunctsen la base de datosstudents
mongosync no sincroniza ninguna información de la base de datos prospects.
Agregar una colección
mongosync Sincroniza toda la base de datos staff. Si agrega nuevas colecciones a la base de datos staff, mongosync también las sincroniza.
mongosync no sincroniza las nuevas colecciones que se agregan a la base de datos students a menos que la colección sea parte del filtro.
Por ejemplo, mongosync no sincroniza la nueva colección si se añade la colección postdocs a la base de datos students. Si se añade la colección adjuncts, mongosync la sincroniza, ya que adjuncts forma parte del filtro.
Cambiar el nombre de una colección
Puede cambiar el nombre de cualquier colección en la base de datos staff.
// This code works use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.salaried" } )
Solo puedes renombrar una colección dentro de la base de datos students si los nombres nuevo y antiguo están ambos en el filtro. Si alguno de los nombres no está en el filtro, monogsync informa de un error y termina la operación.
// This code works use admin db.runCommand( { renameCollection: "students.graduate", to: "students.adjuncts" } )
Si se especifica una colección en el filtro, puedes eliminarla, pero no puedes cambiarle el nombre para eliminarla del filtro.
// This code produces an error and mongosync stops syncing use admin db.runCommand( { renameCollection: "students.graduate", to: "students.notAFilteredCollection" } )
Cuando toda la base de datos de destino esté incluida en el filtro, puede cambiar el nombre de las colecciones para agregarlas al filtro:
La colección de origen se especifica en el filtro
use admin db.runCommand( { renameCollection: "students.adjuncts", to: "staff.adjuncts" } ) La colección de origen no está especificada en el filtro
use admin db.runCommand( { renameCollection: "prospects.current", to: "staff.newHires" } )
También puedes cambiar el nombre de las colecciones en la base de datos de origen cuando toda la base de datos de destino está en el filtro:
use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.onPayroll" } )
Importante
Si prevé cambiar el nombre de las colecciones, considere agregar la base de datos completa al filtro en lugar de especificar colecciones individuales.