You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS无法连接Docker部署的MongoDB副本集及高可用配置咨询

报错原因分析
  • 副本集成员配置的host是Docker内部网络的域名m1/m2/m3,宿主机环境的Node.js没有对应的DNS解析规则,无法把m3这类域名解析为正确的IP地址,所以抛出getaddrinfo ENOTFOUND错误
  • 额外配置错误:连接字符串中的端口号写错,你三个容器映射到宿主机的端口是27017、27018、27019,不存在27020端口的MongoDB实例
解决方案

根据你的Node.js运行环境选择对应方案即可:

  • 方案1:Node.js服务也运行在Docker环境
    把你的Node.js服务加入mongo-clusterDocker网络,连接字符串直接使用副本集内部配置的地址即可:
    mongoose.connect('mongodb://m1:27017,m2:27017,m3:27017/tsng?replicaSet=mongo-rs', {
      // 原有配置参数保持不变
    })
    
  • 方案2:Node.js运行在宿主机(当前你遇到的场景)
    1. 进入主节点m1的Mongo shell:docker exec -it m1 mongo
    2. 修改副本集成员配置为宿主机映射后的地址,注意替换为你实际的宿主机内网IP,不要用localhost:
    cfg = rs.conf()
    cfg.members[0].host = "宿主机实际IP:27017"
    cfg.members[1].host = "宿主机实际IP:27018"
    cfg.members[2].host = "宿主机实际IP:27019"
    rs.reconfig(cfg)
    
    操作要保证是在PRIMARY节点执行,否则会报错
    3. 修正Node.js连接字符串的端口和地址:
    mongoose.connect('mongodb://宿主机实际IP:27017,宿主机实际IP:27018,宿主机实际IP:27019/tsng?replicaSet=mongo-rs', {
      autoIndex: false,
      reconnectTries: Number.MAX_VALUE,
      reconnectInterval: 500,
      autoReconnect: true,
      poolSize: 10,
      bufferMaxEntries: 0,
      useNewUrlParser: true,
      useFindAndModify: false,
    })
    
副本集故障自动切换配置

MongoDB Node.js驱动原生支持节点故障自动容灾,不需要额外特殊配置,你现有配置里的autoReconnect: true、reconnectTries、reconnectInterval已经可以满足需求:

  • 只要副本集存在可用的多数派节点、能正常选举出主节点,驱动会自动探测可用节点,无需手动切换连接地址
  • 主节点故障、副本集完成新主节点选举后,驱动会自动重连到新主节点,不会中断业务
  • 你可以额外添加readPreference: 'secondaryPreferred'配置,实现读请求优先走从节点,主节点故障时也能正常处理读请求,进一步提升可用性:
    mongoose.connect('你的连接字符串', {
      // 原有其他配置不变
      readPreference: 'secondaryPreferred'
    })
    

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:15:02