部署到 Docker Swarm 的应用程序未与 MongoDB 副本集连接 解决方案

问题描述

我已经在 3 台机器上使用 Docker Swarm 部署了我的应用程序。

MongoDB 副本集是手动配置的,它在 Ubuntu 机器上作为服务运行。

我正在尝试将我的后端应用程序连接到 MongoDB 副本集,但出现超出上下文截止日期错误。我使用 Private-ip 进行连接,因为机器在同一个 AWS VPC 中。端口27017在安全组中开放,可供VPC网络IP使用。

/etc/hosts 在每台机器上都正确配置。

我正在使用 Docker-Compose 文件来部署堆栈。

副本集工作正常。我已经通过手动插入几个文件进行了检查。

图片将帮助读者更好地理解上下文。

缩写

  • BE = 后端
  • FE = 前端
  • Mac 1 = 机器 1
  • AZ-1 = 可用区 1
  • VPC = 虚拟私有云

我的猜测:
是不是因为 Replica-Set 不在 Swarm Network 中,这就是它无法连接的原因???

我尝试解决这个问题已经有一段时间了,但还没有成功。现在需要帮助。

enter image description here

解决方法

我找到了解决方案。

问题与 MongoDB 副本实例的名称有关。

  • 第一个成员的主机名是 "host" : "10.0.0.223:27017"
  • 第二个成员的主机名是 "host" : "node2:27017"
  • 第三个成员的主机名是 "host" : "node3:27017"

由于这种不一致,后端应用程序无法连接到副本集。

{
    "_id" : "replica1","version" : 5,"term" : 5,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [
        {
            "_id" : 0,"host" : "10.0.0.223:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {
                
            },"slaveDelay" : NumberLong(0),"votes" : 1
        },{
            "_id" : 1,"host" : "node2:27017",{
            "_id" : 2,"host" : "node3:27017","votes" : 1
        }
    ],

解决方案

为了解决这个问题,我用私有 IP 重新配置了副本集节点。我使用私有 IP 进行副本集配置的节点。

第一个 ssh 到主机。登录到 mongo 主节点 shell 并执行以下命令以更改 JSON 中第二个 mongo 节点的主机条目。

> cfg = rs.conf()
> cfg.members[2].host = "10.0.5.242:27017" (Private IP of second mongodb instance)
> rs.reconfig(cfg)

对 JSON 中的第三个 mongo 条目做了同样的处理。

希望这能帮助读者解决类似的问题。

这是更改副本集中主机名的链接。
https://docs.mongodb.com/manual/tutorial/change-hostnames-in-a-replica-set/