Zabbix 6.0:原生高可用方案部署
本部署文档适用于 CentOS 8.X/RHEL 8.X/Anolis OS 8.X/AlmaLinux 8.X/Rocky Linux 8.X。
原生的HA方案终于来了😀
相比之前的 Keepalived 方案,原生方案配置简单了不少。
Zabbix HA 最少需要2个 Zabbix Server 节点即可实现HA集群高可用及故障转移。在同一个 Zabbix HA 集群中,只有一个实例或节点处于 active(活动)状态,standby(备用)节点不进行数据收集、处理或其他任务,并且不监听端口,并保持一个最少的数据库连接。
HA节点分为以下几种状态:
- Active(活动)
- Standby(备用)
- Unavailable(不可用)
- Stopped(停止)
中文版界面将Active翻译成主动式,并不是很准确。
关于TimescaleDB
当数据保存在 Zabbix 服务器内存中时还好,但是当数据需要写入数据库 (或从数据库中读取) 时,无论多么好的缓存和算法,如果数据库性能严重低于收集指标的速度,这些算法都是没有任何帮助的。
监控系统中的数据经常插入,然后在大多数情况下是以聚合的方式访问(例如,显示图表或计算汇总项目),定期删除,几乎从不更新。此外,通常监控的指标的值按时间排序。此类数据通常称为时间序列数据。
从数据库角度来看,时序数据具有以下特点:
- 时间序列数据可以按时间排序的块序列排列在磁盘上。
- 时间序列数据至少有一列索引是由时间组成的
- 大多数SQL选择查询将使用带有时间列的
WHERE
、GROUP BY
或ORDER BY
子句。 - 时间序列数据的保留策略通常都是批量删除, 而不是删除单个记录。
那么,是否有办法在不丧失 SQL 灵活性的情况下利用时间序列数据库呢?不出意外,没有一刀切的答案,但有个时间序列解决方案达到了非常接近的效果——TimescaleDB。
TimescaleDB 基于 PostgreSQL 数据库打造的一款时序数据库,插件化的形式部署,随着 PostgreSQL 的版本升级而升级,具备以下特点:
- 基于时序优化;
- 自动分片(按时间、空间自动分片(chunk));
- 全 SQL 接口;
- 支持垂直与横向扩展;
- 支持时间维度、空间维度自动分区。空间维度指属性字段(例如传感器 ID,用户 ID等);
- 支持多个 SERVER,多个 CHUNK 的并行查询。分区在 TimescaleDB 中被称为 chunk;
- 自动调整 CHUNK 的大小;
- 内部写优化(批量提交、内存索引、事务支持、数据倒灌);
- 复杂查询优化(根据查询条件自动选择chunk,最近值获取优化(最小化的扫描,类似递归收敛),limit 子句 pushdown 到不同的;server,chunks,并行的聚合操作);
- 利用已有的 PostgreSQL 特性(支持 GIS,JOIN等),方便的管理(流复制、PITR);
- 支持自动的按时间保留策略(自动删除过旧数据);
Zabbix 从5.0版本开始全面支持 TimescaleDB,并针对其特性做了优化。可自动压缩历史数据存储,节省50-70%的存储空间,同时具备自动分区功能。通过 Zabbix Housekeeper 清理历史数据时直接清理对应的分区,大大提高了历史数据的清理效率。建议新建系统采用 TimescaleDB 方案。
💡Tips:Zabbix 6.0 版本安装完后,默认已开启7天历史数据压缩。
环境
- 系统:Rocky Linux 8.5
- 数据库:PostgreSQL13.6、TimescaleDB 2
主机名 | IP | 说明 |
---|---|---|
test-zbx-1 | 192.168.70.52 | server |
test-zbx-2 | 192.168.70.53 | server |
test-zbx-3 | 192.168.70.54 | server |
test-zbx-db | 192.168.70.55 | PostgreSQL、TimescaleDB |
数据库部署
安装 PostgreSQL
1 | dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm |
安装 TimescaleDB
1 | tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL |
1 | dnf install timescaledb-2-postgresql-13 -y |
初始化 PostgreSQL
1 | /usr/pgsql-13/bin/postgresql-13-setup initdb |
启动 PostgreSQL server
1 | systemctl enable --now postgresql-13 |
添加 TimescaleDB 并配置参数
1 | timescaledb-tune --pg-config=/usr/pgsql-13/bin/pg_config |
会出现交互画面,一路 y 即可,此步骤会根据当前机器配置,调整 PostgreSQL 配置参数,并加载 Timescaledb 插件库.
重启 PostgreSQL 生效。
1 | systemctl restart postgresql-13 |
建立 Zabbix 用户:
1 | sudo -u postgres createuser --pwprompt zabbix |
创建 zabbix 数据库:
1 | sudo -u postgres createdb -O zabbix zabbix |
为 Zabbix 数据库启用 TimescleDB 插件:
1 | echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix |
下载源码并导入数据库:
1 | cd /opt |
修改配置允许远程连接:
1 | sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/pgsql/13/data/postgresql.conf |
配置使用 md5 方式认证,修改*/var/lib/pgsql/13/data/pg_hba.conf*,添加如下信息到# IPv4 local connections
之后
1 | host all all 0.0.0.0/0 md5 |
重启 pgsql:
1 | systemctl restart postgresql-13 |
Server 部署
三个节点都执行
1 | rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm |
修改配置文件 /etc/zabbix/zabbix_server.conf:
1 | DBPassword=password |
编辑配置文件 /etc/nginx/conf.d/zabbix.conf:
1 | listen 80; |
💡Tips:同时需要删除*/etc/nginx/nginx.conf*中的80端口相关配置,否则会打不开 Zabbix 前端。
启动 Zabbix server 和 agent 进程
启动 Zabbix server 和 agent 进程,并为它们设置开机自启:
1 | systemctl restart zabbix-server zabbix-agent2 nginx php-fpm |
配置前端
解决乱码问题。手动上传本地 Windows 的字体(如微软雅黑)到 Zabbix 服务器的*/usr/share/zabbix/assets/fonts/,通常 Win10 字体文件在C:\Windows\Fonts*路径下。
1 | cd /usr/share/zabbix/assets/fonts |
启动服务:
1 | systemctl restart zabbix-server zabbix-agent2 nginx php-fpm |
从*/var/log/zabbix/zabbix_server.log*日志文件可见 test-zbx-1 状态为 active:
1 | HA manager started in active mode |
test-zbx-2、test-zbx-3状态为standby:
1 | "test-zbx-2" node started in "standby" mode |
前端配置
连接到新安装的 Zabbix 前端: http://server_ip_or_name
选择中文:
必要条件检测(世界上最好的语言😁):
配置 DB 连接:
时区选择上海:
安装完成,少年😀
默认用户名密码:Admin/zabbix:
可以在报表-系统信息中查看:
配置Agent
HA 方案需要在 Agent 配置文件*/etc/zabbix/zabbix_agent2.conf*中将所有的 Server 节点地址配置到 Server 和 ServerActive 中:
1 | Server=192.168.70.52,192.168.70.53,192.168.70.54 |
重启 agent
1 | systemctl restart zabbix-agent2 |
验证HA
目前 test-zbx-1 为Active
,现把它停用。
执行:
1 | systemctl stop zabbix-server |
可见 test-zbx-1 和 test-zbx-3 状态发生了变化,test-zbx-1 状态变为了Stopped
,test-zbx-3 状态变为了Active
。
同时,test-zbx-3 开始作为 server 工作,数据采集正常。