rs.initiate之后立即调用rs.status引发身份验证错误

时间:2018-08-28 10:09:54

标签: mongodb-replica-set

我已经完成了所有步骤以在Shell脚本中启动副本集。基本上,我试图将一个独立实例A转换为包含一个仲裁器B和一个辅助节点C的副本集。这些是脚本中的以下步骤:

  1. 启动不带auth参数的独立实例。
  2. 使用以下角色为mongodb admin数据库创建一个管理员用户:

    Successfully added user: { "user" : "mongodb_admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }

  3. 停止独立实例A。
  4. 使用副本集选项和密钥文件访问控制启动所有三个节点(A,B,C)。
  5. 通过调用rs.initiate在实例A上启动副本集。
  6. 致电rs.status检查所有成员的健康状况是否为1(当前副本集中只有A)
  7. 将仲裁器节点B和辅助节点C添加到副本集。
  8. 等到所有节点都健康为止。

一切正常,直到步骤5。我能够成功启动副本集。 但是步骤6会引发以下错误:

2018-08-27T11:43:47.080+0100 E QUERY [thread1] Error: auth failed : 
DB.prototype._authOrThrow@src/mongo/shell/db.js:1608:20 @(auth):6:1 
@(auth):1:2

当我在第5步和第6步之间睡15秒钟时,它工作得很好。 但是我仍然想确保自己做的正确。如果可以安然入睡,那么在检查步骤6中的状态之前,如何确定可以等待15秒。 另外,即使我使用相同的用户名和密码来启动副本集,我也无法理解为什么会给出身份验证错误?

MongoDB版本:3.6.2

1 个答案:

答案 0 :(得分:0)

我知道这个问题有些陈旧,但是请尝试在步骤5中调用rs.initiate之后运行它。

let isPrimary = false;
let count = 0;

while(isPrimary == false && count < 30) {
  const rplStatus = db.adminCommand({ replSetGetStatus : 1 });

  isPrimary = rplStatus.members[0].stateStr === "PRIMARY";
  print("is primary result: ", isPrimary);
  count = count + 1;
  sleep(1000);
}

这将过滤副本集的状态,并每秒尝试30秒以检查副本集的第一个成员的状态已更改为“ PRIMARY”,此时它将释放线程以进一步执行