在仲裁器上更改mongopipe理员密码

我有一个mongoDB副本集有3个DB – 主/仲裁+仲裁者。 所有3个都以相同的方式安装 – 这意味着他们有一个默认密码的pipe理数据库。

现在 – 我想更改默认密码。 在小学/中学,它运作良好。

mongo admin -u admin -p <password> --authenticationDatabase=admin db.changeUserPassword("admin",<new password>) 

但是 – 在仲裁器中它不工作(即使在PRIMARY中添加rs.slaveOK()之后)

我越来越:

 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 

任何想法如何更改仲裁pipe理员密码?

你如何login仲裁者?

与在MongoDB 3.4中一样,副本集中的仲裁者不会复制任何数据(包括用户/angular色的详细信息)。 这意味着你通常可以通过localhostexceptionlogin仲裁器,除非已经通过将enableLocalhostAuthBypass设置为false来明确禁用该仲裁器。

有一个相关的function请求,你可以upvote /观看: SERVER-5479:仲裁者身份validation副本集应该允许和要求login/身份validation的pipe理员专用操作 。

如果仲裁者将用户数据添加到副本集之前该怎么办?

在你的具体情况下,在mongod被configuration为副本集成员之前,仲裁者似乎已经有了一些authentication数据。 这不是预期的(或支持的)部署,所以为了移除或更新authentication数据,您需要启动仲裁器作为独立的服务器。

要删除任何用户信息:

  1. 停止仲裁。
  2. 在不使用--replSet ,– --keyfile--auth选项的情况下启动仲裁器,以确保在独立模式下进行更改时副本集的其他成员无法连接到仲裁器。

    例如: mongod --dbpath /path/to/data --port 28000 --fork

  3. 现在应该禁用authentication。 使用mongo shell删除admin数据库:

     mongo localhost:28000/admin --eval 'db.dropDatabase()' 
  4. closures仲裁器,例如:

     mongo localhost:28000/admin --eval 'db.shutdownServer()' 
  5. 用正常的configuration启动仲裁器。

您也可以更改密码(而不是删除admin数据库),但这可能会造成混淆,因为仲裁者不希望拥有用户数据。 对仲裁者进行身份validation的结果是不确定的,SERVER-5479的未来实现不太可能支持事先存在的仲裁者数据。 一旦用户/angular色信息被复制到仲裁者,数据将被期望是一致的。