背景:阿里云上一套环境需要迁移到华为云,包含有Mongodb组件,需保持数据同步。
操作思路:
1、在华为云的云环境上搭建一套完全一致的环境;
2、通过mongoshake工具实现两套环境的Mongodb数据同步;
3、将相关需要访问该环境的客户迁移至新环境;
该文档仅记录mongoshake部分
操作系统版本:Centos7.3
Mongodb版本:mongoDB 4.2 (最稳定的版本),集群方式:副本集(Replica Set)
Mongoshake版本:mongo-shake-v2.6.5.tar.gz
上传mongo-shake-v2.6.5.tar.gz
至阿里云mongodb主机/opt/src
目录下
解压mongo-shake压缩包
tar -zxvf mongo-shake-v2.6.5.tar.gz -C /opt/
cd /opt/mongo-shake-v2.6.5
修改配置文件collector.conf
#修改增量同步写的线程数
incr_sync.tunnel.write_thread = 8
#表示进行全量和增加同步,程序会先进行全量同步,然后进行增量同步
sync_mode = all
#源端mongodb地址,配置阿里云mongodb局域网地址:mongodb://root:[email protected]:20040,127.0.0.1:20041
mongo_urls = mongodb://username:[email protected]:20040,127.0.0.1:20041
#目的端mongodb地址,配置华为云mongodb公网访问地址
tunnel.address = mongodb://username:[email protected]:20042,127.0.0.1:20043
#LURL_INFO这张表不需要同步,注意shorturl-dev为源数据库名,该参数是可选项
filter.namespace.black = shorturl-dev.LURL_INFO
filter.ddl_enable = true
full_sync.collection_exist_drop = false
full_sync.create_index = background
full_sync.executor.insert_on_dup_update = true
incr_sync.executor.insert_on_dup_update = true
以上配置项,找到对应的配置项修改即可
[注意事项]
局域网环境,按上面配置即可正常启动;公网环境同步,需要考虑以下几点(以本次案例参考):
1、需将华为云mongodb集群的两个服务端口(默认27017)开放到公网;
2、需将阿里云mongodb的出网IP,以白名单的方式分别添加至华为云两台mongodb的公网访问条目下,虽然是临时迁移使用,但也要考虑安全性;
3、需要将华为云mongodb的集群配置信息,以公网访问的方式配置,待同步完成后,再调整为局域网访问,文末附详细调整方法。
4、数据同步完成后,关停华为云mongodb的公网访问信息,相关白名单信息也需要踢除。
配置完成后,开始启动同步
nohup ./collector.linux -conf=./collector.conf &
最后检查同步情况:
确定程序是否还在运行: ps -ef |grep collector.linux
同步日志文件为:logs/collector.log
查看监控日志:
配置文件有如下配置:
full_sync.http_port = 9101
incr_sync.http_port = 9100
这两项表示全量同步和增量同步的监控端口,可以使用mongoshake-stat工具查看
./mongoshake-stat --port 9100
./mongoshake-stat --port 9100
lsn_ckpt.time表示最近一次增量同步的时间,可以通过这个时间来判断是否在增量同步
./mongoshake-stat --port 9101
查看logs/collector.log日志确定全量同步和增量同步情况
如图中红框所示表示全量同步完成,然后开始增量同步。
附:临时调整mongodb的集群配置信息方法
#先用命令访问mongodb主节点
[root@mongodb-0001 bin]# ./mongo --username root --password 123456 --host 192.168.0.230 --port 27017
################查看当前集群信息,记录,后期恢复还原使用###############
rs0:PRIMARY> rs.status()
{
== ....此处省略一万字..........==
"members" : [
{
"_id" : 0,
"name" : "192.168.0.230:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
== ....此处省略一万字..........==
},
{
"_id" : 1,
"name" : "192.168.0.231:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
== ....此处省略一万字..........==
}
################切换至admin################
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> config=rs.conf()
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.0.230:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
== ....此处省略一万字..........==
},
{
"_id" : 1,
"host" : "192.168.0.231:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
== ....此处省略一万字..........==
}
##修改集群信息,配置mongodb对应的公网地址和端口,[0] [1]对应上面的"_id"
rs0:PRIMARY> config.members[0].host = "111.999.767.222:27017"
111.999.767.222:27017
rs0:PRIMARY> config.members[1].host = "111.999.767.223:27017"
111.999.767.223:27017
rs0:PRIMARY> rs.reconfig(config,{force:true})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1634635467, 14923),
"signature" : {
"hash" : BinData(0,"RU3XA3PqgGCXf5h+S2FkwMBSjvU="),
"keyId" : NumberLong("7008812587513020419")
}
},
"operationTime" : Timestamp(1634635467, 14923)
}
###查看修改后的集群信息
rs0:PRIMARY> rs.status()
{
"members" : [
{
"_id" : 0,
"name" : "111.999.767.222:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
},
{
"_id" : 1,
"name" : "111.999.767.223:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
}
rs0:PRIMARY> exit