我有一个 mongoDB replicaSet,它有 3 个数据库 - PRIMARY/SECONDARY + Arbiter。所有 3 个都以相同的方式安装 - 这意味着它们具有带有默认密码的管理数据库。
现在 - 我想更改默认密码。在主/辅密码上,它运行良好。
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
关于如何更改仲裁员管理员密码有什么想法吗?
答案1
如何登录仲裁器?
与 MongoDB 3.4 一样,副本集中的仲裁器不会复制任何数据(包括用户/角色详细信息)。这意味着您通常可以通过本地主机异常除非通过设置专门禁用此功能enableLocalhostAuthBypass
到false
。
您可以投票/观看相关的功能请求:SERVER-5479:经过身份验证的副本集中的仲裁器应允许并要求仅管理员操作的登录/身份验证 。
如果仲裁器在将用户数据添加到副本集之前就已经拥有该数据,该怎么办?
在您的特定情况下,您的仲裁器在配置为副本集成员之前似乎已经有一些身份验证数据mongod
。这不是预期的(或受支持的)部署,因此为了删除或更新身份验证数据,您需要将仲裁器作为独立服务器启动。
要删除任何用户信息:
停止仲裁者。
--replSet
在没有、、--keyfile
或选项的不同端口上启动仲裁器,--auth
以确保在您在独立模式下进行更改时副本集的其他成员无法连接到仲裁器。例如:
mongod --dbpath /path/to/data --port 28000 --fork
现在身份验证应该被禁用了。使用
mongo
shell 删除admin
数据库:mongo localhost:28000/admin --eval 'db.dropDatabase()'
关闭仲裁器,例如:
mongo localhost:28000/admin --eval 'db.shutdownServer()'
使用正常配置启动仲裁器。
您也可以更改密码(而不是删除数据库admin
),但这可能会造成混淆,因为仲裁器不应该有用户数据。对仲裁器进行身份验证的结果尚未定义,并且 SERVER-5479 的未来实现不太可能支持仲裁器上预先存在的数据。一旦用户/角色信息被复制到仲裁器,数据将有望保持一致。
答案2
我迟到了,但从服务器-32205,删除管理数据库是被禁止的。因此,@Stennie不幸的是不再起作用了(自 v3.6.3 以来)。但是,只要大多数副本集仍在运行,还有一个更简单的解决方法:
- 关闭仲裁器
- 删除 db 文件夹的内容:
rm -rf [your-data-folder]/db/*
- 启动仲裁器
仲裁器将自动加入副本集。只要本地主机异常已启用(通过使用启用LocalhostAuthBypass选项),您只能从 localhost 连接到仲裁器并在仲裁器上执行 mongodb 命令。