node菜单服务引起的后台异常表象到运维释放从库的数据库连接及驱动修改配置,重新部署生效
node菜单服务引起的后台异常表象到运维释放从库的数据库连接及驱动修改配置,重新部署生效
1.刚开始判断是node服务挂了,jenkins启动失败,尝试从客户端来启动的思路:
root@VM-1-225-centos:/usr/local/auto-node-project-pro-20039 $ ll total 404 -rw-r--r-- 1 root root 887 Sep 28 11:31 apollo.js drwxr-xr-x 6 root root 4096 Sep 28 11:31 app -rw-r--r-- 1 root root 560 Sep 28 11:31 app.js -rw-r--r-- 1 root root 180 Sep 28 11:31 app.ts -rw-r--r-- 1 root root 242 Sep 28 11:31 appveyor.yml drwxr-xr-x 2 root root 4096 Sep 28 11:31 config lrwxrwxrwx 1 root root 67 Sep 28 11:31 node_modules -> /data/tmp/deploy/auto-node-project-pro-20039/node_modules -rw-r--r-- 1 root root 1513 Sep 28 11:31 package.json -rw-r--r-- 1 root root 506 Sep 28 11:31 README.md drwxr-xr-x 2 root root 4096 Sep 28 11:32 run drwxr-xr-x 3 root root 4096 Sep 28 11:31 test -rw-r--r-- 1 root root 776 Sep 28 11:31 tsconfig.json drwxr-xr-x 4 root root 4096 Sep 28 11:31 typings -rw-r--r-- 1 root root 358764 Sep 28 11:31 yarn.lock node发布目录下如何清除logs或者如何重启node服务
# 1. 停止服务
pm2 stop all # 若使用PM2管理
# 或
pkill -f node
# 2. 检查进程是否终止
ps -ef | grep node
# 3. 重新启动
pm2 start /path/to/app.js # PM2示例
# 或
node /path/to/app.js --prod
npm install -g pm2
pm2 start app.js # 启动
pm2 restart app # 重启
验证建议 # 检查服务实际运行状态 curl http://localhost:3000/health # 替换为实际健康检查接口# 检查端口占用 netstat -tulnp | grep 30192 # 测试接口连通性 curl -I http://localhost:3000端口与接口测试 验证端口监听:netstat -tulnp | grep <PID>(PID从pm2 list获取) 接口连通性测试:curl -I http://localhost:<PORT>/health(替换为实际端口和健康检查路径)
pm2 list 是 Node.js 进程管理工具 PM2 的命令,用于列出当前由 PM2 管理的所有应用程序及其状态信息。
常用场景
快速查看所有进程状态:
pm2 list
筛选特定状态的进程(如仅显示异常的):
pm2 list --status errored
结合其他命令管理进程(如重启、停止):
pm2 restart 0 # 通过 id 操作
pm2 stop api # 通过 name 操作
# 查看实时日志 pm2 logs app --lines 50若需消除警告,执行pm2 save保存当前配置 pm2 startup pm2 save日志路径问题 PM2默认日志路径为/root/.pm2/logs/,若该目录权限不足或磁盘空间已满会导致日志写入失败。可通过以下命令检查:df -h /root du -sh /root/.pm2/logs/ 查看指定目录大小
解决方案
强制应用输出日志:
pm2 restart app --time
检查应用真实状态:
pm2 describe app
查看完整日志路径配置:
pm2 show app
若为磁盘问题,可临时清理日志:
pm2 flush app
异常处理流程
若后续出现服务停止:
检查日志:pm2 logs app --lines 50 详细日志:可通过 pm2 logs 查看实时日志。
查看崩溃原因:pm2 show app -f
重启服务:pm2 restart app --update-env
若发现服务频繁重启:
检查未捕获异常:pm2 logs app --error聚焦错误日志
验证依赖服务(如数据库)连通性 【主要原因】
同步PM2配置:执行pm2 save解决配置不一致警告
测试健康状态: curl -I http://172.16.1.XXX:20039/health curl: (7) Failed connect to 172.16.1.XXX:20039; Connection refused curl -I http://172.16.1.YYY:20039/health HTTP/1.1 200 OK content-type: application/json; charset=utf-8 x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block x-content-type-options: nosniff x-download-options: noopen x-readtime: 0 keep-alive: timeout=5 content-length: 75 Date: Sun, 28 Sep 2025 05:16:50 GMT Connection: keep-alive
2.发现了问题的本质: jenkins控制台输出的内容,很关键,这是突破口:
从源头上抓住问题:jenkins控制台实际上输出了关键的错误信息:{"name":"SequelizeConnectionError","message":"connect ETIMEDOUT"}
错误原因
网络连接问题:客户端与数据库服务器之间的网络不通或延迟过高,导致在规定时间内无法建立连接。常见于跨地域访问或防火墙限制的场景。
服务器配置问题:数据库服务未启动、监听地址/端口配置错误,或防火墙阻止了连接请求。
资源限制:数据库服务器负载过高无法响应新连接
基础检查:使用ping或tracert命令测试网络连通性(若服务器禁ping则改用telnet测试端口)
应用中的根本原因是:云上资源有数据库主库和从库,考虑到成本,将从库资源释放,导致服务启动的时候,连接到从库的资源都报错了。
mysql连接命令:
mysql --version
mysql -h172.16.23.51 -P3306 -uatdb_r_h5 -ppwd
ping 172.16.23.51 # 测试主机可达性
telnet 172.16.23.51 3306 # 测试端口开放性
3.将从apollo mysql客户端根据关键字查询,看影响到了哪些服务,哪些需要修改连接字符串和驱动名称(注意还有一些本地的profile文件的连接数据库的也需要修改):
2025-09-28 15:39:21.315 [http-nio-1168-exec-8] [489ce5c47a4990d5,489ce5c47a4990d5] WARN o.s.b.a.h.AbstractHealthIndicator#health [line:46] - Health check failedorg.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Must specify at least one slave host to connect to for master/slave replication load-balancing functionality
Caused by: java.sql.SQLException: Must specify at least one slave host to connect to for master/slave replication load-balancing functionality
检查数据源配置:确保在JDBC URL或连接池配置中至少指定了一个从库主机,格式应为jdbc:mysql:replication://master-host,slave-host1,slave-host2/database
com.mysql.jdbc.ReplicationDriver
连接字符串关键字: replication 去掉,jdbc:mysql:replication://master-host,slave-host1,slave-host2/database 修改成 jdbc:mysql://master-host/database
DEMO:driver-class-name: "com.mysql.jdbc.ReplicationDriver"url: "jdbc:mysql:replication://master-host:3306,slave-host1:3306/database?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&autoReconnect=true"修改成:driver-class-name: "com.mysql.jdbc.Driver"url: "jdbc:mysql://master-host:3306/database?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&autoReconnect=true"
4.部署问题,deployJavaHasConsul,deploy,deploy_no_slb 联系运维解决,估计不单单修改发布的类型,负载均衡的脚本配置,还涉及的脚本文件的。