Spring Boot应用无法连接谷歌云MongoDB三节点PSA副本集问题咨询
MongoDB副本集的连接逻辑是:客户端首次通过URI中填写的种子节点建立连接后,会主动从副本集配置中拉取所有成员的访问地址,后续和集群的交互会直接使用拉取到的成员地址,而非继续使用种子IP。
从你提供的rs.status()输出可以看到,副本集所有成员的name字段都是GCP虚拟机的内部主机名(如mongodb-dev-servers-vm-0),这些内部主机名无法在应用所在的公网环境被DNS解析,因此抛出UnknownHostException报错。
而你使用单节点URI连接时,驱动不会触发副本集成员列表拉取逻辑,直接使用填写的公网IP连接,因此可以正常访问。
根据你的使用场景,可以选择以下任意一种方案解决:
方案1:修改副本集成员配置为公有IP(推荐)
直接修改MongoDB副本集的成员地址为公网IP,所有访问副本集的客户端无需额外配置即可正常连接,操作步骤如下:
- 连接到MongoDB主节点的Mongo Shell
- 执行以下命令导出当前副本集配置:
cfg = rs.conf()
- 依次修改所有成员的
host属性为对应节点的公网IP(需替换为你实际的仲裁节点公网IP):
cfg.members[0].host = "34.25.16.18:27017" cfg.members[1].host = "34.05.83.26:27017" cfg.members[2].host = "[仲裁节点公网IP]:27017"
- 保存新的副本集配置:
rs.reconfig(cfg)
配置生效后,再次执行rs.status()即可看到成员名称已更新为公网IP,此时使用原副本集连接URI即可正常访问。
提示:建议提前将GCP MongoDB节点的公网IP设置为静态IP,避免IP变动后需要重新修改副本集配置。
方案2:配置客户端hosts映射
如果暂时不想修改MongoDB集群配置,可在运行Spring Boot应用的机器上配置hosts映射,将内部主机名指向对应公网IP:
- Windows系统hosts文件路径:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS系统hosts文件路径:
/etc/hosts
在文件末尾添加以下内容(需替换为实际的仲裁节点公网IP):
34.25.16.18 mongodb-dev-servers-vm-0 34.05.83.26 mongodb-dev-servers-vm-1 [仲裁节点公网IP] mongodb-dev-arbiters-vm-0
该方案仅对修改了hosts的机器生效,适合临时开发测试场景使用。
方案3:同VPC内使用内网访问
如果你的Spring Boot应用也部署在同一个GCP VPC网络内,不需要走公网访问MongoDB,可直接将连接URI中的公网IP替换为副本集成员的内网IP,或直接使用内部主机名连接,GCP内网默认可解析这些主机名,安全性也更高。
内容的提问来源于stack exchange,提问作者Ashish

