最近公司扫描出来nacos里tomcat容器存在漏洞,要求升级nacos。在这记录一下nacos升级的步骤
前提
- 已部署nacos 服务 (本篇文章中升级前为2.4.1 )
- 使用mysql 作为持久化配置
- 使用jar包部署
- linux 环境下部署
- java环境是jdk8
以上情况跟我一样的同学可以直接参考我这篇文章 进行升级,否则的话最好还是参考官文档进行升级操作
升级前调查与准备
查看部署环境jdk版本,选择jdk版本支持的nacos版本,本文发布时,jdk8支持nacos最新版为2.5.1 ,nacos3.x 需要jdk17
查看官网,确定版本及兼容性
统计时官网jdk8 支持最新版本为2.5.1,所有Nacos版本可升级到该版本的兼容性如下:
最新数据请参考官网 :https://nacos.io/docs/v2.5/manual/admin/upgrading/?spm=5238cd80.3b1b4e4d.0.0.53e0dcd0NhxJuk
3.X 版本 升级手册地址:https://nacos.io/docs/latest/manual/admin/upgrading/?spm=5238cd80.3b1b4e4d.0.0.53e0dcd0NhxJuk
Nacos版本 | 是否支持升级到2.5.1 | 备注 |
---|---|---|
0.X ~ 1.1.X | 不支持 | 先升级到1.2再按步骤升级 |
1.2.X ~ 1.4.X | 不支持 | 先升级到2.0或2.1版本后再进行升级 |
2.0.X | 支持 | 数据表结构有变化,更新表结构 |
2.1.X ~ 2.4.X | 支持 | 数据表结构有变化,更新表结构 |
升级步骤
tips: 生产环境时,一定要在不影响业务功能的时间段进行升级
确认好升级版本后就可以按照升级步骤升级了
1. 停止服务
先停止已部署好的nacos服务,避免下面备份时写入数据
# 进入Nacos目录
cd /path/to/nacos/bin
# 停止Nacos服务
sh shutdown.sh
2. 备份
- 一定要备份
- 一定要备份
- 一定要备份
重要的话说三遍,大家无论在任何有风险的操作时,一定要记得备份,备份才是真正的后悔药
- 备份数据库
# 备份方式很多,这里采用mysqldump 备份,如果nacos的配置文件单独存在一个库,无其他数据的话,可直接整库部分,否则只备份nacos相关的配置表 mysqldump -uroot -p nacos > nacos_backup_$(date +%F).sql
集群模式下,如果要在不影响服务的情况下升级,可以先备份数据库。最好保证升级期间没有数据写入,这样如果数据库更新出错,回退时不会丢失数据。然后在单个服务器上升级流程
- 备份Nacos的配置数据和服务注册信息
# 这里我建议直接把旧服务整个目录作为备份,把旧服务的配置和数据移入新服务中,这样升级失败回退时,直接使用旧服务包就可以了 mv /path/to/nacos /path/to/nacos_back
3. 下载解压升级包
- 下载升级包:到官网下载对应版本和环境的升级包,这里下的时zip包
- 上传至服务器并解压
# 解压命令 $version 是版本号,本文是2.5.1 unzip nacos-server-$version.zip # 如果时tar包,执行下面命令 tar -xvf nacos-server-$version.tar.gz
4. 替换配置文件和数据
# 迁移配置文件和数据
cp -r /path/to/nacos_back/conf /path/to/nacos/conf
cp -r /path/to/nacos_back/data /path/to/nacos/data
5. 执行变更sql(可选,部分升级可能不需要)
-- 这是2.4.1 升级到2.5.1 时的sql脚本,实际验证过,直接执行就可以了,其他版本请参考官方文档
ALTER TABLE `his_config_info` ADD COLUMN `publish_type` varchar(50) DEFAULT 'formal' COMMENT 'publish type gray or formal';
ALTER TABLE `his_config_info` ADD COLUMN `gray_name` varchar(50) DEFAULT NULL COMMENT 'gray name';
ALTER TABLE `his_config_info` ADD COLUMN `ext_info` longtext DEFAULT NULL COMMENT 'ext info';
/******************************************/
/* 表名称 = config_info since 2.5.0 */
/******************************************/
CREATE TABLE `config_info_gray` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`src_user` text COMMENT 'src_user',
`src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip',
`gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
`gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`gray_name` varchar(128) NOT NULL COMMENT 'gray_name',
`gray_rule` text NOT NULL COMMENT 'gray_rule',
`encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
KEY `idx_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray';
6. 启动nacos服务
# 以集群模式为例
cd path/to/nacos/bin
sh startup.sh
# 启动Nacos服务 单机模式
sh startup.sh -m standalone
7. 验证升级
查看日志:
tail -f /path/to/nacos_new/logs/start.out
回滚
升级失败,回滚步骤
# 新服务服务是否启动,若启动,停止服务
sh shutdown.sh
# 数据库回滚
mysql -uroot -p nacos < nacos_backup_$(date +%F).sql
# 删除升级后目录
rm -rf path/to/nacos
# 备份目录重命名
mv path/to/nacos_back path/to/nacos
# 启动旧服务
cd path/to/nacos/bin
sh startup.sh