我想知道是否有人遇到过从 3.0.9 升级到 3.2.8 时 $external 用户数据库未被复制的问题?
我有一个现有的 3.0.9 副本集环境,运行中没有加密通信(无 TLS)也没有身份验证;该环境运行良好。但是当我使用具有 TLS 和 RBAC(使用 $external)的 3.2.8 进行升级时,集群中的 SECONDARY 成员似乎没有获得 $external 用户数据。
如果我使用我的配置执行 3.2.8 的原始安装,它会正常工作,也就是说,连接到副本集并从主节点读取/写入或仅从辅助节点读取的应用程序可以连接并进行身份验证。但是,如果我尝试从升级后的 3.0.9-3.2.8 集群执行相同操作,则从主节点进行连接、身份验证和读取/写入是正常的,但它们可以连接到但不能对任何一个辅助节点进行身份验证。
这是一个已知错误吗?我已阅读了 mongodb 上的所有升级文档,但找不到任何人尝试过此操作。
当它失败时我得到的错误是:
test7-mongodb-rs:SECONDARY> db.getSiblingDB("$external").auth( { mechanism: "MONGODB-X509", user: "CN=*******,OU=******,O=**********,L=***,ST=**,C=US@$external"
Error: 11 { ok: 0.0, errmsg: "Could not find user CN=*******,OU=******,O=**********,L=***,ST=**,C=US@$external", code: 11 }
0
一些额外的信息似乎很有趣。如果我使用我的集群成员证书而不是客户端证书,我可以连接并验证辅助服务器。然后,当我在 $external DB 上运行 getUsers() 命令时,它会抛出以下错误:
test7-mongodb-rs:SECONDARY>
db.getSiblingDB("$external").getUsers() 2016-08-17T16:49:56.188-0400 E QUERY Error: not master and slaveOk=false at Error (<anonymous>) at DB.getUsers (src/mongo/shell/db.js:1342:15) at (shell):1:30 at src/mongo/shell/db.js:1342
我还要补充一点,一旦我遇到上述问题,如果我停止集群成员,然后删除 lib 目录并重新启动我的设置,它就会正常工作。因此,3.0.9 数据中遗留的某些内容导致了这个问题。在为 RBAC 创建新用户之前,我是否必须执行 dropAllUsers()?也就是说,3.0.9 中是否存在默认或隐藏的数据,这些数据是在没有身份验证的情况下创建的,从而阻止升级时发生这种 $external 复制?
更新,我知道问题是什么,但不确定为什么会出现问题。主服务器上的“admin”数据库未被复制。如果我将其复制到辅助服务器上,则那里的身份验证有效。现在问的是,为什么不同步此数据库