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

MongoDB副本集初始化后添加Secondary节点失败求助

MongoDB副本集添加Secondary节点失败排查与解决

咱们先梳理下你遇到的核心问题:执行添加节点的脚本时终端卡住,日志显示等待配置传播到多数节点,secondary节点完全没同步(同步时间停在1970年),虽然telnet能通端口,但节点之间的通信或认证肯定出了问题。下面一步步拆解解决:

一、优先排查KeyFile一致性问题

这是副本集节点间认证最常见的坑:

  • 所有副本集节点的keyFile内容必须完全一模一样,并且文件权限必须是600(只有所有者能读写,其他用户无权限)。如果keyFile不一致,节点之间无法通过认证,心跳会失败,配置自然传不过去。
  • 你可以在每个节点上执行以下命令检查:
# 查看keyFile内容
cat /etc/zzzzzkey.key
# 查看文件权限
ls -l /etc/zzzzzkey.key
  • 如果发现内容不一致,把primary节点的keyFile复制到所有secondary节点,然后重启每个节点的mongod服务:
systemctl restart mongod

二、统一副本集成员的地址格式(主机名/IP)

从你的日志能看到,primary节点的标识是MongoD-1:27017(主机名),但你添加secondary用的是IP,这会导致节点间解析或通信异常:

  • 解决方案二选一:
    1. 全用主机名:在所有节点的/etc/hosts里添加所有节点的主机名-IP映射:
      10.0.1.170 MongoD-1
      10.0.2.157 MongoD-2
      10.0.3.88 MongoD-3
      
      然后修改你的添加脚本用主机名:
      rs.add( { host: "MongoD-2:27017" } )
      rs.add( { host: "MongoD-3:27017" } )
      
    2. 全用IP:重新初始化primary节点的副本集配置(注意:如果已经有数据,先备份!),用IP代替主机名:
      // 登录primary的mongo shell后执行
      rs.initiate(
        {
          _id : "Shard_0",
          members: [
            { _id : 0, host : "10.0.1.170:27017" }
          ]
        }
      )
      
      之后再用IP添加secondary节点。

三、分步添加节点,避免一次性操作

不要一次性添加两个节点,这样容易因为某个节点异常导致整个操作卡住:

  1. 登录primary的mongo shell,先添加第一个节点:
    rs.add("10.0.2.157:27017")
    
  2. 执行rs.status()检查节点状态,等待它从STARTUP变为SECONDARY(这个过程可能需要几分钟,取决于数据量)。
  3. 确认第一个节点正常后,再添加第二个节点:
    rs.add("10.0.3.88:27017")
    

四、检查Secondary节点的同步状态

当前面的问题解决后,同步到1970年的问题会自动修复。你可以用官方推荐的新命令查看同步状态:

rs.printSecondaryReplicationInfo()

如果还是异常,登录secondary节点查看mongod日志,看是否有authentication failedconnection refused之类的错误,针对性解决。

关于日志里的Sharding警告

日志里的ShardingStateNotInitialized是因为你把节点配置成了shardsvr但还没加入分片集群,这个不影响副本集的正常运行,后续如果要搭建分片集群再处理即可。

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

火山引擎 最新活动