[ali-mongo] ---> [ecs + rinetd] ---> [redis record timestamp] ---> [mongo-oplog]
- 使用
rinetd
在某一台ECS
主机上把阿里云MongoDB
端口映射到外网,从而保证在外网环境下可以访问线上的MongoDB。 - 基于
mongo-oplog
的**:使用MongoDB复制集的同步依据oplog.rs
作为回放依据 - 使用
redis
记录最新一次同步的oplog中的ts
字段,目的是用到mongo-oplog
中的since
,since
就是oplog的开始同步时间
详情参考通过公网连接云数据库 MongoDB--ECS Linux 篇
测试环境:
$ node -v
v6.4.0
$ npm -v
3.10.6
$ pm2 -v
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
1.1.3
启动前需要配置app.js
中的线上、线下的Mongo URI地址:
const onlineMongoUrl = "mongodb://yourusername:yourpassword@ecs.aliyun.mongo.mapping.com:3717/local?authSource=admin";
const localDb = mongojs('localhost:27017/Onions'); //local mongodb
跑app.js
的时候建议使用pm2(pm2 start app.js
)
Mac下使用brew install redis
,没有做特殊设置直接启动:
$ redis-server
测试时没有做特殊设置直接启动:
$ sudo mongod
第一次启动时候需要,设置redis中的timestamp为0-0
:
127.0.0.1:6379> set timestamp "0-0"
OK
程序启动后会读取timestamp
作为mongo-oplog
的since
值,0-0
表示从0开始同步。
如果程序崩溃后再次启动时候,app.js
会检查redis
中的timestamp
,以获取的timestamp
作为since
开始同步:
127.0.0.1:6379> get timestamp
"1-1483417098"
工作原理大概是:dump库的时候顺便把oplog也同时拿下来,然后restore后看最后一条oplog的ts
值,然后手工填到redis
的timestamp
中。这样在启动程序的时候,就会按照特定的ts时间开始同步了。