Novedad 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 La utilidad mongosync transfiere entre los clústeres de origen y destino.
A partir de la versión 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 ambos filtros de inclusión y exclusión,
mongosyncsólo sincroniza las bases de datos y colecciones que coinciden con los filtros de inclusión y luego excluye las que también coincidan 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 y excludeNamespaces. Cada campo acepta un arreglo de filtros que especifican las bases de datos y colecciones a incluir o excluir de la sincronización.
Nota
Si la llamada start utiliza tanto los parámetros includeNamespaces como excludeNamespaces, primero mongosync hace coincidir bases de datos y colecciones de los filtros de inclusión, y luego excluye aquellos 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 necesitas que el filtro haga coincidir colecciones específicas, puedes usar tanto el arreglo collections para especificar colecciones individualmente como definir una expresión regular con el campo collectionsRegex.
Configurar un filtro
Importante
Una vez que inicies mongosync con un filtro aplicado, no se podrá modificar el filtro. Si es necesario crear un nuevo filtro, consulta: Reiniciar Mongosync.
Identifica bases de datos y colecciones.
Identifica las bases de datos y colecciones que deseas sincronizar con el clúster de destino.
Al agregar un conjunto de bases de datos al filtro, también se excluyen las demás bases de datos en el clúster.
Cuando se especifica una colección en el filtro, también se excluyen otras colecciones que se encuentren en la misma base de datos.
Crea un filtro.
La start API acepta dos parámetros que configuran filtros 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 un arreglo de filtros, que se usan para determinar de qué bases de datos y coleccionesmongosyncdeben excluirse de la sincronización.
Si no se 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 que solo sincronizara 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.
Use el Filtro.
Para usar el filtro, adjunte el JSON del filtro cuando realice una llamada a la API /start para comenzar a sincronizar.
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 una configuración de ejemplo, consulta: Comienza mongosync con un filtro.
Sustituir 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, añadir o rename a collection durante una sincronización 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 forma parte del filtro.
También se puede renombrar una colección si tanto el nombre antiguo como el nuevo están especificados en el filtro.
Vea los ejemplos de cambio de nombre.
Renombrar en diferentes bases de datos
Solo puede cambiar el nombre de una colección entre 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, el renombrado entre bases de datos no funciona.
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 deseas sincronizar la colección authors, debes especificar toda la base de datos library en tu filtro. El filtro no funcionará si solo especificas 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 comenzar a menos que establezca el parámetro preExistingDestinationData en
trueal llamar a/start.El clúster de destino no debe contener la base de datos del sistema
mongosync_reserved_for_internal_useantes de comenzar.No puede modificar un filtro que esté en uso. Para crear un nuevo filtro, consulta: Reemplazar un filtro existente.
Solo puedes renombrar las colecciones en ciertas situaciones. Para más detalles, consulta: Agregar y renombrar colecciones.
Si un filtro incluye una vista pero no la colección base, sólo los metadatos de la vista se sincronizan con el clúster de destino. Para incluir los documentos de vista, también debe sincronizar la colección base.
No puedes especificar colección del sistema ni base 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, consulta 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
Empieza 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.
El arreglo 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 datossalesSe filtra 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 añades la adjuncts colección, mongosync la sincroniza, ya que adjuncts forma parte del filtro.
Renombrar una colección
Puedes 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 fuente 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 anticipas cambiar el nombre de colecciones, considera añadir toda la base de datos al filtro en vez de especificar colecciones individuales.