Skip to content
基于mongo-oplog的阿里云MongoDB线上线下同步工具
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
README.md
app.js
package.json

README.md

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参考链接

You can’t perform that action at this time.