说明
中间件指的是什么呢?像redis/mongodb/mysql/rabbitmq/es/nginx/minio/nacos等其它三方发布的项目,我们自己本地部署。
部分三方的包也存在漏洞,所以需要进行升级。
升级考虑的点:
-
系统是否兼容,centos7的系统很多新的服务无法使用。openssl3.0等(docker部署无需考虑)
-
环境是否兼容,比如nginx高版本编译需要高版本的glibc, glibc升级后可能出现现有功能不能使用情况。 (docker部署无需考虑)
-
应用程序是否兼容,比如es需要升级新的java的sdk,新的java的sdk需要springboot版本和当前不一致。 且应用程序暂时不能升级。
-
是否为稳定的LTS版本, 一定下载LTS版本,不要下载体验版,否则容易出现各种问题。
关键词提示: 我的系统是centos7,我的jdk版本是1.8, 我的springboot版本是2.7.18。我想使用xxx的稳定版本,应该选择哪个?
最佳实现:
-
寻找匹配的测试环境机器(服务器架构,服务器内核版本,glibc等核心库版本相同)
-
按照线上环境部署老服务。
-
按照升级步骤升级至新服务。
-
验证升级后服务信息。
备选方案:
-
线上环境部署。(存在一定的风险,不推荐)
-
验证升级步骤,(不要停止老服务,新服务启动不同端口号)
-
验证实际后服务信息。
升级后的验证项目
- 功能验证 核心业务接口是否正常
- 性能验证 升级前后压测对比QPS/磁盘/CPU/内存等
- 边界验证 高并发,大数据量,网络波动等情况下的表现。
- 数据验证 验证升级后数据是否缺失。
名词解释
历史服务:之前部署的服务
新服务:按照新版本号下载安装的服务。
注意事项
本次中间件升级,不要和业务升级一起执行, 防止出现问题难以定位中间件升级导致的问题还是业务代码的问题。
本次中间件升级,请预留足够时间,用于验证失败后的回滚动作。
本次中间件升级,为了保证数据完整性,会进行数据备份,请提前计算好磁盘容量,防止备份,新服务启动导致磁盘容量不足。
本次升级为停机方式升级,非集群模式同时运行(集群模式更复杂,不赘述,基本原理一致)
升级前准备
准备新版本服务的启动包。(下载,编译,install等)
准备旧版本服务的启动包。(回退时使用)
同步配置文件到新服务,并进行适配性更改。
备份历史服务的配置,安装目录,数据快照等
服务升级
检查新版本的配置文件
停止正在运行的历史服务 存在主从的,先停从节点,再停止主节点
部署启动新版本的服务
根据数据快照等进行数据恢复
验证新服务运行状态及数据是否正常
更换资源绑定信息。 path路径的绑定 systemd 的运行文件的绑定 项目中配置文件的引用等。 快捷命令的软连接 ~/.bashrc配置 /etc/profile 配置
版本回退
- 触发回退条件:
新服务启动失败且15分钟内无法修复 程序报错率提升,性能下降超过10% 数据恢复后核心数据丢失。 新服务中间件不可用。
-
新版本的数据快照旧版本可以加载的服务:
-
备份新服务数据快照
-
停止当前线上运行的新服务。
-
启动历史服务,清空历史数据。
-
按照备份进行数据恢复
-
资源绑定进行回退(path 配置文件等)
-
-
新版本的数据快照旧版本不可用情况或允许新版本运行期间数据丢失:
-
停止当前线上运行的新服务
-
启动历史服务
- 历史服务启动失败场景: 清空历史服务数据,重新加载配置,根据历史备份数据进行恢复。
-
资源绑定进行回退(path 配置文件等)
-
风险点:历史版本不兼容新版本的数据,升级期间产生的数据可能会丢失,升级动作需在访问低峰期进行。
-
数据删除(线上稳定运行1-2个月后)
删除历史服务的安装目录。
删除历史服务的备份信息,数据快照,配置文件等
中间件升级样例
redis
mongodb
RabbitMQ
ES
nginx
minio
nacos
我会慢慢的补充我已经使用过的。