1 个不稳定版本
0.1.0 | 2021 年 10 月 8 日 |
---|
#555 in 并发
88KB
1.5K SLoC
mongo_sync
Mongodb 实时同步器,类似于 py-mongo-sync
功能
- 支持数据库级别和集合的完全和并发同步。您可以使用
--collection-concurrent
定义同步数据库的线程数,使用--doc-concurrent
定义同步集合的线程数。 - 支持基于 oplog 的同步,因此我们可以实时同步增量数据。
- 支持每日轮转日志,您可以通过
--log-path
选项使用它。否则,日志信息将输出到 stdout。
支持
Mongodb 3.6+(因为官方 mongodb 驱动程序仅支持 mongodb 3.6+)
安装
安装 mongo_sync 的推荐方法是使用 cargo
cargo +nightly install mongo_sync
您也可以下载 发布二进制文件。
运行测试吗?
要运行集成测试,您需要将 SYNCER_TEST_SOURCE
配置为测试 mongodb uri,或者将使用 mongodb://127.0.0.1:27017
。
示例
要运行同步器,您需要先启动 oplog_syncer 以进行实时 mongodb oplog 同步。
然后,您可以运行 db_sync
以实时同步数据库。
oplog_syncer
./target/release/oplog_syncer --src-uri "mongodb://127.0.0.1:27017" --oplog-storage-uri "mongodb://127.0.0.1:27018/"
db_sync
db_sync --src-uri "mongodb://127.0.0.1:27017/?authSource=admin" --oplog-storage-uri "mongodb://127.0.0.1:27018/?authSource=admin" --target-uri "mongodb://127.0.0.1:27019" --db test_db
请注意,oplog_syncer 和 db_sync 中的 --oplog-storage-uri
必须相同。
使用帮助
oplog_syncer
USAGE:
oplog_syncer [OPTIONS] --src-uri <src-uri> --oplog-storage-uri <oplog-storage-uri>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
--log-path <log-path>
log file path, if not specified, all log information will be output to stdout
-o, --oplog-storage-uri <oplog-storage-uri> target oplog storage uri
-s, --src-uri <src-uri> source database uri, must be a mongodb cluster
db_sync
USAGE:
db_sync [OPTIONS] --src-uri <src-uri> --target-uri <target-uri> --oplog-storage-uri <oplog-storage-uri> --db <db>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
--collection-concurrent <collection-concurrent> how many threads to sync a database
-c, --colls <colls>...
collections to sync, default sync all collections inside a database
-d, --db <db> database to sync
--doc-concurrent <doc-concurrent> how many threads to sync a collection
--log-path <log-path>
log file path, if no specified, all log information will be output to stdout
-o, --oplog-storage-uri <oplog-storage-uri>
mongodb uri which save oplogs, it's saved by `oplog_syncer` binary
-s, --src-uri <src-uri> source mongodb uri
-t, --target-uri <target-uri> target mongodb uri
基本架构图
┌───────────────┐
│ target db │
└───┬───────────┘
│
xxxx ▼ xxxxxxx
xx ┌───────┐ x
xx │db_sync│
x └───────┘ x
xxxxxx ▲ ▲ x
xx │ │ xxxx
│ │
│ │
Full dump │ │Incr dump
│ │(Real time)
│ │
│ │
│ │
│ │ ┌─────────────────────┐
│ └─────────┤oplog storage db │
│ └──────▲──────────────┘
│ xxxxxxx │ xxxxx
│ x ┌──────┴──────┐x
│ x │Oplog syncer │x Sync oplog from source cluster
│ x └──────▲──────┘x to oplog storage in real time
│ xxxxxxxxx│ xxxxxxx
│ │
│ │
│ │
│ ┌──────┴───────┐
└────────────┤Source cluster│
└──────────────┘
根据图示,您会发现 mongo_sync 提供了两个基本程序
- oplog 同步器:将 mongodb 集群的 oplog 同步到目标
oplog 存储数据库
。 - db 同步:将数据从
源集群
同步到目标数据库
。
基准测试
这不是严格的基准测试,我只是手动测试了一下。
场景
当源集群插入 50,000 条记录时,目标数据库同步这些新 50,000 条插入需要多长时间。
我的测试结果
db_sync
大约需要 50 秒来同步这些更新,而 py-mongo-sync
大约需要 225 秒来同步这些更新。总的来说,它比 py-mongo-sync
快大约 3.5 倍。
请注意,50 秒
并不准确,这高度依赖于您的数据库和运行机的性能。
核心是如何工作的?
- oplog_syncer 只使用 可移动游标 来实时读取 mongodb oplogs。
- db_sync 全量导出仅使用多线程和 find 来读取数据。
- db_sync 增量导出使用 oplog 来同步增量更新(CRUD、数据库命令),这也是为什么源数据库必须是集群的原因。
注意事项
- 在增量状态下,目前它仅支持以下命令进行同步(这对我来说已经足够了。)
- 重命名集合
- 删除集合
- 创建集合
- 删除索引
- 创建索引
- 我没有测试将 mongo 分片作为目标,但它应该可以正常工作。
- 在运行
oplog_syncer
时,oplog 存储数据库
将创建并使用名为source_oplog
的数据库,并创建并使用名为source_oplog
的集合。目前这是硬编码的。 - 在运行
db_sync
时,目标数据库将创建一个新的集合名为oplog_records
,它保存应用到数据库的最新 oplog 时间戳。
依赖项
~27–39MB
~724K SLoC