部署到 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
文件来部署堆栈。
副本集工作正常。我已经通过手动插入几个文件进行了检查。
图片可以帮助读者更好地理解上下文。
缩写
- BE = 后端
- FE = 前端
- Mac 1 = Mac海因 1
- AZ-1 = 可用区 1
- VPC = 虚拟私有云
我的猜测:
是不是因为 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 天后,这个解决方案对我有效。
希望能帮助读者解决类似的问题。
我已经使用 Docker Swarm 和 3 台机器部署了我的应用程序。
MongoDB 副本集是手动配置的,它在 Ubuntu 机器上作为服务工作。
我正在尝试将我的 后端 应用程序连接到 MongoDB 副本集,但出现 超出上下文截止日期 错误.我正在使用 Private-ip
进行连接,因为机器位于同一个 AWS VPC 中。 27017
端口在安全组开放,VPC网络IP可以使用
/etc/hosts
已在每台计算机上正确配置。
我正在使用 Docker-Compose
文件来部署堆栈。
副本集工作正常。我已经通过手动插入几个文件进行了检查。
图片可以帮助读者更好地理解上下文。
缩写
- BE = 后端
- FE = 前端
- Mac 1 = Mac海因 1
- AZ-1 = 可用区 1
- VPC = 虚拟私有云
我的猜测:
是不是因为 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.
> 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 天后,这个解决方案对我有效。
希望能帮助读者解决类似的问题。