mongodb踩坑:复制集(尤其是单台服务器多个mongo服务的)服务节点挂载问题

举报
橙子园 发表于 2022/05/26 01:15:35 2022/05/26
【摘要】 如果帮助了你,希望可以点赞、评论,你的点赞与评论是我最大的创作动力! 问题 我在一台服务器上开了3个mongo服务组成一个mongo的复制集,这也是网上常见的教授搭建复制集的方式。然后我再另一台服...

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

在这里插入图片描述

问题

我在一台服务器上开了3个mongo服务组成一个mongo的复制集,这也是网上常见的教授搭建复制集的方式。然后我再另一台服务器上跑程序连接mongo复制集的时候,却死活不行。就是报这个错误!
我就郁闷了我是连接的192.168.1.53这个服务器的地址,怎么报错显示死活要连接我本地的mongo呢!为此我debug了很久都没找到原因,缓缓吧!一周后我恍然大悟,原来是当初搭建复制集的时候,挂载配置host的问题。
下面是报错:

pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:27019: [WinError 10061] 由于目标计算机积极拒绝,无法连接。,127.0.0.1:27018: [WinError 10061] 由于目标计算机积极拒绝,无法连接。, Timeout: 30s, Topology Description: <TopologyDescription id: 5f4de49d2be4dd66f0ebc6be, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription (‘127.0.0.1’, 27018) server_type: Unknown, rtt: None, error=AutoReconnect(‘127.0.0.1:27018: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’)>, <ServerDescription (‘127.0.0.1’, 27019) server_type: Unknown, rtt: None, error=AutoReconnect(‘127.0.0.1:27019: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’)>]>

原因

大家来看网上经常见的一个演示mongo复制集挂载的一个配置,通常大家会在一个服务器开启三个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" }
	]
}
rs.initiate(config)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这台服务器上连接mongodb复制集当然没有问题,但是在其他服务器上使用uri连接复制集时,会出现上面的错误。下面是我的uri

mongodb://myadmin:password@192.168.1.53:27017,192.168.1.53:27018,192.168.1.53:27019/source_data/?replicaSet=rs0

  
 
  • 1

别问我为什么使用uri这样连接复制集,这样做是因为:如果你连接单一mongo服务的话,复制集的primary节点会由于重新选举而切换,你连接的mongo节点也随之降级为secondary,这是你的数据库操作就失效了,所以千万不要直接连接复制集的主节点primary,使用下面uri连接的这种方式,可以连接到复制集,而且也不用担心的primary切换会影响对数据库的操作。

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

  
 
  • 1

仔细想想uri是如何能使其连上复制集的呢?其实大概是这样的,先将uri的各个参数解析,然后连接每个host:port,直到连接到rs0复制集的主节点primary,该节点返回rs0复制集节点的members信息,此时如果要操作数据库的数据时,是根据members的信息来连接到当前的primary执行数据操作(大概就是这个流程,具体的实现肯定要复杂很多)。问题就在这一步,来看我们当初挂载复制集节点时的members信息

"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

是不是想起了什么,是127.0.0.1啊!再看报错

pymongo.errors.ServerSelectionTimeoutError: 127.0.0.1:27019: [WinError 10061] 由于目标计算机积极拒绝,无法连接。,127.0.0.1:27018: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

这才使得连接数据库的程序,一直去连接本地数据库。就问你坑不坑,果然你只有更深入的了解了它的机制才能分析出到底是什么原因导致的错误。

解决

原因已经找到了,接下来就需要解决了。首先避免这种事情的发生,在搭建复制集时不要再使用网上的127.0.0.1了,即使你是再一台服务器上开三个mongo服务,也请把host参数写成服务器的地址或者hostname,例如本文我使用的192.168.1.53,
如果事情已经发生,就像我,此mongo服务还一直在使用,我也是心很累。请看我另一篇:mongodb复制集节点替换实践【避坑指南】

文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Chenftli/article/details/108340001

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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