我们发现,在主服务器故障切换到次要服务器后,次要服务器没有正确进行身份验证。我们有2台MongoDB服务器(v3.4),都在replicaset中正确设置:
mongo1:27017
mongo2:27017
我们的连接字符串(用于Node.js的MongoDB驱动程序v2.2.19)如下所示:
mongodb://username:password@mongo1,mongo2/db?replicaSet=rs0
现在,我们的主要失败,次要失败,
mongo2
被选为初选。但是,DB调用失败,出现“未授权”错误。所以我又看了一眼MongoDB文档:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
它看起来模棱两可
username:password
每个主机都需要?但这很奇怪,因为它们都是复制的,所以用户应该是相同的,对吗?
我甚至在应用程序中使用这个连接字符串进行了尝试:
mongodb://username:password@mongo1,username:password@mongo2/db?replicaSet=rs0
但这在以下方面失败了:
Error: Username with password containing an unescaped colon
用户名和密码是字母数字的,因此该样式的URI似乎存在解析问题。但对于原件,它没有经过适当的身份验证。因此,这些问题似乎相互矛盾。我已经在独立模式下验证了用户在两台服务器上都存在,并且具有适当的权限。所以我不确定问题出在哪里。我找到了另一个
very similar question
使用不同的驱动程序,但没有答案:(