1、原来的脚本备份
惯常做法是kill -9 ,暴力完成,干净利索。
但是还是有很多请求已经进来了,没有完成就game over了,这部分数据就丢失了,那些事务啊,一致性啊,费那么多劲头,一个kill -9 都完蛋了。
所以一般会到夜里没有请求的时候才开天窗,福报比较多,就是容易上火。
具体脚本就是
- bank 备份jar包
- shutdown 脚本
#!/bin/bash
ps aux|grep 项目名称.jar|grep -v grep | awk '{print $2}'|xargs kill -9
- start 脚本
#!/bin/bash
java -jar 项目名称.jar -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m --spring.profiles.active=prod &
- restart 脚本
#!/bin/bash
ps aux|grep 项目名称.jar|grep -v grep | awk '{print $2}'|xargs kill -9
java -jar 项目名称.jar -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m --spring.profiles.active=prod &
2、太暴力,还是温柔一点
简而言之,优雅关闭就是
- 不接受新任务(增量)
- euraka、网关不再给改服务分配任务
- 等待现有任务处理完(存量)
- 线程池跑完
- socket、mq、netty关闭端口
- 临时资源(流,图片)、堆内外内存等释放
目前集中优雅停机的方案
tomcat单体应用
说实话来目前公司之前,没想到还有这么多单体应用坚强的运行着,jboss,weblogic 啥的项目,数据库连接池还是好多年前的那一套,总而言之,这些项目不使用kill -9 ,也不在我检视范围之内
springboot
1、关闭服务不使用kill -9 pid,而是用kill-15 pid
2、spring-boot-starter-actuator提供一个restful接口,可以用于停机
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
但是要注意权限问题
执行curl -X POST host:port/shutdown命令
3、springboot 2.3.+自带优雅停机功能
springboot>2.3.0
tomcat>=9.0.33
需要配置server.shutdown=graceful
还可设置缓冲参数,timeout-per-shutdown-phase 默认30s
4、容器化部署
首先可以销毁容器钱静置30s的方法
其次还是接入spring-boot-starter-actuator,提供metrice权限,方便k8s探活
关闭时候,也通过curl -X POST host:port/shutdownml
还有一种办法,走igress分发的请求,也可以提前静置30s,等线程跑完