MongoDB数据库迁移(复制集集群迁移)

数据库(复制集)迁移

@(MongoDB)[复制集|迁移|]


前言:

有时候由于业务或者其他因素的原因,我们需要将生产环境(复制集)中的数据库迁移到新服务器上,也有可能是异地机房,且宕机时间不允许太长;下面针对这个需求我们做一下测试。我认为5分钟即可完成迁移;

准备

  • 3台新机器
    • 10.26.231.107:37027
    • 10.26.231.108:37027
    • 10.26.231.109:37027
  • mongo3.4安装包

架构图说明

  • 添加新节点到原复制集
  • 同步数据保证数据一致
  • 集群中移除新节点
  • 组建新集群
    这里写图片描述
    这里写图片描述

步骤:

1、部署新节点

1.1 创建相应路径

根据需要创建相应文件(数据文件,日志文件,进程目录,认证文件…),这里就不再赘述了,如果实在不明白可以看我的其他文章。

1.2 修改启动文件

从原复制集拷贝一份启动文件,按需修改即可(修改相应目录等)

1.3 复制数据文件

登录原复制集Secondary节点上,锁库

SECONDARY>db.fsyncLock()

开启另一个session,拷贝--dbpath下的所有文件到新节点

$cd /data/dbdata
$ scp -r ./* mongo@10.26.231.107:/data/dbdata/

解锁Secondary节点

SECONDARY>db.fsyncUnlock()
1.4 启动新节点

以拷贝来的数据文件启动新节点

/apps/mongodb/bin/mongod -f /etc/mongodbtestrs1.cnf

此时,若登录到节点上,执行rs.status()会提示报错,因为此节点没有加入到任何集群中,报错如下:
这里写图片描述

2、加入集群中

连接到原集群的Primary节点上,执行如下命令将新节点加入副本集中

rs1:PRIMARY> rs.add("10.26.231.107:37027")
{ "ok" : 1 }

3、检查数据同步状态

此时查看集群状态,会发现新节点状态为STARTUP2,表示正在进行数据同步,待stateStr为如下状态时,即表示数据一致:

"stateStr" : "SECONDARY",

4、切断新节点

4.1 创建临时数据

通知应用端停止写入数据,此时通过生成一个临时集合来检查数据是否已同步完成

rs1:#PRIMARY> db.tmp.find()
rs1:PRIMARY> db.tmp.insert({task:"ForTest",cdate:new Date()})
WriteResult({ "nInserted" : 1 })
4.2 验证数据

登录新的从节点查看是否同步完成

rs1:SECONDARY> use Johnny
switched to db Johnny
rs1:SECONDARY> db
Johnny
rs1:SECONDARY> db.tmp.find()
Error: error: {
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",          
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
}
rs1:SECONDARY> rs.slaveOk()               ---报上述错误,使用此命令解决,默认secondary不提供读
rs1:SECONDARY> db.tmp.find()
{ "_id" : ObjectId("5a53238a0a2b209188596c9a"), "task" : "ForTest", "cdate" : ISODate("2018-01-08T07:53:46.121Z") }
4.3 移除新节点

此时我们可放心进行移除操作,先锁从库(10.26.231.107上执行),防止又有新数据写入导致数据不一致,不过应该不会发生此种情况。

rs1:SECONDARY> db.fsyncLock()

将节点从原复制集架构中移除(Primary上执行)

rs1:PRIMARY> rs.remove("10.26.231.107:37027")
{ "ok" : 1 }

解锁从库

>db.fsyncUnlock()          ---被移除后,此时新节点的mongo shell提示符会只有一个大于号

5、部署新复制集

5.1 启动其余节点

以如下方式启动其他两个新节点(108, 109),这里就不再赘述如何配置如何启动了(与上述新节点一样配置即可)

$ /apps/mongodb/bin/mongod -f /etc/mongodbtestrs1.cnf
5.2 配置新复制集

重新连接此新节点(10.26.231.107)
:一定要以root角色登录,否则再进行新副本集配置的时候将报错

$ mongo 10.26.231.107:37027admin -uroot -p

重新设定新复制集配置信息

>config={_id:"rs1",members:[
{_id:0,host:"10.26.231.107:37027",priority:99},
{_id:1,host:"10.26.231.108:37027",priority:1},
{_id:2,host:"10.26.231.109:37027",priority:0,hidden:true,slaveDelay:3600}
]}
>rs.reconfig(config,{force:true})        ---重置新配置,force:在没有Primary时强制生效配置
>rs.conf()                         ---查看配置信息

6、检查集群状态

rs1.PRIMARY>rs.status(),执行此命令以查看集群状态;生效后,mongo shell提示符将变更为PRIMARY>,且可通过此命令查看其他节点应该是STARTUP2状态,即同步数据中

总结:

至此,我们的复制集迁移就成功了,如果是异地机房迁移,在启动新节点时一定要提前把原复制集的数据文件拷贝过来再启动,这样可以省很多同步数据的时间;在使用rs.reconfig()命令重置架构配置时一定要把原节点IP都替换或者清楚掉,否则会把原复制集中的节点牵扯进来,从而导致原复制集崩溃(因为我遇到了);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值