MongoShake
MongoShake copied to clipboard
增量同步,数据一致问题
背景: 往生产集群A中写入数据,增量同步给灾备集群B,在集群A宕机后,快速切换到集群B,以达到灾备目的,所以需要验证在宕机期间,集群 A和B 的数据一致性。
验证步骤:
- A -> B 正常增量同步
- 往 A 的 ycsb06库中批量插入数据
- 执行第2步过程中,关闭集群A,此时查看集群B 中 ycsb06 库下有 1122147 条数据(从0开始)
- 开启集群A,查看 ycsb06 库下有 1123035 条数据
小结: 上面验证来看,有888条数据在当即期间丢失,丢包率为 0.079% ,猜测是 mongoshake 获取到 oplog 后还没来得及 replay,A就已经挂掉了。
疑问: 请问上面的丢包可以避免吗?生产和容灾两套环境需要尽量保持数据一致,或者说是否有其他方案能尽量减小未同步的数据量(比如增加 worker 数量等等)
版本: mongoshake 2.8.4 最新版 mongodb 4.0.3
可以按时间来算一下,丢失了几秒的数据。比如一秒写入100秒,少了200条就是2秒的数据。 shake复制不是双写,总会有数据丢失的,是不可避免的。能做的就是降低复制的延迟,这个可以通过增加work来实现,这里也要注意增量hash的方式
好的,谢谢,另外还有个问题想请教下。
增量同步过程中,其他数据都没问题,但是用户信息无法同步,这是什么原因呢?
例如,我在 集群A 的 ycsb07 库下创建了一个用户 user1, 无法同步到集群B
根据 FAQ,如果要同步 admin 下的users 信息,需要配置 filter 和 transform, 这个我还没尝试,但上面的用户是在 ycsb08 库下的,也无法同步
最后一个问题,我当前是 4c8g 的独享机器,默认配置的 worker 数量为8,如果要尽量降低复制的延迟,这边建议 worker 配置为多少呢?
- shake有开启DDL同步吗? createUser属于DDL操作
- worker的配置可以根据CPU的使用率来动态调配。但是要注意一个点,worker的hash规则和业务上规格是有相互影响的,配置文件如下:
hash的方式,id表示按文档hash,collection表示按表hash,auto表示自动选择hash类型。 如果没有索引建议选择id达到非常高的同步性能,反之请选择collection。 incr_sync.shard_key = auto
开启了以下配置: filter.ddl_enable = true filter.pass.special.db = admin transform.namespace = admin.system.users:admin:system.users
结果:新增的用户均无法同步(无论是 admin 还是 其他库下的用户),其他数据(包括建表等操作)都能正常同步
另外也尝试了以下配置: filter.ddl_enable = true filter.pass.special.db = admin filter.namespace.white = admin transform.namespace = admin.system:admin:system
结果:仅同步用户数据,其他库表不同步
不清楚问题出在哪里,新增用户时,我看日志都有反馈
shake2.8.4+mongodb6.0下,创建新用户是可以同步的。 只设置这两个参数,其它两个不设置 filter.ddl_enable = true filter.pass.special.db = admin
设置shake日志参数为debug级别,看下是否有createuser或admin.system.users的日志输出。