You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MongoDB 4.0副本集添加节点失败:replSetHeartbeat要求认证

解决MongoDB 4.0副本集添加节点时的replSetHeartbeat认证失败问题

从你给出的错误日志和配置来看,问题核心出在x509集群认证的用户配置缺失。当启用clusterAuthMode: x509时,MongoDB节点间的心跳(replSetHeartbeat)操作需要通过证书认证,而认证的前提是每个节点的$external数据库中都存在集群内其他节点证书DN(Distinguished Name)对应的用户。

错误原因分析

主节点日志里的Could not find user CN=10.0.41.239/DC=dev@$external已经给出了明确提示:从节点devshard1s2$external数据库中没有主节点证书DN对应的用户,导致主节点发起心跳请求时被拒绝认证。反过来,主节点的$external库中也大概率没有从节点的DN用户,这会导致双向认证失败,最终触发仲裁检查不通过的报错。

解决步骤

1. 确认节点证书的DN信息

先明确两个节点的证书标识:

  • 主节点devshard1s1CN=10.0.41.239, DC=dev
  • 从节点devshard1s2CN=10.0.12.231, DC=dev

2. 在所有节点的$external数据库中创建对方节点的用户

需要给每个节点的$external库添加集群内其他节点的DN用户,并授予集群管理相关角色,保证节点间有权限完成心跳等集群操作:

操作主节点:

连接主节点的admin库(用root用户认证),切换到$external库创建从节点的用户:

use $external
db.createUser({
  user: "CN=10.0.12.231, DC=dev",
  roles: [
    { role: "clusterAdmin", db: "admin" },
    { role: "hostManager", db: "admin" }
  ]
})
操作从节点:

同样连接从节点的admin库(用root用户认证),切换到$external库创建主节点的用户:

use $external
db.createUser({
  user: "CN=10.0.41.239, DC=dev",
  roles: [
    { role: "clusterAdmin", db: "admin" },
    { role: "hostManager", db: "admin" }
  ]
})

3. 验证副本集配置的节点地址与证书SAN匹配

检查副本集配置中的host字段,确保使用的主机名或IP存在对应节点证书的SAN(Subject Alternative Name)中。比如主节点用devshard1s1:27018、从节点用devshard1s2:27018,都符合你提供的证书配置,这一步没问题。

4. 重新配置副本集

再次连接主节点,执行副本集重新配置操作:

// 获取当前副本集配置
var cfg = rs.conf()
// 添加新节点(注意_id要唯一,主节点如果是0,这里用1)
cfg.members.push({
  _id: 1,
  host: "devshard1s2:27018",
  priority: 0, // 可选,设置为从节点优先级,避免抢占主节点
  votes: 1
})
// 应用配置
rs.reconfig(cfg)

如果主节点是当前唯一的投票节点,可能需要加上{force: true}参数,但尽量优先保证用户配置正确后再执行,避免强制配置带来的风险。

额外注意事项

  • 确保所有节点的SSL证书由同一个CA签发,且CAFile配置的根证书正确,这样节点间才能信任彼此的证书。
  • 用Chef部署时,建议调整流程:在部署第二个节点后,先完成两边$external用户的创建,再执行副本集的重新配置操作,避免提前触发心跳认证导致失败。

内容的提问来源于stack exchange,提问作者Parvez Kazi

火山引擎 最新活动