mongodb复制集节点替换实践【避坑指南】

tech2023-01-08  102

注意:大家首先要明白你的需求是什么,然后对照做一些处理,下面是我的一些替换经验。

需求

这是我原来挂载节点时的配置

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" } ] }

现在我需要将节点替换成下面

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" } ] }

别问我为什么替换,都是坑,给你我的这一篇文章参考:mongodb踩坑:复制集(尤其是单台服务器多个mongo服务的)服务节点挂载问题

首先我们看一下官网上复制集选举主节点的一段描述,记住这段描述,接下来有用(已经将英文翻译成了中文):

如果复制集是由三个节点组成的,且三个节点均可投票,只要其中两个节点能够互相沟通那么复制集就能选举出新的主节点。如果有两个节点不可用了,那么剩下的节点将为 从节点 ,因为它不能与复制集中多数节点进行沟通。 如果两个从节点不可用了,剩下的 主节点 将降职为从节点。

首先我们来看一下官方的更新方法:

我们可以通过下列命令来将复制集的 members[0]节点的主机名修改为mongo2.example.net :

cfg = rs.conf() cfg.members[0].host = "mongo2.example.net" rs.reconfig(cfg)

注意:上面操作是在主节点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、其实在这之前少了一些东西,只有在当前复制集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')

2、更改主节点的host

conf=rs.conf() conf.members[0].host='192.168.1.53:27017' rs.reconfig(conf)

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})

是不是很简单,但是请注意,如果你的主节点有很多数据,然后新挂上的从节点是一个新的mongo服务,则会进行数据同步,这时候你的新挂上的的节点的状态是STARTUP2,当数据同步完成,正式成为复制集的一部分时才会显示SECONDARY,这个状态可以用

rs.status()

命令查看,信息显示在members下的stateStr。

扩展

如果我们是线上的数据没有办法一下子停止节点的使用,这时就需要继续挂载多个mongo节点,然后等待数据同步。在数据同步结束后再将原来不需要的节点移除。

如果帮助了你,希望可以点赞、评论,你的点赞与评论是我最大的创作动力!

最新回复(0)