caosiyang / py-mongo-sync

Oplog-based data sync tool that synchronizes data from a replica set to another deployment, e.g.: standalone, replica set, and sharded cluster.
http://caosiyang.github.io/py-mongo-sync/
MIT License
108 stars 46 forks source link

toml中start_optime该怎么传? #19

Closed brzone closed 6 years ago

brzone commented 6 years ago
首先感谢您无私的奉献。
在新版本采用toml进行配置化,conf_example.toml中是没有start_optime的配置的样例,所以,查看了您的代码,发现是在sync目录下进行解析,所以,我配置了如下:
 [sync]
 start_optime = 1533204691

qq 20180803145912 在您的代码中,有一步会去查询optime的oplog: 20180803150036222222222 查不到数据,就直接返回,而我手工进行查询:

qq 20180803150600555555555555555

用 db.oplog.rs.findOne({ts:{$gte:Timestamp(1533204691, 1)}}); 进行查询是可以查询到数据。
所以,就是想咨询您一下,在toml中, [sync] 下的 start_optime是怎么样配置的,格式是怎么样?

附上toml的配置:

[root@database storage py-mongo-sync-master]# cat ./toml-withOutStartOptime.toml

--------

source configurations

--------

[src]

hostportstr of a member of replica set

hosts = "10.200.103.8:3717" authdb = "admin" username = "root" password = "password "

--------

destination configurations

--------

[dst]

type = "mongo" # could be "mongo" or "es"

[dst.mongo] hosts = "10.200.103.8:4717" authdb = "admin" username = "root" password = "password"

--------

sync options

--------

[sync] start_optime = 1533204691

sync database "test"

[[sync.dbs]] db = "xxxxxxxxxx"

colls = [ { coll = "orderabc" }, { coll = "userabc" } ]

--------

log config

--------

[log]

filepath = "/data/soft/py-mongo-sync-master/log/sync.log" # write to stdout if empty or not set

caosiyang commented 6 years ago

你好, 我这里用start-optime增量同步的情况不多,而且这个值相对随机,最初的想法是使用命令行参数去配置它,配置文件和命令行参数可以同时使用,后者覆盖前者,用法如python sync.py -f CONF --start-optime TIME,但写toml配置文件代码时,做了检查,实际上并没有正确设置,这两行代码给你造成错觉,其实删除掉更好,属于我的疏忽。 我已经修复了这个错误,可以正确读取toml的start-optime,你pull下最新代码。

brzone commented 6 years ago

谢谢,我试了下,现在已经支持在toml进行配置,加载--start-optime . 发现了其他俩个现象: 1 oplog中ts由unix时间戳和自增计数构成,toml中配置的只是unix时间戳,然后获取开始时间为 xxxxxxxxx|0 的oplog,不能精确到自增计数。 2 在toml中,src配置的是副本的ip,但是同样也是通过副本ip找到primary,通过primay进行同步数据,如果,为了减轻主本的压力,采用副本同步可能会更好一些。

caosiyang commented 6 years ago

oplog timestamp目前只精确到秒,我这边用到--start-optime的情况很少,鉴于oplog回放是幂等的,设置的时间比期望起始时间戳早一点,同样可以保证数据一致。 oplog是从primary读的,目的是降低延迟,读取oplog本身不会给primary带来很大压力,如果你的primary压力很大,可以修改下代码,从secondary读取oplog。

brzone commented 6 years ago

恩,好的。谢谢你这么细心的回复。