【作者】武玉森,就职于国内某城商行,从事运维框架及智能监控等方面工作,对操作系统、开源监控等方面具有丰富的实践经验。
Zabbix 6.0 LTS 已经发布了一段时间了,面对那么香的新鲜功能,回头看看自己 Zabbix 4.2 版本,难道只能看着眼馋嘛?!
可是如何完成跨版本升级,分析官方文档给出了以下建议:
Zabbix 4.2 → Zabbix 5.x → Zabbix 6.0
然而面对 7*24 小时的无中断业务要求,如果按部就班的逐版本升级,监控停摆周期可能不可控。仔细分析各版本数据结构及升级要求,发现最大的问题还是在数据库及数据结构这块儿,只要处理好这块儿问题,跨版本升级未必不可行,最终决定采用大版本直升的方案进行升级:
Zabbix 4.2 → Zabbix 6.0
注: 该文为后整理,缺少相关页面图示,请见谅。
资源需求
类型 | 资源 | 备注 |
---|---|---|
数据库 | 虚机 1 台 | 部署 Mysql 8,可按需求是否做主从 |
前端服务 | 虚机 1 台 | 部署 nginx php,根据实际需求是否需要做负载 |
后端服务 | 虚机 2 台 | 部署 zabbix server 6.0,进行主备验证 |
升级步骤
本次升级为大版本升级,升级期间新旧版本并行工作,逐步替代,不会长时间影响监控运行(约 10 分钟),但需按照以下升级步骤开展。(为简化文档说明,Proxy 相关部署直接安装新版本即可,不再赘述)
步骤 | 升级主题 | 内容简述 | 备注 |
---|---|---|---|
1 | Mysql 8 数据库部署 | 部署8.x版本Mysql,并将mysqldump文件导入 | 该 mysqldump 为 Zabbix 4.2 版本数据库导出 |
2 | 新前端部署 | 安装 nginx 及 php | |
3 | 新Server部署 | 安装 Zabbix 6.0LTS | 该阶段启动时触发升级动作 |
数据库部署 - Mysql 8
步骤一:从原 Server 数据库导出 mysqldump 文件
因数据量过大,导出时排除了 history 和 trend 数据,但需导出表结构
代码语言:javascript复制mysqldump -uroot -p --databases zabbix --ignore-table=zabbix.history --ignore-table=zabbix.history_log --ignore-table=zabbix.history_str --ignore-table=zabbix.history_text --ignore-table=zabbix.history_uint --ignore-table=zabbix.trends --ignore-table=zabbix.trends_uint > zabbix_dump.sql
mysqldump -d zabbix -uroot -p --tables history history_log history_str history_text history_uint trends trends_uint > zabbix_tables.sql
步骤二:安装 Mysql8.0.28 版本
该阶段可采用了绿色免安装版,从 mysql 官网下载 mysql-8.0.28-el7-x86_64.tar.gz,并直接解压安装、初始化 mysql、创建 zabbix 用户并附权(可参考官网现有解决方案,不再赘述)。因版本跨度大,数据编码、结构均需人工干预进行处理,以下部分是成功与否的关键,此处划重点!
① 确认 my.cnf 中配置
代码语言:javascript复制character-set-server=utf8mb3
collation-server=utf8mb3_bin
② 创建 zabbix 库
代码语言:javascript复制create database zabbix character set utf8mb3 collate utf8mb3_bin;
③ 修改导出的 mysqldump 文件
导入前,需确保mysqldump中每个表的DDL语句中参数如下(可采用 sed 批量调整)
代码语言:javascript复制ENGINE=InodDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin;
此步骤很重要,不然会出现索引异常的问题。
④ 导入 mysqldump
代码语言:javascript复制mysql -uroot -p zabbix < zabbix_dump.sql
mysql -uroot -p zabbix < zabbix_tables.sql
⑤ 创建 zabbix 用户并附权
代码语言:javascript复制mysql> create user zabbix@'%' identified by 'xxxxxxxx';
mysql> grant all on zabbix.* to zabbix@'%';
mysql> flush privileges;
⑥ Zabbix plugin 加密方式的确认及修改
代码语言:javascript复制#查看(确保加密方式为 mysql_native_password):
mysql> use mysql;
mysql> select user,host,plugin,authentication_string from user;
#修改:
mysql> alter user zabbix@'%' identified with mysql_native_password by 'xxxxxxx';
新前端部署
此处部署全新的 Nginx PHP 按官网提供的部署方案部署即可,此处不再赘述。(附上官网安装步骤,依据个人喜好,可采用源码安装)
代码语言:javascript复制dnf module switch-to php:7.4
dnf install zabbix-web-mysql zabbix-nginx-conf zabbix-selinux-policy
新 Server 部署
可按官方提供的部署方法部署,以下为我所用的部署方案(仅供参考)。
采用源码部署方式部署,主备节点均采用以下方案部署。
① Zabbix Server 所需的依赖包安装
代码语言:javascript复制yum install -y gcc mariadb-devel net-snmp-devel libxml2-devel unixODBC-devel libcurl-devel openssl-devel openldap-devel pcre-devel
#需要将 libssh2-devel OpenIPMI-devel libevent-devel 上传到本地
yum localinstall libevent-devel-2.0.21-4.el7.x86_64.rpm libssh2-devel-1.8.0-4.el7.x86_64.rpm OpenIPMI-devel-2.0.27-1.el7.x86_64.rpm
#支持 java gateway
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
② 编译安装
代码语言:javascript复制mkdir -p /home/ source-code
tar -zxvf zabbix-6.0.3.tar.gz -C /home/source-code
cd /home/ source-code/zabbix-6.0.3
./configure --prefix=/home/zabbix-server --enable-server --enable-java --enable-ipv6 --with-mysql --with-libxml2 --with-unixodbc --with-net-snmp --with-ssh2 --with-openipmi --with-openssl --with-libcurl
make && make install
③ 配置自启动服务
代码语言:javascript复制#vim /usr/lib/systemd/system/zabbix-server.service #内容如下:
[Unit]
Description=Zabbix Server
After=syslog.target
After=network.target
[Service]
Environment="CONFFILE=/home/zabbix-server/etc/zabbix_server.conf"
EnvironmentFile=-/etc/sysconfig/zabbix-server
Type=forking
Restart=on-failure
PIDFile=/home/zabbix-server/zabbix_server.pid
KillMode=control-group
ExecStart=/home/zabbix-server/sbin/zabbix_server -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
TimeoutSec=0
[Install]
WantedBy=multi-user.target
注: Zabbix 6.0LTS 支持 HA 配置,请在主从节点各自配置 Zabbix Server 配置文件
④ 主节点配置
代码语言:javascript复制#vi /home/zabbix-server/etc/zabbix_server.conf #修改项如下:
LogFile=/home/logs/zabbix/zabbix_server.log
LogFileSize=200
PidFile=/home/zabbix-server/zabbix_server.pid
DBHost=[数据库节点 ip]
DBName=zabbix
DBUser=zabbix
DBPassword=
StartPollers=20
StartPollersUnreachable=5
StartPingers=5
CacheSize=1024M
HistoryCacheSize=64M
HistoryIndexCacheSize=16M
TrendCacheSize=16M
ValueCacheSize=128M
Timeout=15
User=[启动用户]
StatsAllowedIP=0.0.0.0/0
HANodeName=[主节点 name]
NodeAddress=[主节点 IP]:10051
⑤ 备节点配置
代码语言:javascript复制#vi /home/zabbix-server/etc/zabbix_server.conf #修改项如下:
LogFile=/home/logs/zabbix/zabbix_server.log
LogFileSize=200
PidFile=/home/zabbix-server/zabbix_server.pid
DBHost=[数据库节点 ip]
DBName=zabbix
DBUser=zabbix
DBPassword=
StartPollers=20
StartPollersUnreachable=5
StartPingers=5
CacheSize=1024M
HistoryCacheSize=64M
HistoryIndexCacheSize=16M
TrendCacheSize=16M
ValueCacheSize=128M
Timeout=15
User=[启动用户]
StatsAllowedIP=0.0.0.0/0
HANodeName=[备节点 name]
NodeAddress=[备节点 IP]:10051
注: 在主节点启动服务后,会自动开启数据库表升级操作,待升级完成后在启动备节点。
⑥ 启动主节点服务,此步骤会触发数据库表升级操作
代码语言:javascript复制systemctl start zabbix-server
systemctl enable zabbix-server
⑦ 启动备节点服务
代码语言:javascript复制systemctl start zabbix-server
systemctl enable zabbix-server
至此,新 Server 部署完成。
⑧ 异常处理(★ 关键)
从前端页面登陆,如果页面显示连接数据库产生了报错(如乱码、未知报错等),产生该问题的原因大概率是因为数据库编码导致,需重新将 Mysql 8 的 zabbix 库表导出成 mysqldump 文件,并修改相关编码。具体步骤如下。
① 重新修改并确认 my.cnf 中配置
代码语言:javascript复制character-set-server=utf8mb4
collation-server=utf8mb4_bin
② 导出mysqldump文件
代码语言:javascript复制mysqldump -uroot -p --databases zabbix --ignore-table=zabbix.history --ignore-table=zabbix.history_log --ignore-table=zabbix.history_str --ignore-table=zabbix.history_text --ignore-table=zabbix.history_uint --ignore-table=zabbix.trends --ignore-table=zabbix.trends_uint > zabbix_dump.sql
mysqldump -d zabbix -uroot -p --tables history history_log history_str history_text history_uint trends trends_uint > zabbix_tables.sql
③ 重启mysql数据库
④ 删除原 zabbix 库并创建新的 zabbix 库(编码为utf8mb4)
代码语言:javascript复制drop database zabbix;
create database zabbix character set utf8mb4 collate utf8mb4_bin;
⑤ 修改导出的 mysqldump 文件
导入前,需确保mysqldump中每个表的DDL语句中参数如下(可采用 sed 批量调整)
代码语言:javascript复制ENGINE=InodDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
⑥ 导入 mysqldump
代码语言:javascript复制mysql -uroot -p zabbix < zabbix_dump.sql
mysql -uroot -p zabbix < zabbix_tables.sql
后记
Server 版本升级完成后,这是一个全新的尚未有 Agent/Proxy 数据接入 Server 端,可逐个更改 Agent/Proxy(Proxy 版本需与 Server 端相匹配)指向来实现监控无中断。
理论上,该文档适配zabbix 4.x的任何版本的跨版本升级。然而大版本升级具有一定风险,建议在测试环境充分测试后再投入生产实施。
最后祝大家升级顺利,万事大吉!
感谢本文作者,欢迎交流!期待更多用户投稿。
-------------- --------------
7月29日,拥有Zabbix5.0认证证书的工程师想要升级为6.0,只需参与为期1天的课程(原培训为5天),省时省钱!
联系文末小Z,了解更多。