从Compute Engine虚拟机连接数据库遇Sequelize超时问题求助
嘿,我之前也踩过这个一模一样的坑——本地连数据库顺畅得很,一部署到Compute Engine就报SequelizeConnectionError: connect ETIMEDOUT,给你几个实用的排查方向,应该能搞定:
先测GCE到数据库的基础连通性
别先纠结Sequelize的代码,先在GCE虚拟机里直接用命令验证网络通不通。比如数据库是MySQL的话,执行telnet <数据库公网IP> 3306,或者nc -zv <数据库IP> <端口>。如果命令超时,那100%是网络层面的问题,和代码无关。再核对数据库白名单的IP细节
你说加了固定IP到白名单,但要确认加的是GCE的外部固定IP(如果数据库是公网服务)。要是用的是GCP Cloud SQL这类内部服务,且用私有IP连接的话,白名单应该加GCE所在VPC的网段,而不是单个虚拟机IP。另外有些数据库服务的白名单变更需要等几分钟才生效,别刚加完就急着测试。检查GCE的防火墙和VPC规则
GCE默认的出站规则是允许所有流量,但如果你自定义了防火墙规则,得确保没有限制到数据库的端口(比如MySQL的3306、PostgreSQL的5432)。登录GCP控制台去VPC网络 > 防火墙,找出站(Egress)规则,确认目标端口和IP范围是允许的。另外如果启用了VPC网络策略,也要检查策略有没有拦截到数据库的流量。验证Sequelize的连接配置细节
本地正常不代表GCE上的配置没问题。比如数据库是不是要求SSL连接?本地环境可能自动加载了证书,但GCE上的Node.js环境没配置。可以在Sequelize的配置里临时加个SSL选项测试:const sequelize = new Sequelize('dbname', 'user', 'password', { host: 'your-db-ip', dialect: 'mysql', dialectOptions: { ssl: { rejectUnauthorized: false // 仅测试用,生产环境请配置合法证书 } } });另外还要确认配置里的host是不是正确的公网/内部IP,端口有没有写错。
用路由追踪定位问题节点
如果前面的测试都没找到问题,在GCE里执行traceroute <数据库IP>或者mtr <数据库IP>,看看数据包走到哪一步卡住了。比如如果走到GCP的网关就超时,那可能是VPC路由的问题;如果能到数据库所在的服务商节点但没响应,那可能是数据库端的白名单还是有疏漏。
我当时的问题是,Cloud SQL用了私有IP连接,我只加了虚拟机的单个IP到白名单,但Cloud SQL对私有IP连接需要授权整个VPC网段,添加上网段之后就立马连通了。
内容的提问来源于stack exchange,提问作者Drilmo

