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

举报
橙子园 发表于 2022/05/25 23:28:19 2022/05/25
【摘要】 注意:大家首先要明白你的需求是什么,然后对照做一些处理,下面是我的一些替换经验。 需求 这是我原来挂载节点时的配置 config = { "_id" : "rs0", "members": [ ...

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

需求

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

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。