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

Application deployed to Docker Swarm is not connecting with MongoDB Replica Set

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

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

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

/etc/hosts 已在每台计算机上正确配置。

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

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

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

缩写

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

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

我找到了解决方案。

问题与 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",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "node3:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "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 中的第 3 个 mongo 条目执行相同操作。

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

另一种解法:
如果您的 MongoDB 部署一切正常并且一切设置正确,但您仍然无法连接到数据库,请尝试 Change the Primary DB Instance.

  • ssh到主机。
  • 登录到 mongo 主节点 shell 并执行此命令 replica:PRIMARY>rs.stepDown(120)。这将使您的其他实例成为主要实例,而您当前的实例成为次要实例。

我遇到过这个问题,在连续点击并尝试 3 天后,这个解决方案对我有效。

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