MongoShake同步两个MongoDB单实例的完整指南


使用MongoShake同步两个MongoDB单实例的完整指南

针对两个MongoDB单实例(非副本集)的同步场景,我将提供详细的配置和操作步骤。由于单实例默认不启用oplog,需要进行特殊配置。

前提条件

  1. 两个MongoDB单实例(假设IP分别为192.168.1.101192.168.1.102
  2. 确保两个实例的网络互通
  3. 每个实例需创建具有读写权限的用户

步骤1:配置源MongoDB实例启用oplog

  1. 编辑源MongoDB配置文件(通常位于/etc/mongod.conf):
storage:
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

net:
  bindIp: 0.0.0.0
  port: 27017

# 启用复制功能(即使是单节点)
replication:
  oplogSizeMB: 1024
  replSetName: "rs0"
  1. 重启MongoDB服务:
sudo systemctl restart mongod
  1. 初始化伪副本集:
mongo --host 192.168.1.101

在Mongo shell中执行:

rs.initiate({
  "_id": "rs0",
  "members": [
    {
      "_id": 0,
      "host": "192.168.1.101:27017"
    }
  ]
})

验证oplog是否正常工作:

use local
db.oplog.rs.find().limit(1).pretty()

步骤2:创建MongoShake配置文件

创建collector.conf配置文件:

# 基础配置
sync_mode = "oplog"
run_mode = "primary"

# 源MongoDB配置(单节点伪副本集)
source_type = "replset"
source_addr = "mongodb://user:password@192.168.1.101:27017/admin?replicaSet=rs0"
source_rs_name = "rs0"

# 目标MongoDB配置(单节点)
target_type = "single"
target_addr = "mongodb://user:password@192.168.1.102:27017/admin"

# 同步优化参数
worker_num = 16
batch_size = 1000
compression_type = "gzip"

# 数据过滤(可选)
ns_include = "db1.*,db2.*"
ns_exclude = "system.*"

步骤3:使用Docker启动MongoShake

  1. 使用Docker命令直接启动:
docker run -d \
  --name mongoshake \
  -v $(pwd)/collector.conf:/opt/mongoshake/conf/collector.conf \
  -v $(pwd)/logs:/opt/mongoshake/logs \
  -p 9100:9100 \
  registry.cn-hangzhou.aliyuncs.com/mongodb-shake/mongoshake:v2.8.5 \
  -conf /opt/mongoshake/conf/collector.conf
  1. 或者使用docker-compose.yml:
version: '3'

services:
  mongoshake:
    image: registry.cn-hangzhou.aliyuncs.com/mongodb-shake/mongoshake:v2.8.5
    container_name: mongoshake
    restart: always
    volumes:
      - ./collector.conf:/opt/mongoshake/conf/collector.conf
      - ./logs:/opt/mongoshake/logs
    ports:
      - "9100:9100"
    command: ["-conf", "/opt/mongoshake/conf/collector.conf"]

启动命令:

docker-compose up -d

步骤4:验证同步状态

  1. 查看MongoShake日志:
docker logs -f mongoshake
  1. 通过API监控同步状态:
curl http://localhost:9100/metrics
  1. 在目标MongoDB上验证数据:
mongo --host 192.168.1.102
use db1
db.collection1.count()

注意事项

  1. 单节点限制
  2. 源MongoDB单节点故障会导致同步中断
  3. 某些DDL操作可能无法正确同步,建议手动处理

  4. 性能优化

  5. 根据数据量调整worker_numbatch_size
  6. 启用压缩可减少网络带宽消耗

  7. 数据一致性

  8. 首次同步会进行全量复制,耗时较长
  9. 建议定期比对源库和目标库的数据

通过以上步骤,你可以成功配置MongoShake在两个MongoDB单实例之间进行数据同步。