MongoDb复制副本集在主IP关闭时,辅助IP上出现写入问题

u59ebvdq  于 2023-01-15  发布在  Go
关注(0)|答案(2)|浏览(137)

我使用三个节点作为MongoDB副本集,一个作为主节点,一个作为次节点,一个作为仲裁节点。我在Golang中使用下面的连接字符串与MongoDB连接。

opts = options.Client().ApplyURI("mongodb://" + ipPort + "," + secIpPort + "/?replicaSet=" + repSetName).SetConnectTimeout(5 * time.Second).SetAuth(serverAuth).SetWriteConcern(writeconcern.New(writeconcern.WMajority()))

用于建立连接的IP地址为:ipPort = www.example.com secipPort = www.example.com 192.168.1.237 secipPort= 192.168.1.239
我已将默认RW关注点设置如下,

db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : "majority", "j":true, "wtimeout" : 5000 }, writeConcern: { "w" : "majority", "j":true, "wtimeout" : 5000 }, })

问题:
当第一个IP(192.168.1.237)的MongoDb服务关闭时,第二个IP(192.168.1.239)可以很好的执行所有的读操作,但是写操作不能执行,如何处理这个问题呢?如果第一个IP关闭了,第二个IP/node应该可以执行读和写操作。
我该如何处理这个问题?如果连接字符串的第一个IP出现故障,第二个IP/node应该能够执行读和写操作。

nx7onnlm

nx7onnlm1#

原因是writeConcern: { w: "majority" }
在MongoDB中,你有两个多数。投票多数和写入多数。你可以用rs.status()询问它们
在主要-次要-仲裁(PSA)副本集中,它应如下所示:

"majorityVoteCount" : 2
"writeMajorityCount" : 2
"votingMembersCount" : 3
"writableVotingMembersCount" : 2

如果次级选举失败,那么你有2个投票成员,他们是多数。他们仍然可以选出一个新的初级选举。
然而,只剩下1个写入成员,2个中的1个不是多数。因此,除非丢失的成员再次回来,否则不可能用{ w: "majority" }操作。
一些背景信息可以在这里找到:MongoClient连接到多个主机以处理故障转移?

vddsk6oq

vddsk6oq2#

当MongoDB副本集的主节点关闭时,辅助节点应该作为新的主节点接管并继续执行读写操作,但是,在您的情况下,当主节点关闭时,辅助节点似乎无法执行写操作。
这有几个可能的原因:
副本集配置不正确。请确保副本集名称和副本集中的节点列表与MongoDB中的配置相匹配。
辅助节点无法达到执行写入操作所需的节点仲裁。在您的情况下,您使用的仲裁节点不存储数据,也无法对写入操作进行投票。您可能需要考虑从副本集中删除仲裁节点或添加另一个辅助节点,以确保仲裁节点始终可用于写入操作。
写关注点配置不正确。在代码中,您将写关注点设置为“majority”和“j=true”。写关注点“j=true”表示写操作仅在写入磁盘日志后返回。请确保MongoDB上启用了日志记录,并且磁盘空间足够。
节点之间的网络连接不稳定。请确保节点可以相互通信,并且没有防火墙或其他网络问题阻止节点通信。
辅助节点相对于主节点不是最新的。请确保辅助节点正在赶上主节点的操作日志,并且辅助节点处于正常状态。
建议查看MongoDB日志,运行“rs.status()”命令检查副本集状态,查看是否有错误信息,也可以尝试直接连接到辅助节点,使用“rs.status()”命令检查副本集状态,查看是否有错误信息。
如果问题仍然存在,您可能需要考虑添加另一个辅助节点,以确保仲裁节点始终可用于写入操作。

相关问题