/ali-mongo-sync

基于mongo-oplog的阿里云MongoDB线上线下同步工具

Primary LanguageJavaScript

ali-mongo-sync

工作原理

[ali-mongo] ---> [ecs + rinetd] ---> [redis record timestamp] ---> [mongo-oplog]

  1. 使用rinetd在某一台ECS主机上把阿里云MongoDB端口映射到外网,从而保证在外网环境下可以访问线上的MongoDB。
  2. 基于mongo-oplog的**:使用MongoDB复制集的同步依据oplog.rs作为回放依据
  3. 使用redis记录最新一次同步的oplog中的ts字段,目的是用到mongo-oplog中的sincesince就是oplog的开始同步时间

基础环境

Step.1 线上MongoDB

详情参考通过公网连接云数据库 MongoDB--ECS Linux 篇

Step.2 Node.js环境

测试环境:

$ 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)

Step.3 Redis环境

Mac下使用brew install redis,没有做特殊设置直接启动:

$ redis-server

Step.4 本地MongoDB

测试时没有做特殊设置直接启动:

$ sudo mongod

第一次启动

第一次启动时候需要,设置redis中的timestamp为0-0

127.0.0.1:6379> set timestamp "0-0"
OK

程序启动后会读取timestamp作为mongo-oplogsince值,0-0表示从0开始同步。

崩溃后启动

如果程序崩溃后再次启动时候,app.js会检查redis中的timestamp,以获取的timestamp作为since开始同步:

127.0.0.1:6379> get timestamp
"1-1483417098"

基于某一次特定时间启动

工作原理大概是:dump库的时候顺便把oplog也同时拿下来,然后restore后看最后一条oplog的ts值,然后手工填到redistimestamp中。这样在启动程序的时候,就会按照特定的ts时间开始同步了。

mongodump参考链接