MongoDB配置服务器副本集搭建失败:分布式锁探测器Ping操作失败
解决2节点MongoDB配置服务器副本集添加节点失败的问题
看起来你在搭建测试用的2节点MongoDB配置服务器副本集时,遇到了第二个节点无法成功加入的问题。从你提供的日志来看,核心错误是WriteConcernFailed和waiting for replication timed out——这说明主节点在等待配置同步到多数节点时超时了,毕竟2节点副本集的"多数"需要2个节点确认,而第二个节点没能正常加入同步流程。下面是具体的排查和解决步骤:
1. 先确认节点间的网络连通性
副本集节点之间必须能互相访问27017端口,这是最基础的前提:
- 在10.0.1.222节点上执行:
nc -zv 10.0.2.41 27017 - 在10.0.2.41节点上执行:
nc -zv 10.0.1.222 27017
如果返回连接失败,先检查防火墙、安全组规则,确保27017端口在两个节点之间是开放的。
2. 验证keyfile的一致性和权限
因为你开启了authorization和keyFile认证,两个节点的keyfile必须完全一致:
- 对比两个节点的
/etc/zzzzzkey.key文件内容,确保没有任何差异 - 检查文件权限:必须设置为
600,并且所属用户是启动mongod服务的用户(通常是mongodb),执行命令:chmod 600 /etc/zzzzzkey.key && chown mongodb:mongodb /etc/zzzzzkey.key
keyfile不一致会导致节点之间无法建立信任连接,直接阻止副本集同步。
3. 检查第二个节点的本地日志
登录10.0.2.41节点,查看/data/log/mongodb.log,找有没有类似以下的错误:
- 认证失败(比如
Authentication failed) - 无法连接主节点的信息
- 副本集配置不匹配的提示
这些日志能直接告诉你第二个节点为什么没能加入副本集。
4. 调整副本集初始化和节点添加的步骤
你当前的脚本一次性添加两个节点,可能在初始化还没稳定的时候就触发了同步,建议分步操作:
- 确保两个节点的mongod服务都正常启动,并且配置文件中的
replSetName(都是configRS)、clusterRole(都是configsvr)完全一致。 - 在主节点(10.0.1.222)用管理员账号登录MongoDB Shell,执行初始化:
进入Shell后执行:mongo -u xxxxx -p yyyy --authenticationDatabase admin --port 27017
等待初始化完成,用rs.initiate()rs.status()确认当前节点是PRIMARY。 - 再添加第二个节点:
等待1-2分钟后,再次执行rs.add("10.0.2.41:27017")rs.status(),查看第二个节点的状态是否变为SECONDARY。
5. 针对2节点副本集的特殊处理(测试环境)
2节点副本集的"多数"要求是2个节点,这意味着只要有一个节点不可用,整个集群就无法达成多数确认,会导致写入超时。测试环境下可以两种方式优化:
- 临时调整writeConcern:添加节点时指定只需要主节点确认,避免超时:
rs.add({host: "10.0.2.41:27017"}, {writeConcern: {w: 1, wtimeout: 5000}}) - 添加仲裁节点:建议再搭建一个轻量的仲裁节点(不需要存储数据),这样副本集变成3节点(2数据+1仲裁),"多数"变为2,即使一个数据节点故障,集群依然能正常工作。
6. 检查节点的身份认证配置
确保两个节点的setParameter.authenticationMechanisms都是SCRAM-SHA-256,并且管理员账号在两个节点上都存在(或者通过副本集同步过去)。如果第二个节点上没有对应的管理员账号,也会导致认证失败无法加入。
内容的提问来源于stack exchange,提问作者JPNagarajan
相关产品推荐
相关产品推荐

