Zabbix 6.0 升级完全指南!

2022-04-07 14:22:51 浏览数 (1)

Zabbix6.0已于上周发布,新功能一览见《Zabbix6.0为BSM、DevOps、ITOps助力》。你是否考虑升级至最新版本或者已经升级了?软件升级往往是一个令人生畏的的过程,尤其是当你第一次升级 Zabbix 实例时。本文将介绍升级的过程、必要的先决条件,以及迁移到 Zabbix 6.0 LTS 后,有哪些新功能是你期待的。

目录

  • 升级前检查
    • 数据库版本
    • 支持的操作系统
    • 其他安装方式
    • 环境检查
  • 影响升级过程的重要变化
    • API 变化
    • 其他重要变化
  • 升级步骤
  • 备份
    • 备份配置文件
  • 通过 Docker 升级
  • 通过 Zabbix 软件包升级
    • 升级 Zabbix 的主要组件
    • 升级 Zabbix proxies
  • 升级后的工作
    • 历史表主键
    • 检查新进程
    • 更新现有模板
    • 更新 Zabbix agents
    • 新增的 Zabbix 安装包
  • Q&A

升级前检查

数据库版本

在升级 Zabbix 到新版本之前,首先确保底层组件都已经准备好了。在升级之前,你应该注意 Zabbix 发生了一些变化。其中一个变化是 Zabbix 6.0 LTS 支持的数据库引擎及版本:

  • MySQL/Percona 8.0.x
  • MariaDB 10.5.0 -10.6.x
  • PostgreSQL 13.x
  • Oracle 19c – 21c

如果你正在使用 PostgreSQL TimescaleDB 或 Zabbix Proxies:

  • TimescaleDB 2.0.1-2.3
  • SQLite 3.3.5 – 3.34.x

你可能已经发现了,我们增加了 Zabbix 后端数据库的版本要求。这样做的原因是 Zabbix 利用了这些新版本数据库提供的特性,从而确保 Zabbix 的最佳性能。如果使用不受支持的数据库版本,Zabbix 将不会启动。有一个配置参数可以解决这种问题,但是不建议这样做,因为无法确保 Zabbix 会不会遇到性能问题或者崩溃。在迁移到 Zabbix 6.0 LTS 之前,应该首先将数据库升级到支持的版本。

支持的操作系统

Zabbix 支持所有 Linux 发行版和许多其他类 unix 操作系统。但不是对每一个发行版操作系统都提供了 Zabbix 安装包。Zabbix 5.2 的一个重要变化就是没有为 RHEL/CentOS 7 提供对应的软件包。因为包含在这些发行版操作系统中,有一些库文件已经过时了,在这些操作系统上构建 Zabbix 变得越来越复杂。但是如果有对应版本的库文件,仍然可以从源代码中构建 Zabbix。

Zabbix 6.0 LTS 官方支持的操作系统有:

  • RHEL/CentOS/Oracle Linux 8
  • Ubuntu 18.04
  • Debian 10
  • SLES 12

其他安装方式

Zabbix 还支持以下部署方式:

  • Docker – 官方 docker 镜像中提供了所有的依赖关系
  • Cloud image – 该镜像包含了所有的依赖
  • Zabbix appliance – 所有可用的 Zabbix 应用镜像都包含所需的依赖

环境检查

在对 Zabbix 进行大版本更新之前,强烈建议对系统环境进行一次检查,看看环境中有没有未完成的维护任务和健康状态检查。在升级 Zabbix 6.0 LTS 之前,我们需要考虑以下几点:

  • 在升级 Zabbix 之前,升级所需的操作系统或数据库,并检查没有任何问题
  • 检查自定义安装——是否修改了数据库表结构?有没有自定义的模块或补丁?
    • 最好的方式就是复制当前 Zabbix 实例,然后在测试环境中测试升级。
  • 是否为所有 Zabbix 组件都提供了所需的软件包?
  • 是否所有 Proxies 的操作系统都是支持的版本?
  • 查看官方文档,了解将要升级的这个版本中存在的问题。

影响升级过程的重要变化

Zabbix 6.0 LTS 中的一些变化可能会对升级或现有的 Zabbix 工作流程造成影响。

API 变化

以下是关于 5.0 和 6.0 版本之间 API 变化的文档列表:

  • https://www.zabbix.com/documentation/6.0/manual/api/changes_5.4_-_6.0
  • https://www.zabbix.com/documentation/current/manual/api/changes_5.2_-_5.4、
  • https://www.zabbix.com/documentation/5.2/manual/api/changes_5.0_-_5.2

API 的一些重要变化:

  • Zabbix 5.4 中引入了新的触发器和计算/聚合监控项语法,对应创建触发器 API 的调用方式也发生了变化(ZBXNEXT-6451)
    • 你需要修改 API 调用的触发器语法,避免出现问题。
  • 对于 user.createuser.update 方法,user_medias 参数被重命名为 medias(ZBX-17955)
    • user_medias 参数被弃用
  • user.create, user.update, 和 user.get 方法删除了 type 属性(ZBXNEXT-6148)
    • 用户对象不在支持type属性,而是在用户角色中定义。
  • 监控项无法添加到应用集,应用集用标签代替了(ZBXNEXT-2976)
  • 由于值映射不支持全局定义了,valuemap.createvaluemap.get方法需要一个hostid属性(ZBXNEXT-5868)

其他重要变化

在迁移到 Zabbix 6.0 LTS 时,有几个重要的变化需要注意:

  • 以前,无论是在设置密码或修改密码,密码结尾的空格都会被删除。现在密码结尾的空格不会被删除
  • 未使用的值映射将被删除。
  • 由于审计日志设计发生变化,已存在的审计日志记录将被删除。

升级步骤

接下来,我们来讨论一下如何正确安全地执行升级过程:

  • 备份数据库,以及任何自定义文件(外部脚本、告警脚本)和配置文件。
  • 升级 Zabbix Server 和 Zabbix 前端
    • 一旦启动新的 Zabbix 服务器进程,它将自动检查数据库结构并自动升级
    • 迁移时长取决于数据库大小和版本。
    • 一旦数据库结构自动升级完成,Zabbix Server 将自动启动。
  • 升级 proxies。Proxies 必须与 Zabbix Server 版本相同。
  • 检查是否存在问题并且 Zabbix 实例是否已经启动并正常运行。
    • 检查 Zabbix Server 和 Zabbix Proxies 是否能采集到数据。
    • 检查是否有触发器告警以及是否收到对应的告警通知。

备份

我们来深入研究一下备份过程,并通过一些示例讨论所需的步骤:

  • 根据数据库类型选择数据库备份方式
    • 通常,你可以忽略历史和趋势数据表,只备份配置数据表
    • 历史和趋势数据表通常很大,只备份配置数据就很快。
    • 如果有时候需要从备份中执行恢复,则需要手动重新创建历史和趋势表
  • 备份 Zabbix 配置文件。
  • 自定义的告警脚本、外部脚本和其他自定义文件可以根据需要进行备份。

例子:MySQL 数据库备份(忽略历史和趋势表):

代码语言:javascript复制
mysqldump -uroot -p --single-transaction --ignore-table=zabbix.history --ignore-table=zabbix.history_uint --ignoretable=zabbix.history_text --ignore-table=zabbix.history_log --ignore-table=zabbix.history_str --ignore-table=zabbix.trends --ignore-table=zabbix.trends_uint zabbix | gzip > zabbix_backup.sql.gz

备份配置文件

至少,你应该备份以下配置文件:

  • /etc/zabbix/*
  • /usr/lib/zabbix/externalscripts/ 中的外部脚本
  • /usr/lib/zabbix/alertscripts 中的告警通知脚本
  • /etc/httpd/conf.d/zabbix.conf
  • /etc/php-fpm.d/zabbix.conf

通过 Docker 升级

在 docker 中运行 Zabbix 有多种方法。在本示例中,假设你是通过 Zabbix 官方提供的 Docker 镜像(Mysql Apache)中运行的 Zabbix Server 和 Zabbix 前端。

停止 Zabbix Server、Zabbix 前端和 proxy 容器:

代码语言:javascript复制
docker stop my-zabbix-server
代码语言:javascript复制
docker stop my-zabbix-frontend

启动 Zabbix 6.0 LTS 容器,并指向相同的后端数据库:

代码语言:javascript复制
docker run --name my-zabbix-server-6.0 -e DB_SERVER_HOST="some-mysql-server" -e
MYSQL_USER="some-user" -e MYSQL_PASSWORD="some-password" -d zabbix/zabbixserver-mysql:6.0-latest

然后,数据库结构将自动升级并启动。

最后,启动 Zabbix 前端容器:

代码语言:javascript复制
docker run --name my-zabbix-web-apache-6.0 -e DB_SERVER_HOST="some-mysqlserver" -e MYSQL_USER="some-user" -e MYSQL_PASSWORD="some-password" -e ZBX_SERVER_HOST= "my-zabbix-server-6.0" -d zabbix/zabbix-web-apache-mysql:6.0-latest

通过 Zabbix 软件包升级

升级 Zabbix 的主要组件

如果你使用的是官方提供的 Zabbix 软件包,那么升级过程还需要几个步骤,看起来有点复杂。下面让我们详细了解一下升级所需的步骤。这个示例对应的操作系统是 CentOS 8。

安装 Zabbix 6.0 LTS 发行包 ,需要添加必要的 Zabbix 6.0 LTS 存储库信息:

代码语言:javascript复制
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm

清除 DNF 包管理器缓存:

代码语言:javascript复制
dnf clean all

安装所有的依赖软件包

代码语言:javascript复制
dnf install zabbix-server-mysql zabbix-web zabbix-web-mysql zabbix-web-deps
zabbix-apache-conf zabbix-selinux-policy

启动 Zabbix 组件并观察日志,你应该可以看到正在进行数据库结构升级。一旦数据库升级完成,Zabbix 内部的所有进程都应该正常启动:

代码语言:javascript复制
17602:20210921:131335.333 completed 96% of database upgrade
17602:20210921:131335.355 completed 97% of database upgrade
17602:20210921:131335.379 completed 98% of database upgrade
17602:20210921:131335.606 completed 99% of database upgrade
17602:20210921:131335.711 completed 100% of database upgrade
17602:20210921:131335.711 database upgrade fully completed
17602:20210921:131335.804 server #0 started [main process]
17602:20210921:131335.808 server #2 started [configuration syncer #1]
17602:20210921:131335.810 server #1 started [service manager #1]

升级 Zabbix proxies

此外,我们还需要升级我们的 Zabbix Proxies。这个过程和我们之前的步骤非常相似:

安装 Zabbix 6.0 LTS 发行包:

代码语言:javascript复制
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm

清除 DNF 包管理器缓存:

代码语言:javascript复制
dnf clean all

升级 Zabbix proxy

代码语言:javascript复制
dnf update zabbix-proxy-mysql(pgsql, sqlite3)

对于后端数据库是 MySQL, PostgreSQL, and Oracle 的 proxies,数据库表结构会自动更新。

对于后端数据库是 SQLite3 的 Proxies,数据库表结构不会自动更新。 我们只需要删除旧的 sqlite3 数据库文件——一旦启动 Zabbix Proxy,数据库文件将自动重新创建。

代码语言:javascript复制
rm –rf /tmp/proxy.sqlite

升级后的工作

升级到 Zabbix 6.0 LTS 之后,还需要执行一些额外的工作。我们来看一下需要做些什么。

历史表主键

Zabbix 6.0 LTS 后端数据库历史表结构发生了变化,这些表现在有主键。由于会造成额外的故障,这些表的升级不会自动完成。 执行修改的时间可能很长,这取决于数据库的大小,因为历史表中的每个记录都需要修改。此外,历史记录表中的重复记录可能会导致手动升级数据库表结构失败。更改历史表结构有很多好处:

  • 所有历史表现在都有主键。
  • 减少了历史表存储空间
  • 提高了历史表查询性能
  • 不推荐升级现有实例

对全新安装的 Zabbix 6.0 LTS,默认就包含这些更改,对已有的环境进行 Zabbix 6.0 升级,建议充分测试历史表结构修改过程并评估潜在的故障时间。准确的历史表升级步骤,会随着 Zabbix 6.0 LTS 一起发布。

检查新进程

需要注意的是,在 Zabbix 6.0 LTS 中增加了一些新的 Zabbix 进程:

  • StartHistoryPollers:
    • 负责处理计算、聚合和内部检查(需要连接数据库)的进程。
    • 默认值是 5。如果有很多这样的监控项可以考虑增加此值。
  • StartLLDProcessors(从 4.0 迁移):
    • 用于 LLD 任务进程
    • 默认值是 5。如果有很多 lld 规则可以考虑增加此值。

更新现有模板

如果你以前做过 Zabbix 升级,你就会知道 Zabbix 不会自动更新现有的模板,因为我们认为用户可能会对上述模板做了一些定制更改。因此,若要在 Zabbix 服务器内部监视图中查看上述新进程,应该下载并导入最新的 Zabbix 服务器模板。

你可以从 Zabbix git 官方页面下载模板。你可以阅读发布说明,来查看模板更新的完整列表以及在对应模板所做的更改。

更新 Zabbix agents

你也可以考虑升级你的 Zabbix agents。这个不是强制要求的,因为 Zabbix agents 是向后兼容的,所以你可以在 Zabbix 6.0 LTS 中使用旧版本的 Zabbix agents。之前的所有功能可以继续运行,但你也可以考虑更新 agents,因为更新里可能修复了一些问题或者支持一组新的监控项。

升级 Zabbix agent:

代码语言:javascript复制
dnf install zabbix-agent

升级 Zabbix agent2:

代码语言:javascript复制
dnf install zabbix-agent2

新增的 Zabbix 安装包

你可能已经注意到,在 Zabbix 6.0 LTS 中有多个新增的软件包。这些软件包大多数是为了更好地管理软件包而对一些旧的组件进行重新打包,但也有例外:

  • zabbix-selinux-policy — Zabbix 的 SELinux 基本策略
  • zabbix-sql-scripts — 所有后端数据库脚本.sql 文件
    • 它们曾经是 zabbix-server 包的一部分
    • 在 Zabbix 安装过程中,初始化 Zabbix 数据库结构或数据时需要用此安装包
  • zabbix-web-service — 负责生成定时报表的服务

Q&A

问: 升级过程是否会影响我自定义的模板?

答: 会的,所有的模板会继续工作。但是对触发语法所做的更改都会自动应用到你现有的模板中。

问: 迁移过程需要多长时间? 如何评估停机时间?

答: 如果不通过完全相同的硬件,来创建现有 Zabbix 实例的测试副本,并检查测试升级的停机时间,就没办法评估出准确的停机时间。

问: 从一个非常旧的版本迁移会怎么样 — 比如 Zabbix 3.0 或更老的版本?

答: 应该没有问题,但是旧版本升级可能有一些注意事项和额外的先决条件。

0 人点赞