Mongo-Shake 简介
Mongo-Shake 是一个基于 MongoDB 操作日志(oplog)的通用服务平台。它从源 MongoDB 数据库中获取操作日志,并在目标 MongoDB 数据库中重放,或者通过不同的隧道发送到其他终端。如果目标端是 MongoDB 数据库,即直接重放操作日志,那么它就像一个同步工具,用于将数据从源 MongoDB 复制到另一个 MongoDB,以构建冗余复制或双主复制。除了这种直接方式外,还有其他类型的隧道,如rpc, file, tcp, kafka。用户编写的接收器必须分别定义自己的接口来连接这些隧道。用户还可以定义自己的可插拔隧道类型。如果连接到像 Kafka 这样的第三方消息中间件,消费者可以在发布/订阅模块中灵活地以异步方式获取订阅数据。以下是通用的数据流:
源可以是 mongod 单实例、副本集或分片集群,而目标可以是 mongod 实例或 mongos 实例。如果源是副本集,我们建议从次要节点/隐藏节点获取数据,以减轻主节点的压力。如果源是分片集群,则每个分片都应连接到 Mongo-Shake。在目标端,可以有多个 mongos 实例以保持高可用性,并且不同的数据将通过哈希算法被分配到不同的 mongos 实例中进行写入。
Parallel Replication(并行复制)
并行复制有三种选项,我们称之为“shad_key”:id、collection 和 auto。id 表示并发粒度是文档级别,而 collection 表示粒度是集合/表级别。auto 选项会根据是否存在任何集合的唯一索引来决定,如果存在唯一索引,则更改为集合级别,否则为 id 级别。
High Availability (高可用性)
Mongo-Shake 会定期将其上下文持久化到注册中心,默认情况下是源数据库。目前,上下文是检查点,它标记了成功重放操作日志的位置。同时支持超管机制,以便在 Mongo-Shake 崩溃时(根据配置中的 master_quorum)立即重启。
Filter (过滤)
支持使用白名单和黑名单过滤数据库和集合命名空间。
DDL Syncing (DDL 同步)
从 1.5 版本开始,MongoShake 支持使用全局屏障来同步 DDL。一旦获取到 DDL 操作日志,MongoShake 会添加一个屏障,使得所有后续的操作日志在队列中等待,直到这个操作日志被写入目标 MongoDB 或隧道,并且检查点被更新。目前,DDL 仅支持源端为副本集(目标端可以是副本集或分片集群),后续版本将支持分片。
Global ID (全局ID)
在阿里云内部版本中,支持全局 ID(也称为 gid),它标记了数据库的 ID。这可以用于避免两个数据库相互备份时产生的循环。Mongo-Shake 只获取与源数据库 ID 相等的操作日志,如果没有提供 gid,则会获取所有操作日志。对于当前的开源版本,由于 MongoDB 内核的修改限制,暂不支持此功能。
如果您想在不支持 gid 的情况下构建双主复制,请参阅常见问题文档以获取更多详细信息。
Tunnel (隧道)
如上所述,我们支持多种隧道类型,如:rpc、tcp、file、kafka、mock 和 direct。rpc 和 tcp 分别表示通过网络/rpc 和 TCP 同步连接到接收器;file 表示将输出写入文件;kafka 是一种异步发送消息的方式;mock 用于测试,会丢弃所有数据;direct 表示直接写入目标 MongoDB。用户还可以添加或修改当前的隧道类型。
我们提供了接收器来连接不同的隧道,如:rpc、tcp、file、mock 和 kafka。请参阅常见问题文档以获取更多详细信息。
Compressor (压缩)
在发送之前,批量操作日志支持 gzip、zlib、deflate 压缩。
Monitor & Debug (监控 &调试 )
用户可以通过 RESTful API 监控或调试 Mongo-Shake,请参阅常见问题文档以获取更多详细信息。
Other Details (其他细节)
Mongo-Shake 使用 go-driver 从源 MongoDB 获取给定配置时间戳之后的操作日志。然后,它根据白名单、黑名单和 gid 过滤操作日志。由于操作日志 DML 的幂等性,所有操作日志都将至少传输一次,这是可以接受的。我们使用 seq 和 ack 来确保数据包已被接收,这与 TCP 中的序列号和确认号类似。
操作日志在处理管道中被批量处理。
用户可以根据不同的环境调整工作线程并发度和执行器并发度。
如果您想查看更多详细信息,请参阅文章开头列出的详细文档。
Code branch rules (代码分支规则)
版本号规则:a.b.c
a:主版本号
b:次版本号。偶数表示稳定版本。例如,1.2.x、1.4.x、2.0.x 是稳定版本,而 1.5.x、2.1.x 则不是。
c:修补版本号
branch name | rules |
---|---|
master | master branch, do not allowed push code. store the latest stable version. |
develop(main branch) | develop branch. all the bellowing branches fork from this. |
feature-* | new feature branch. forked from develop branch and then merge back after finish developing, testing, and code review. |
bugfix-* | bugfix branch. forked from develop branch and then merge back after finish developing, testing, and code review. |
improve-* | improvement branch. forked from develop branch and then merge back after finish developing, testing, and code review. |
Usage (使用说明)
在OSX和Linux系统上,分别运行已构建的./bin/collector.darwin或collector.linux。
或者,你可以根据以下步骤自行构建mongo-shake(需要go版本>=1.15.10):
git clone https://github.com/alibaba/MongoShake.git
cd MongoShake
make
./bin/collector -conf=conf/collector.conf
请注意:用户必须先修改collector.conf以满足需求。您还可以使用"start.sh"脚本,但该脚本仅在Linux操作系统上支持虚拟化机制。
Shake series tool (Shake系列工具)
我们还提供了一些用于Shake系列同步的工具。
MongoShake:mongodb数据同步工具。
RedisShake:redis数据同步工具。
RedisFullCheck:redis数据同步验证工具。
安装
下载二进制
https://github.com/alibaba/MongoShake/releases
参考:GitHub - alibaba/MongoShake: MongoShake is a universal data replication platform based on MongoDB's oplog. Redundant replication and active-active replication are two most important functions. 基于mongodb oplog的集群复制工具,可以满足迁移和同步的需求,进一步实现灾备和多活功能。