Zabbix学习资源由浅入深 关于我们 联系我们 加入我们
5

案例|Zabbix跨版本升级指南,4.2-6.0不香吗?

【作者】武玉森,就职于国内某城商行,从事运维框架及智能监控等方面工作,对操作系统、开源监控等方面具有丰富的实践经验。

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 相关部署直接安装新版本即可,不再赘述)

步骤升级主题内容简述备注
1Mysql 8 数据库部署部署8.x版本Mysql,并将mysqldump文件导入该 mysqldump 为 Zabbix 4.2 版本数据库导出
2新前端部署安装 nginx 及 php
3新Server部署安装 Zabbix 6.0LTS该阶段启动时触发升级动作

数据库部署 - Mysql 8

步骤一:从原 Server 数据库导出 mysqldump 文件

因数据量过大,导出时排除了 history 和 trend 数据,但需导出表结构

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 中配置

character-set-server=utf8mb3
collation-server=utf8mb3_bin

② 创建 zabbix 库

create database zabbix character set utf8mb3 collate utf8mb3_bin;

③ 修改导出的 mysqldump 文件

导入前,需确保mysqldump中每个表的DDL语句中参数如下(可采用 sed 批量调整)

ENGINE=InodDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin;

此步骤很重要,不然会出现索引异常的问题。

④ 导入 mysqldump

mysql -uroot -p zabbix < zabbix_dump.sql
mysql -uroot -p zabbix < zabbix_tables.sql

⑤ 创建 zabbix 用户并附权

mysql> create user zabbix@'%' identified by 'xxxxxxxx';
mysql> grant all on zabbix.\* to zabbix@'%';
mysql> flush privileges;

⑥ Zabbix plugin 加密方式的确认及修改

#查看(确保加密方式为 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 按官网提供的部署方案部署即可,此处不再赘述。(附上官网安装步骤,依据个人喜好,可采用源码安装)

dnf module switch-to php:7.4
dnf install zabbix-web-mysql zabbix-nginx-conf zabbix-selinux-policy

新 Server 部署

可按官方提供的部署方法部署,以下为我所用的部署方案(仅供参考)。

采用源码部署方式部署,主备节点均采用以下方案部署。

① Zabbix Server 所需的依赖包安装

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

② 编译安装

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

③ 配置自启动服务

#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 配置文件

④ 主节点配置

#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

⑤ 备节点配置

#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

注: 在主节点启动服务后,会自动开启数据库表升级操作,待升级完成后在启动备节点。

⑥ 启动主节点服务,此步骤会触发数据库表升级操作

systemctl start zabbix-server
systemctl enable zabbix-server

⑦ 启动备节点服务

systemctl start zabbix-server
systemctl enable zabbix-server

至此,新 Server 部署完成。

⑧ 异常处理(★ 关键)

从前端页面登陆,如果页面显示连接数据库产生了报错(如乱码、未知报错等),产生该问题的原因大概率是因为数据库编码导致,需重新将 Mysql 8 的 zabbix 库表导出成 mysqldump 文件,并修改相关编码。具体步骤如下。

① 重新修改并确认 my.cnf 中配置

character-set-server=utf8mb4
collation-server=utf8mb4_bin

② 导出mysqldump文件

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)

drop database zabbix;
create database zabbix character set utf8mb4 collate utf8mb4_bin;

⑤ 修改导出的 mysqldump 文件

导入前,需确保mysqldump中每个表的DDL语句中参数如下(可采用 sed 批量调整)

ENGINE=InodDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

⑥ 导入 mysqldump

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,了解更多。


扫一扫|加入技术交流群

微信号|17502189550

备注“使用Zabbix年限+企业+姓名”

5000+用户已加入!

图片


一个人走得快,一群人走得远!





2023-04-26