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运行在宿主机(当前你遇到的场景)
- 进入主节点m1的Mongo shell:
docker exec -it m1 mongo - 修改副本集成员配置为宿主机映射后的地址,注意替换为你实际的宿主机内网IP,不要用localhost:
操作要保证是在PRIMARY节点执行,否则会报错cfg = rs.conf() cfg.members[0].host = "宿主机实际IP:27017" cfg.members[1].host = "宿主机实际IP:27018" cfg.members[2].host = "宿主机实际IP:27019" rs.reconfig(cfg)
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, }) - 进入主节点m1的Mongo shell:
副本集故障自动切换配置
MongoDB Node.js驱动原生支持节点故障自动容灾,不需要额外特殊配置,你现有配置里的autoReconnect: true、reconnectTries、reconnectInterval已经可以满足需求:
- 只要副本集存在可用的多数派节点、能正常选举出主节点,驱动会自动探测可用节点,无需手动切换连接地址
- 主节点故障、副本集完成新主节点选举后,驱动会自动重连到新主节点,不会中断业务
- 你可以额外添加
readPreference: 'secondaryPreferred'配置,实现读请求优先走从节点,主节点故障时也能正常处理读请求,进一步提升可用性:mongoose.connect('你的连接字符串', { // 原有其他配置不变 readPreference: 'secondaryPreferred' })
内容的提问来源于stack exchange,提问作者Chicky
相关产品推荐
相关产品推荐

