代码改变世界

Mongo-Shake介绍(1)

2023-01-23 14:01  abce  阅读(826)  评论(0编辑  收藏  举报

Mongo-Shake由阿里云Nosql团队开发和维护,是一个基于MongoDB的oplog的通用服务平台。从源mongo数据库中获取oplog,并在目标mongo数据库中重放或通过不同的tunnels发送到其他终端。如果目标端是mongo数据库,这意味着直接重放oplog,它就像一个同步工具,用于将数据从源MongoDB复制到另一个MongoDB,以构建冗余复制或active-active复制。

除了这种直接方式,还有其他tunnels类型,如rpc、file、tcp、kafka。用户编写的接收者必须分别定义自己的接口来连接这些tunnels。用户还可以定义自己的可插拔tunnels类型。如果连接到像kafka这样的第三方消息中间件,消费者可以灵活地在pub/sub模块中以异步方式获取订阅者数据。

 

这里是一般的数据流,

源可以是单个mongod,副本集或分片,而目标可以是mongod或mongos。如果源是副本集,我们建议从secondary/hidden中获取数据,以缓解primary的压力。如果源是分片,每个分片都应该连接到Mongo-Shake。在目标端可以有多个mongos以保持高可用性,不同的数据将被散列并写入不同的mongos。

 

并行复制

并行复制有三个选项,我们称之为“shad_key”:id、collection和auto。

·id表示并发粒度为文档;

·collection表示并发粒度为集合/表;

·auto选项由集合是否存在唯一索引决定,如果集合有唯一索引,就会使用collection,否则会更改成id。

 

高可用

Mongo-Shake周期性地将其上下文持久化到注册中心,默认情况下是源数据库。

目前,上下文是checkpoint,它标记了成功重放的oplog的位置。MongoShake还提供了Hypervisor机制用于在服务挂掉的时候,将服务重新拉起(配置中的master_quorum)。

 

过滤

支持黑白名单过滤数据库和集合命名空间。

 

DDL同步

从1.5版本开始,MongoShake通过使用全局barrier支持DDL同步。一旦获取DDL oplog, MongoShake就会添加一个barrier,让后面所有的oplog都在队列中等待,直到这个oplog被写入目标MongoDB或tunnels,并且检查点更新。目前DDL只在源端支持ReplicaSet(目标端可以是RelicaSet或者Sharding),以后的版本我们会支持Sharding。

 

全局ID

阿里云内部版本支持全局id(也叫gid),用来标识数据库的id。当两个数据库成为彼此的备份时,它可以用来避免循环。

Mongo-Shake只获取等于源数据库id的oplogs,当没有gid时,所有的oplogs都将被获取。目前的开源版本,受MongoDB内核修改的限制,暂不支持。

如果你想在不支持gid的情况下构建双活复制,请访问FAQ文档以了解更多详细信息。

 

Compressor

在批量发送oplogs前,支持Gzip, zlib, deflate压缩。