#mongo-db #nosql #database

nightly bin+lib mongo_sync

通过命令行提供即时编码答案(就像 howdoi 一样)

1 个不稳定版本

0.1.0 2021 年 10 月 8 日

#555 in 并发

GPL-3.0 许可证

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 提供了两个基本程序

  1. oplog 同步器:将 mongodb 集群的 oplog 同步到目标 oplog 存储数据库
  2. 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、数据库命令),这也是为什么源数据库必须是集群的原因。

注意事项

  1. 在增量状态下,目前它仅支持以下命令进行同步(这对我来说已经足够了。)
  • 重命名集合
  • 删除集合
  • 创建集合
  • 删除索引
  • 创建索引
  1. 我没有测试将 mongo 分片作为目标,但它应该可以正常工作。
  2. 在运行 oplog_syncer 时,oplog 存储数据库 将创建并使用名为 source_oplog 的数据库,并创建并使用名为 source_oplog 的集合。目前这是硬编码的。
  3. 在运行 db_sync 时,目标数据库将创建一个新的集合名为 oplog_records,它保存应用到数据库的最新 oplog 时间戳。

依赖项

~27–39MB
~724K SLoC