Skip to content

使用MongoShake将Serverless数据迁移至副本集或分片集群实例

zhangst edited this page Mar 24, 2023 · 1 revision

通过阿里云自主研发的MongoShake开源工具,您可以实现MongoDB数据库间数据的迁移与同步。本文介绍使用MongoShake迁移MongoDB Serverless实例中的数据至MongoDB副本集实例或分片集群实例的方法。

影响

  • 迁移任务会消耗源端的部分读写吞吐量CU。关于读写吞吐量CU的更多信息,请参见读写吞吐量CU
  • 迁移过程中对源端进行读取或写入操作,可能会出现读取或写入不响应的现象。

数据库账号的权限要求

实例 权限
源端MongoDB Serverless实例 readWrite权限。
目标端MongoDB副本集实例或分片集群实例 readWrite权限。

准备工作

  1. 为达到最理想的同步性能,请确保源端MongoDB Serverless实例的网络类型为专有网络VPC,如果是经典网络,请切换成专有网络VPC。更多信息,请参见经典网络切换为专有网络
  2. 创建作为同步目标端的MongoDB副本集实例或分片集群实例,在创建的时候请选择与源端MongoDB Serverless实例相同的专有网络VPC,以获取最低的网络延迟。更多信息,请参见创建副本集实例创建分片集群实例
  3. 创建用于运行MongoShake的ECS实例,在创建的时候请选择与源端MongoDB Serverless实例相同的专有网络VPC,以获取最低的网络延迟。更多信息,请参见创建ECS实例
  4. 将ECS的内网IP地址加入至源端和目标端MongoDB实例的白名单中,并确保ECS可以连接源端和目标端MongoDB实例。 更多信息,请参见设置白名单
    • 如果您没有达到上述网络类型的要求,可以分别申请源端和目标端MongoDB实例的公网连接地址,并将ECS的公网地址加入至源端和目标端MongoDB实例的白名单中,通过公网地址进行同步操作。更多信息,请参见申请公网连接地址设置白名单

操作步骤

下面以使用私网登录ECS服务器(Alibaba Cloud Linux操作系统)为例介绍迁移步骤。

  1. 登录ECS实例,具体方法请参见通过密码或密钥认证登录Linux实例
  2. 执行如下命令,下载最新版本的MongoShake程序。
wget 最新版本MongoShake包下载地址

示例:

wget https://github.com/alibaba/MongoShake/releases/download/release-v2.6.4-20210414/mongo-shake-v2.6.4_2.tar.gz
示例提供的下载地址是MongoShake 2.6.4_2版本

执行如下命令,解压MongoShake程序。

tar xvf mongoshake包文件名

示例:

tar xvf mongo-shake-v2.6.4_2.tar.gz
  1. 执行如下命令,进入collector.conf所在目录。
cd 配置文件collector.conf所在目录

示例:

cd mongo-shake-v2.6.4
  1. 执行如下命令,修改MongoShake的配置文件collector.conf。
vi collector.conf
  1. 进入vi编辑器后,输入i。根据业务需求,参考配置文件中的字段说明修改对应字段的值。

关于配置文件中的如下字段,建议您按照以下内容进行配置。

参数 说明 示例
sync_mode 数据同步的方式,默认值为incr,请配置为all。all:执行全量数据同步和增量数据同步。full:仅执行全量数据同步。incr:仅执行增量数据同步。 sync_mode = all
mongo_urls 源端MongoDB ServerLess实例的ConnectionStringURI格式连接地址。
建议通过专有网络地址进行互连,以获取最低的网络延迟。关于ConnectionStringURI格式详情请参见Serverless实例连接说明。
mongo_urls = mongodb://user46436397:********@dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717/admin
密码中不得包含艾特(@)字符,否则会导致连接失败。
tunnel.address 目标端MongoDB实例的ConnectionStringURI格式连接地址。
建议通过专有网络地址进行互连,以获取最低的网络延迟。关于ConnectionStringURI格式详情请参见副本集实例连接说明或分片集群实例连接说明。
tunnel.address = mongodb://root:****@dds-bpxxxxxxx.mongodb.rds.aliyuncs.com:3717,dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-xxxxxx
密码中不得包含艾特(@)字符,否则会导致连接失败。
filter.ddl_enable 是否开启DDL同步,默认值为false,请配置为true。true:开启false:关闭 filter.ddl_enable = true
full_sync.reader.collection_parallel 设置MongoShake单次最多并发拉取多少个集合,默认值为6,请配置为1。 full_sync.reader.collection_parallel = 1
full_sync.reader.write_document_parallel 设置MongoShake对单个集合写入的并发线程数,默认值为8,请配置为4。 full_sync.reader.write_document_parallel = 4
full_sync.create_index 完成同步后是否创建索引,请配置为foreground。foreground:创建前台索引background:创建后台索引none:不创建索引 full_sync.create_index = foreground
incr_sync.mongo_fetch_method 配置数据库的拉取方法,默认值为oplog,请配置为change_stream。oplog:从源端中拉取oplog。change_stream:从源端中拉取change事件(仅支持MongoDB 4.0及以上版本,对于部分DDL的同步,仅支持库表的创建、删除和重命名)。 incr_sync.mongo_fetch_method = change_stream
special.source.db.flag 特殊形态支持。请配置为aliyun_serverless。 special.source.db.flag = aliyun_serverless

修改完成后,按Esc键,输入:wq!并按Enter。

  1. 执行如下命令,启动迁移任务。
./collector.linux -conf=collector.conf &

由于MongoDB Serverless实例受到读写吞吐量CU的限制,迁移速度较慢,请您耐心等待。 7. 执行如下命令,进入日志文件collector.log所在目录。查看日志信息。

cd logs
  1. 执行如下命令,查看日志信息。
vi collector.log

当日志信息中出现如下信息时,说明全量数据迁移已完成。 如果您开启了增量迁移,说明全量数据迁移已完成并进入增量迁移模式。

[2021/04/30 14:20:38 CST] [INFO] ------------------------full sync done!------------------------

查看完成后,按Esc键,输入:q并按Enter。

  1. 查看增量数据是否完成迁移。 a. 执行如下命令,进入MongoShake程序的安装目录。
cd MongoShake程序的安装目录

示例:

cd mongo-shake-v2.6.4
b. 执行如下命令,查看lsn_ckpt和now的time值。
curl -s http://127.0.0.1:9100/repl | python -m json.tool

回显类似如下信息,部分参数说明请参见字段说明

{
    "log_size_avg": "320.00B",
    "log_size_max": "332.00B",
    "logs_get": 5,
    "logs_repl": 5,
    "logs_success": 5,
    "lsn": {
        "time": "2021-05-21 14:18:37",
        "ts": "6964624121430802437",
        "unix": 1621577917
    },
    "lsn_ack": {
        "time": "2021-05-21 14:18:37",
        "ts": "6964624121430802437",
        "unix": 1621577917
    },
    "lsn_ckpt": {
        "time": "2021-05-21 14:19:19",
        "ts": "0",
        "unix": 0
    },
    "now": {
        "time": "2021-05-21 14:19:19",
        "unix": 1621577959
    },
    "replset": "default-0",
    "tag": "$",
    "tps": 0,
    "who": "mongoshake"
}

当lsn_ckpt和now的time值基本相同时,说明增量数据迁移已完成。

字段说明

字段 字段说明
logs_get 拉取的oplog总数。
logs_repl 尝试写入目标库的oplog总数。
logs_success 成功写入目标库的oplog总数。
lsn 拉取数据的Checkpoint时间,即初始时间,当前没有数据写入。
lsn_ack 成功写入目标库的Checkpoint时间,该时间会随着数据写入变化。
lsn_ckpt 成功写入目标库的Checkpoint时间,该时间已经稳定持久。
now 当前时间。
replset 源端名称。
Clone this wiki locally