mongodb复制集节点替换实践【避坑指南】
注意:大家首先要明白你的需求是什么,然后对照做一些处理,下面是我的一些替换经验。
需求
这是我原来挂载节点时的配置
config = {
"_id" : "rs0",
"members": [
{ "_id" : 0, "host" : "127.0.0.1:27017" },
{ "_id" : 1, "host" : "127.0.0.1:27018" },
{ "_id" : 2, "host" : "127.0.0.1:27019" }
]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
现在我需要将节点替换成下面
config = {
"_id" : "rs0",
"members": [
{ "_id" : 0, "host" : "192.168.1.53:27017" },
{ "_id" : 1, "host" : "192.168.1.53:27018" },
{ "_id" : 2, "host" : "192.168.1.53:27019" }
]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
别问我为什么替换,都是坑,给你我的这一篇文章参考:mongodb踩坑:复制集(尤其是单台服务器多个mongo服务的)服务节点挂载问题
首先我们看一下官网上复制集选举主节点的一段描述,记住这段描述,接下来有用(已经将英文翻译成了中文):
如果复制集是由三个节点组成的,且三个节点均可投票,只要其中两个节点能够互相沟通那么复制集就能选举出新的主节点。如果有两个节点不可用了,那么剩下的节点将为 从节点 ,因为它不能与复制集中多数节点进行沟通。 如果两个从节点不可用了,剩下的 主节点 将降职为从节点。
首先我们来看一下官方的更新方法:
我们可以通过下列命令来将复制集的 members[0]节点的主机名修改为
mongo2.example.net :
cfg = rs.conf()
cfg.members[0].host = "mongo2.example.net"
rs.reconfig(cfg)
- 1
- 2
- 3
注意:上面操作是在主节点primary下执行的,从节点执行会报没权限的错误。
按照此操作了以后结果却不尽如人意!报了下面的错误:
{
"ok" : 0.0,
"errmsg" : "Either all host names in a replica set configuration must be localhost references, or none must be; found 2 out of 3",
"code" : 103,
"codeName" : "NewReplicaSetConfigurationIncompatible"
}
- 1
- 2
- 3
- 4
- 5
- 6
问答解疑
1、其实在这之前少了一些东西,只有在当前复制集rs0只有主节点时才能执行上面的操作,如何只有一个主节点呢?
答:当然是将从节点从复制集中删除。
2、那删除是否要关闭从节点的mongo服务呢?
答:我们来关一下试试,关了另外两个后,再到连接上刚才的主节点mongo服务。咦!怎么刚才的主节点变成从节点了。是不是想起什么来了,刚才记那段描述是什么来着!如果两个从节点不可用了,剩下的主节点将降职为从节点,哈哈中招了!所以不要急着关掉mongo服务,为什么我想到要关掉服务呢!同样是官网中移除复制集节点这个文档下面处理方法第一条 1.关闭我们想要移除的 mongod 实例,可以通过在 mongo 的窗口中执行 db.shutdownServer() 来关闭。所以由此可以想一下你在读官方文档的时候一定要遵循开头的注意,明白你的需求,然后有针对性的解决问题。
正确的步骤
注意:不需要去关闭从节点的服务
1、删除集群其它非主节点(27017目前是主节点)
rs.remove('127.0.0.1:27018')
rs.remove('127.0.0.1:27019')
- 1
- 2
2、更改主节点的host
conf=rs.conf()
conf.members[0].host='192.168.1.53:27017'
rs.reconfig(conf)
- 1
- 2
- 3
3、添加集群另外的两个子节点
rs.add({_id:1,host:'192.168.1.53:27018',priority:1})
rs.add({_id:2,host:'192.168.1.53:27019',priority:1})
- 1
- 2
是不是很简单,但是请注意,如果你的主节点有很多数据,然后新挂上的从节点是一个新的mongo服务,则会进行数据同步,这时候你的新挂上的的节点的状态是STARTUP2,当数据同步完成,正式成为复制集的一部分时才会显示SECONDARY,这个状态可以用
rs.status()
- 1
命令查看,信息显示在members下的stateStr。
扩展
如果我们是线上的数据没有办法一下子停止节点的使用,这时就需要继续挂载多个mongo节点,然后等待数据同步。在数据同步结束后再将原来不需要的节点移除。
如果帮助了你,希望可以点赞、评论,你的点赞与评论是我最大的创作动力!
文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Chenftli/article/details/108380006
- 点赞
- 收藏
- 关注作者
评论(0)