MongoShake es una herramienta de código abierto desarrollada por Alibaba Cloud que sincroniza datos entre bases de datos MongoDB para casos de uso como análisis de datos, recuperación ante desastres y replicación activa-activa. Este tema explica cómo configurar la sincronización en tiempo real entre instancias de ApsaraDB for MongoDB.
MongoShake
MongoShake es una herramienta de servicio de propósito general desarrollada por Alibaba Cloud en Go. Replica datos desde MongoDB mediante la lectura de sus registros de operaciones (oplogs) y su reproducción en la instancia de destino.
MongoShake también ofrece funciones de suscripción y consumo de datos. Se integra con SDK, Kafka y MetaQ para admitir escenarios como suscripción a registros, sincronización de centros de datos y eliminación asíncrona de caché.
Para obtener más información, consulte el repositorio de GitHub de MongoShake.
Orígenes de datos compatibles
|
Origen |
Destino |
|
Base de datos MongoDB autogestionada en una instancia ECS |
Base de datos MongoDB autogestionada en una instancia ECS |
|
Base de datos MongoDB autogestionada local |
Base de datos MongoDB autogestionada local |
|
Instancia de ApsaraDB for MongoDB |
Instancia de ApsaraDB for MongoDB |
|
Base de datos MongoDB en nube de terceros |
Base de datos MongoDB en nube de terceros |
Notas
No ejecute ninguna operación DDL en la base de datos de origen antes de completar la sincronización completa. De lo contrario, pueden producirse inconsistencias en los datos.
No se admite la sincronización de la base de datos local. Para sincronizar datos de la base de datos admin, consulte Migrate business data from the admin database to a non-admin database.
Permisos obligatorios
Origen | Permisos obligatorios |
Instancia MongoDB de origen | El permiso Nota El programa MongoShake crea automáticamente la base de datos |
Instancia MongoDB de destino | El permiso |
Para obtener información sobre cómo crear y autorizar usuarios de bases de datos MongoDB, consulte Use DMS to manage MongoDB database users o el comando db.createUser.
Requisitos previos
Para obtener un rendimiento óptimo de sincronización, asegúrese de que la instancia de conjunto de réplicas de MongoDB de origen utilice una VPC. Si utiliza la red clásica, cambie su tipo de red a VPC. Para obtener más información, consulte Switch the network type of an instance from classic network to VPC.
Cree una instancia de conjunto de réplicas de MongoDB de destino. Para minimizar la latencia de red, cree la instancia de destino en la misma VPC que la instancia de origen. Para obtener más información, consulte Create a replica set instance.
Cree una instancia ECS para ejecutar MongoShake. Para minimizar la latencia de red, cree la instancia ECS en la misma VPC que la instancia de origen. Para obtener más información, consulte Create an ECS instance.
Agregue la dirección IP privada de la instancia ECS a las listas de permitidos de las instancias MongoDB de origen y de destino, y compruebe que la instancia ECS pueda conectarse a ambas instancias. Para obtener más información, consulte Modify a whitelist.
Si su configuración de red no cumple con los requisitos anteriores, puede solicitar un endpoint público tanto para la instancia MongoDB de origen como para la de destino. Luego, agregue la dirección IP pública de la instancia ECS a las listas de permitidos de ambas instancias MongoDB para realizar la sincronización a través de los endpoints públicos. Para obtener más información, consulte Apply for a public endpoint y Modify a whitelist.
Procedimiento
Este procedimiento asume que MongoShake está instalado en el directorio /test/mongoshake.
-
Inicie sesión en la instancia ECS.
NotaPuede elegir un método de inicio de sesión según su escenario. Para obtener más información, consulte Overview of logon methods for ECS servers.
-
Ejecute el siguiente comando para descargar el programa MongoShake y renombrarlo como
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.gzNotaEl comando descarga MongoShake 2.8.7. Para descargar la versión más reciente, consulte la página de versiones.
-
Ejecute el siguiente comando para extraer el paquete de MongoShake en el directorio /test/mongoshake.
tar zxvf mongoshake.tar.gz && mv mongo-shake-v2.8.7 /test/mongoshake && cd /test/mongoshake -
Ejecute el comando
vi collector.confpara modificar el archivo de configuración de MongoShake collector.conf. La siguiente tabla describe los parámetros principales.Parámetro
Descripción
Ejemplo
mongo_urls
La URI de cadena de conexión de la instancia MongoDB de origen. En el ejemplo, la cuenta de la base de datos es test, que se encuentra en la base de datos admin.
NotaSe recomienda utilizar un endpoint de VPC para minimizar la latencia de red.
Para obtener detalles sobre el formato de la URI de cadena de conexión, 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:3717NotaLa contraseña no puede contener el signo de arroba (
@). De lo contrario, la conexión fallará.tunnel.address
La URI de cadena de conexión de la instancia MongoDB de destino. En el ejemplo, la cuenta de la base de datos es test, que se encuentra en la base de datos admin.
NotaSe recomienda utilizar un endpoint de VPC para minimizar la latencia de red.
Para obtener detalles sobre el formato de la URI de cadena de conexión, 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:3717NotaLa contraseña no puede contener el signo de arroba (
@). De lo contrario, la conexión fallará.sync_mode
El modo de sincronización de datos. Valores válidos:
all: realiza una sincronización completa y una incremental.
full: realiza únicamente una sincronización completa.
incr: realiza únicamente una sincronización incremental.
NotaEl valor predeterminado es
incr.sync_mode = allNotaPara consultar la lista completa de parámetros en collector.conf, consulte la sección "Parámetros de collector.conf" en Appendix.
-
Ejecute el siguiente comando para iniciar la tarea de sincronización e imprimir los registros.
./collector.linux -conf=collector.conf -verbose -
Observe la salida de registros. Cuando aparezca una entrada similar a la siguiente, indica que la sincronización completa ha finalizado y ha comenzado la sincronización incremental.
[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]
Estado del monitoreo
Una vez iniciada la sincronización incremental, abra una nueva ventana de terminal y ejecute los siguientes comandos:
cd /test/mongoshake && ./mongoshake-stat --port=9100
mongoshake-stat es un script de Python y requiere tener instalado Python 2.7. Para obtener más información, consulte el sitio web oficial de Python.
Salida de ejemplo:
./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
Descripciones de parámetros:
|
Parámetro |
Descripción |
|
logs_get/sec |
Número de oplogs obtenidos por segundo. |
|
logs_repl/sec |
Número de operaciones de reproducción de oplogs ejecutadas por segundo. |
|
logs_success/sec |
Número de operaciones de reproducción de oplogs exitosas por segundo. |
|
lsn.time |
Marca de tiempo del último oplog enviado. |
|
lsn_ack.time |
Marca de tiempo en la que la instancia de destino confirmó la operación de escritura. |
|
lsn_ckpt.time |
Marca de tiempo en la que se persistió el punto de control. |
|
now.time |
Hora actual. |
|
replset |
Nombre del conjunto de réplicas de la base de datos de origen. |
Migrar datos desde la base de datos admin
MongoDB no recomienda oficialmente almacenar datos empresariales en la base de datos admin, ya que el comportamiento de bloqueo y los conflictos con comandos internos pueden degradar el rendimiento de la instancia.
MongoShake admite la sincronización de datos empresariales desde la base de datos admin hacia una base de datos que no sea admin.
Para lograrlo, siga los pasos en Procedure. En el paso 4, al modificar el archivo collector.conf, agregue los siguientes elementos de configuración:
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
Tabla 1. Parámetros de collector.conf
Categoría | Parámetro | Descripción | Ejemplo |
N/A | conf.version | Versión del archivo de configuración. No modifique este valor. |
|
Opciones globales | id | ID de la tarea de sincronización. Este valor se puede personalizar y se utiliza para el nombre del archivo de registro, el nombre de la base de datos que almacena la información de los puntos de control y el nombre de la base de datos en la instancia de destino. |
|
master_quorum | Opción de alta disponibilidad. Cuando los nodos primario y en espera de MongoShake sincronizan datos desde el mismo origen, establezca este parámetro en Valores válidos:
Nota El valor predeterminado es false. |
| |
full_sync.http_port | Puerto HTTP para consultar el estado de la sincronización completa. Nota El valor predeterminado es 9101. |
| |
incr_sync.http_port | Puerto HTTP para consultar el estado de la sincronización incremental. Nota El valor predeterminado es 9100. |
| |
system_profile_port | Puerto de generación de perfiles que se utiliza para consultar información interna de la pila. |
| |
log.level | Nivel de registro. Valores válidos:
Valor predeterminado: info. |
| |
log.dir | Directorio para los archivos de registro y los archivos PID. Si no se establece este parámetro, se utiliza de forma predeterminada el directorio logs en la ruta actual. Nota Debe especificar una ruta absoluta para este parámetro. |
| |
log.file | Nombre del archivo de registro. Este valor se puede personalizar. Nota El valor predeterminado es collector.log. |
| |
log.flush | Frecuencia de actualización de registros en pantalla. Valores válidos:
Nota El valor predeterminado es false. |
| |
sync_mode | Modo de sincronización de datos. Valores válidos:
Nota El valor predeterminado es incr. |
| |
mongo_urls | URI de cadena de conexión de la instancia MongoDB de origen. En el ejemplo, la cuenta de la base de datos es test, ubicada en la base de datos admin. Nota
|
| |
mongo_cs_url | Si el origen es una instancia de clúster fragmentado, debe especificar la URI de cadena de conexión del nodo ConfigServer (CS). Para obtener información sobre cómo conseguir la URI de cadena de conexión de un nodo ConfigServer, consulte Apply for an endpoint for a shard. En el ejemplo, la cuenta de la base de datos es test, ubicada en la base de datos admin. |
| |
mongo_s_url | Si el origen es una instancia de clúster fragmentado, debe especificar la URI de cadena de conexión de como mínimo un nodo mongos. Separe varias direcciones de mongos con comas (,). Para obtener información sobre cómo conseguir la URI de cadena de conexión de un nodo mongos, consulte Apply for an endpoint for a shard. En el ejemplo, la cuenta de la base de datos es test, ubicada en la base de datos admin. |
| |
tunnel | Tipo de canal de sincronización. Valores válidos:
Nota El valor predeterminado es direct. |
| |
tunnel.address | Dirección del destino. El formato de dirección compatible varía según el tipo de túnel:
En el ejemplo, la cuenta de la base de datos es test, ubicada en la base de datos admin. |
| |
tunnel.message | Tipo de datos en el canal. Este parámetro solo es válido cuando
Nota El valor predeterminado es raw. |
| |
mongo_connect_mode | Modo de conexión de la instancia MongoDB. Este parámetro solo es válido cuando
Nota El valor predeterminado es secondaryPreferred. |
| |
filter.namespace.black | Especifica una lista de bloqueados para la sincronización de datos. Los namespaces especificados no se sincronizan con la base de datos de destino. Separe varios namespaces con punto y coma (;). Nota Un namespace es el nombre canónico de una colección o índice en MongoDB. Es una combinación del nombre de la base de datos y el nombre de la colección o índice, como |
| |
filter.namespace.white | Especifica una lista de permitidos para la sincronización de datos. Solo los namespaces especificados se sincronizan con la base de datos de destino. Separe varios namespaces con punto y coma (;). |
| |
filter.pass.special.db | Habilita la sincronización de bases de datos especiales. De forma predeterminada, se filtran bases de datos como |
| |
filter.ddl_enable | Especifica si se debe habilitar la sincronización DDL. Valores válidos:
Nota Esta función no es compatible cuando el origen es una instancia de clúster fragmentado. |
| |
checkpoint.storage.url | Dirección de almacenamiento para los puntos de control, utilizada para admitir la sincronización reanudable. Si no se configura este parámetro, el programa escribe los puntos de control en una de las siguientes bases de datos según el tipo de instancia:
En el ejemplo, la cuenta de la base de datos es test, ubicada en la base de datos admin. |
| |
checkpoint.storage.db | Nombre de la base de datos para almacenar puntos de control. Nota El valor predeterminado es mongoshake. |
| |
checkpoint.storage.collection | Nombre de la colección para almacenar puntos de control. Cuando los nodos primario y en espera de MongoShake sincronizan datos desde el mismo origen, puede cambiar este nombre de colección para evitar conflictos. Nota El valor predeterminado es ckpt_default. |
| |
checkpoint.start_position | Posición inicial para la sincronización. Este parámetro solo se utiliza si no se encuentra ningún punto de control. El formato es Nota El valor predeterminado es 1970-01-01T00:00:00Z. |
| |
transform.namespace | Cambia el nombre de una base de datos o colección de origen y la sincroniza con el destino. Por ejemplo, puede cambiar el nombre de |
| |
Opciones de sincronización completa | full_sync.reader.collection_parallel | Número máximo de colecciones que MongoShake puede extraer simultáneamente a la vez. |
|
full_sync.reader.write_document_parallel | Número de hilos de escritura concurrentes por colección para MongoShake. |
| |
full_sync.reader.document_batch_size | Tamaño del lote para escribir documentos en la instancia de destino. Por ejemplo, un valor de 128 indica que se agrupan 128 documentos antes de escribirlos. |
| |
full_sync.collection_exist_drop | Especifica qué hacer si una colección de destino tiene el mismo nombre que una colección de origen. Valores válidos:
|
| |
full_sync.create_index | Especifica si se debe crear un índice una vez completada la sincronización. Valores válidos:
|
| |
full_sync.executor.insert_on_dup_update | Especifica si se debe convertir una instrucción
|
| |
full_sync.executor.filter.orphan_document | Especifica si se deben filtrar documentos huérfanos cuando el origen es una instancia de clúster fragmentado. Valores válidos:
|
| |
full_sync.executor.majority_enable | Especifica si se debe habilitar la escritura por mayoría en la instancia de destino. Valores válidos:
|
| |
Opciones de sincronización incremental | incr_sync.mongo_fetch_method | Método para extraer datos incrementales. Valores válidos:
Valor predeterminado: oplog. |
|
incr_sync.oplog.gids | Se utiliza para configurar la replicación bidireccional en clústeres en la nube. |
| |
incr_sync.shard_key | Método interno de concurrencia para MongoShake. No modifique este parámetro. |
| |
incr_sync.worker | Número de hilos concurrentes para transmitir oplogs. Puede aumentar este valor si el rendimiento del host es suficiente. Nota Si el origen es una instancia de clúster fragmentado, el número de hilos debe ser igual al número de shards. |
| |
incr_sync.worker.oplog_compressor | Habilita la compresión de datos para reducir el consumo de ancho de banda de red. Valores válidos:
Nota Este parámetro solo es válido cuando el parámetro |
| |
incr_sync.target_delay | Retraso, en segundos, antes de aplicar los cambios del origen al destino. Puede configurar este parámetro para evitar operaciones accidentales. Por ejemplo, Nota Un valor de 0 indica sincronización en tiempo real. |
| |
incr_sync.worker.batch_queue_size | Parámetros de configuración de la cola interna de MongoShake. No modifique estos parámetros a menos que sea necesario. |
| |
incr_sync.adaptive.batching_max_size |
| ||
incr_sync.fetcher.buffer_capacity |
| ||
Opciones de sincronización de MongoDB (solo para modo | incr_sync.executor.upsert | Especifica si se debe convertir una instrucción
|
|
incr_sync.executor.insert_on_dup_update | Especifica si se debe convertir una instrucción
|
| |
incr_sync.conflict_write_to | Especifica si se deben registrar documentos conflictivos cuando ocurre un conflicto de escritura durante la sincronización. Valores válidos:
|
| |
incr_sync.executor.majority_enable | Especifica si se debe habilitar la escritura por mayoría en la instancia de destino. Valores válidos:
Nota Habilitar esta función puede afectar el rendimiento. |
|
Preguntas frecuentes
Consulte las preguntas frecuentes de MongoShake. Si encuentra otros problemas al utilizar MongoShake, puede abrir un ticket en GitHub Issues.