-
Notifications
You must be signed in to change notification settings - Fork 444
使用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权限。 |
- 为达到最理想的同步性能,请确保源端MongoDB Serverless实例的网络类型为专有网络VPC,如果是经典网络,请切换成专有网络VPC。更多信息,请参见经典网络切换为专有网络。
- 创建作为同步目标端的MongoDB副本集实例或分片集群实例,在创建的时候请选择与源端MongoDB Serverless实例相同的专有网络VPC,以获取最低的网络延迟。更多信息,请参见创建副本集实例或创建分片集群实例。
- 如果目标端为分片集群实例,您需要为目标端数据库开启分片功能并对集合设置片键(shardkey),设置方法请参见设置数据分片以充分利用Shard性能。
- 创建用于运行MongoShake的ECS实例,在创建的时候请选择与源端MongoDB Serverless实例相同的专有网络VPC,以获取最低的网络延迟。更多信息,请参见创建ECS实例。
- 将ECS的内网IP地址加入至源端和目标端MongoDB实例的白名单中,并确保ECS可以连接源端和目标端MongoDB实例。 更多信息,请参见设置白名单。
下面以使用私网登录ECS服务器(Alibaba Cloud Linux操作系统)为例介绍迁移步骤。
- 登录ECS实例,具体方法请参见通过密码或密钥认证登录Linux实例。
- 执行如下命令,下载最新版本的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
- 执行如下命令,进入collector.conf所在目录。
cd 配置文件collector.conf所在目录
示例:
cd mongo-shake-v2.6.4
- 执行如下命令,修改MongoShake的配置文件collector.conf。
vi collector.conf
- 进入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。
- 执行如下命令,启动迁移任务。
./collector.linux -conf=collector.conf &
由于MongoDB Serverless实例受到读写吞吐量CU的限制,迁移速度较慢,请您耐心等待。 7. 执行如下命令,进入日志文件collector.log所在目录。查看日志信息。
cd logs
- 执行如下命令,查看日志信息。
vi collector.log
当日志信息中出现如下信息时,说明全量数据迁移已完成。 如果您开启了增量迁移,说明全量数据迁移已完成并进入增量迁移模式。
[2021/04/30 14:20:38 CST] [INFO] ------------------------full sync done!------------------------
查看完成后,按Esc键,输入:q并按Enter。
- 查看增量数据是否完成迁移。 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 | 源端名称。 |