我有一个 mongoDB replicaSet,它有 3 个 DB - PRIMARY/SECONDARY + Arbiter。所有 3 个都以相同的方式安装 - 这意味着它们具有默认密码的 admin 数据库。
现在 - 我想更改默认密码。在小学/中学,它运作良好。
mongo admin -u admin -p <password> --authenticationDatabase=admin
db.changeUserPassword("admin",<new password>)
但是 - 在仲裁器中它不起作用(即使在添加rs.slaveOK()
了 PRIMARY 之后)
我越来越:
2016-12-01T00:18:51.408-0800 E QUERY [thread1] Error: Updating user failed: not master :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.updateUser@src/mongo/shell/db.js:1319:15
DB.prototype.changeUserPassword@src/mongo/shell/db.js:1323:9
@(shell):1:1
任何想法如何更改仲裁管理员密码?
如何登录仲裁程序?
在 MongoDB 3.4 中,副本集中的仲裁者不会复制任何数据(包括用户/角色详细信息)。这意味着您通常可以通过localhost 异常登录到仲裁程序,除非已通过设置
enableLocalhostAuthBypass
为false
.您可以投票/观看一个相关的功能请求:SERVER-5479: Arbiter in authenticated replica set should allow and require login/auth for admin-only operations 。
如果仲裁者在添加到副本集之前有用户数据怎么办?
在您的特定情况下,您的仲裁器似乎在
mongod
配置为副本集成员之前已经拥有一些身份验证数据。这不是预期的(或受支持的)部署,因此为了删除或更新身份验证数据,您需要将仲裁器作为独立服务器启动。要删除任何用户信息:
停止仲裁程序。
--replSet
在不带、--keyfile
或选项的不同端口上启动仲裁器,--auth
以确保在独立模式下进行更改时副本集的其他成员无法连接到仲裁器。例如:
mongod --dbpath /path/to/data --port 28000 --fork
现在应该禁用身份验证。使用
mongo
shell 删除admin
数据库:关闭仲裁器,例如:
使用您的正常配置启动仲裁器。
您也可以更改密码(而不是删除
admin
数据库),但这可能会令人困惑,因为仲裁程序不应该拥有用户数据。针对仲裁者进行身份验证的结果未定义,SERVER-5479 的未来实现不太可能支持仲裁者的预先存在的数据。一旦用户/角色信息被复制到仲裁者,数据将被期望是一致的。我迟到了,但从SERVER-32205开始,禁止删除 admin 数据库。因此,不幸的是, @Stennie建议的解决方法不再有效(自 v3.6.3 起)。但是,只要大多数副本集仍然正常运行,甚至还有更简单的解决方法:
rm -rf [your-data-folder]/db/*
仲裁者将自动加入副本集。只要启用了localhost 异常(通过使用enableLocalhostAuthBypass选项),您就可以(仅)从 localhost 连接到仲裁器并在仲裁器上执行 mongodb 命令。