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压缩。