使用MongoShake同步两个MongoDB单实例的完整指南
针对两个MongoDB单实例(非副本集)的同步场景,我将提供详细的配置和操作步骤。由于单实例默认不启用oplog,需要进行特殊配置。
前提条件
- 两个MongoDB单实例(假设IP分别为
192.168.1.101
和192.168.1.102
) - 确保两个实例的网络互通
- 每个实例需创建具有读写权限的用户
步骤1:配置源MongoDB实例启用oplog
- 编辑源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"
- 重启MongoDB服务:
sudo systemctl restart mongod
- 初始化伪副本集:
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
- 使用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
- 或者使用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:验证同步状态
- 查看MongoShake日志:
docker logs -f mongoshake
- 通过API监控同步状态:
curl http://localhost:9100/metrics
- 在目标MongoDB上验证数据:
mongo --host 192.168.1.102
use db1
db.collection1.count()
注意事项
- 单节点限制:
- 源MongoDB单节点故障会导致同步中断
-
某些DDL操作可能无法正确同步,建议手动处理
-
性能优化:
- 根据数据量调整
worker_num
和batch_size
-
启用压缩可减少网络带宽消耗
-
数据一致性:
- 首次同步会进行全量复制,耗时较长
- 建议定期比对源库和目标库的数据
通过以上步骤,你可以成功配置MongoShake在两个MongoDB单实例之间进行数据同步。