Zabbix 是流行了二十多年的开源监控产品,其元数据库支持 MySQL、PostgreSQL。Zabbix 近期跟 OceanBase 完成一个兼容性验证,正好也有客户自己将元数据库从 MySQL迁移到 OceanBase 社区版 4.2。故本文分享 Zabbix 基于 OB 的部署和运维经验。
官网路径:https://www.zabbix.com/download 。Zabbix 服务端 6.0 LTS 版本部署需要 Redhat 8 或 Centos 8 版本.

部署过程很简单。
1. 安装 Zabbix 的 Repository。
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpmdnf clean all
2. 安装 Zabbix 的 Server,fronted,agent 模块。
dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent
3. 准备数据库(OB 的 MySQL 租户)。
OCP 分配 MySQL 租户,资源规格 4C4G 。创建数据库 zabbix6 和 用户名 zabbix ,赋予 zabbix 操作数据库 zabbix6 所有权限。这些通过 OCP 操作就不重复了。
初始化 Zabbix 元数据库,将 OB 的 MySQL 租户当 MySQL 用。
zcat usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h10.0.0.63 -uzabbix@obmysql#obv4 -P2883 -pzab@BIX#123 -c -A zabbix6
这个步骤会需要点时间,可以通过 OCP 租户的【租户会话】功能查看正在执行的 SQL 。

4. 修改 Zabbix Server 的配置文件。
vim etc/zabbix/zabbix_server.confDBHost=10.0.0.63DBName=zabbix6DBUser=zabbix@obmysql#obv4DBPassword=zab@BIX#123DBPort=2883AllowUnsupportedDBVersions=1
5. 修改 Nginx 的配置文件。
vim etc/nginx/conf.d/zabbix.conflisten 8080;server_name server070;
6. 启动 Zabbix 相关服务并设置为自动启动。
systemctl restart zabbix-server zabbix-agent nginx php-fpmsystemctl enable zabbix-server zabbix-agent nginx php-fpmsystemctl status zabbix-server zabbix-agent nginx php-fpm
如果启动碰到下面报错,需要安装或升级一下 net-snmp 版本。
May 11 10:05:32 server070 zabbix_server[29247]: usr/sbin/zabbix_server: symbol lookup error: usr/sbin/zabbix_server: undefined symbol: usmAES192PrivProtocolMay 11 10:05:32 server070 systemd[1]: zabbix-server.service: Control process exited, code=exited status=127May 11 10:05:32 server070 systemd[1]: zabbix-server.service: Failed with result 'exit-code'.May 11 10:05:32 server070 systemd[1]: Failed to start Zabbix Server.
dnf -y install net-snmp.x86_64
查看 Zabbix 日志。
tail -n 50 /var/log/zabbix/zabbix_server.log -f
在确认数据库连接配置正常的情况下,如果报错无法连接数据库,则看看是不是 SELinux 设置问题。
7704:20240511:121338.429 using configuration file: etc/zabbix/zabbix_server.conf7704:20240511:121338.432 [Z3001] connection to database 'zabbix' failed: [2002] Can't connect to MySQL server on '10.0.0.63' (13)7704:20240511:121338.432 database is down: reconnecting in 10 seconds
[root@server070 ~]# getenforceEnforcing[root@server070 ~]# setenforce 0
如果报错数据库版本不支持,即使此时设置配置文件的 AllowUnsupportedDBVersions 参数,还是启动报错。此时需要修改 OBProxy 的版本参数。
8083:20240511:122233.607 Zabbix supports only "utf8_bin,utf8mb3_bin,utf8mb4_bin" collation(s). Database "zabbix" has default collation "utf8mb4_general_ci"8083:20240511:122233.615 character set name or collation name that is not supported by Zabbix found in 480 column(s) of database "zabbix"8083:20240511:122233.615 only character set(s) "utf8,utf8mb3,utf8mb4" and corresponding collation(s) "utf8_bin,utf8mb3_bin,utf8mb4_bin" should be used in database8083:20240511:122233.620 Unsupported DB! MySQL version 50625 is older than minimum required 507288083:20240511:122233.6208083:20240511:122233.620 Unable to start Zabbix server due to unsupported MySQL database version (5.06.25).8083:20240511:122233.620 Must be at least (8.00.0).8083:20240511:122233.620 Use of supported database version is highly recommended.8083:20240511:122233.620
建议在 OCP 里修改这个参数。
[root@server063 ~]# mysql -h10.0.0.63 -uroot@proxysys -P2883 -paaAA11__ -c -AWelcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 96129Server version: 5.6.25Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.(root@proxysys@10.0.0.63:2883) [(none)]> alter proxyconfig set mysql_version='8.0.26';Query OK, 0 rows affected (0.06 sec)(root@proxysys@10.0.0.63:2883) [(none)]> show proxyconfig like '%mysql_version%';+---------------+--------+--------------------------------------------------------------------------------------------------------------------------+-------------+---------------+| name | value | info | need_reboot | visible_level |+---------------+--------+--------------------------------------------------------------------------------------------------------------------------+-------------+---------------+| mysql_version | 8.0.26 | returned version for mysql mode, default value is 5.6.25. If set, proxy will send new version when user connect to proxy | false | USER |+---------------+--------+--------------------------------------------------------------------------------------------------------------------------+-------------+---------------+1 row in set (0.00 sec)
7. 安装中文语言包。
OS 安装一下中文语言包,否则 Zabbix 可能不能改为中文。
dnf install -y glibc-langpack-zh
8. 登录 zabbix。
第一次登录 Zabbix 首页会跳转到初始化界面。
http://10.0.0.70:8080/setup.php



这个报错信息在前面也看到过,前面的日志里提示的很清楚,zabbix 只支持某些字符集和 collate 规则。解决方法重建数据库 zabbix6 和元数据表。
drop database zabbix6;create database zabbix6 character set utf8mb4 collate utf8mb4_bin;grant all privileges on zabbix6.* to zabbix;
重新初始化表和重启 Zabbix 服务。
zcat usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h10.0.0.63 -uzabbix@obmysql#obv4 -P2883 -pzab@BIX#123 -c -A zabbix6
然后数据库连接成功,继续下一步。




默认用户名/密码:Admin/zabbix 。
1. 数据特征分析
Zabbix 的表结构类型主要是数值型和字符串文本,数值列占比超过60%,设计上就非常节省存储空间。
SELECT column_type,count(*) FROM information_schema.columns WHERE table_schema='zabbix6'GROUP BY column_type WITH ROLLUP ORDER BY column_type;
| column_type | count(*) |
|---|---|
[NULL] | 1,335 |
bigint(20) unsigned | 405 |
double | 9 |
int(11) | 440 |
longblob | 1 |
longtext | 3 |
text | 46 |
varchar(1) | 1 |
varchar(100) | 5 |
varchar(1024) | 12 |
varchar(12) | 1 |
varchar(128) | 33 |
varchar(16) | 3 |
varchar(20) | 1 |
varchar(2048) | 32 |
varchar(25) | 5 |
varchar(255) | 161 |
varchar(32) | 49 |
varchar(39) | 11 |
varchar(5) | 1 |
varchar(50) | 3 |
varchar(512) | 3 |
varchar(6) | 26 |
varchar(60) | 1 |
varchar(64) | 80 |
varchar(7) | 1 |
varchar(96) | 2 |
业务表设计基本遵守第三范式,大量使用联合主键和外键,不少还是 CASCADE 外键。这个使用 OMS 将数据从 MySQL 迁移到 OB(MySQL)的时候需要先在租户里禁用外键。
Zabbix 的大表数据增长量是非常快的。下面是 生产环境的监控数据。最大的几个表的数据量在亿级别,在 OB 里单副本容量最大也不过13 G 。
表 | 记录数 | OB 单副本容量(G) |
history | 419933523 | 8.67 |
history_uint | 899855555 | 10.43 |
auditlog | 64168141 | 6.44 |
auditlog_bak | 145700404 | 12.85 |
trends | 245233295 | 3.17 |
trends_uint | 393926769 | 2.00 |
上面几个表都很大,适合改造成分区表。组合分区,第一级按时间字段(clock数值)做 RANGE 分区(按周或按月分区),第二级分区可选,按 itemid 做 HASH 分区。目前加分区还要手动执行。这样的二级分区加分分区的时候只需要加一级分区即可。
Zabbix 数据库里还有 4个 BEFORE INSERT/UPDATE 类型触发器,逻辑比较简单。OB 4.2 MySQL 租户也都兼容。
CREATE TRIGGER hosts_name_upper_insert BEFORE INSERT ON hosts FOR EACH ROW trigger hosts_name_upper_insertbefore insert on hosts for each rowset new.name_upper=upper(new.name);CREATE TRIGGER hosts_name_upper_update BEFORE UPDATE ON hosts FOR EACH ROW trigger hosts_name_upper_updatebefore update on hosts for each rowbeginif new.name<>old.namethenset new.name_upper=upper(new.name);end if;end;CREATE TRIGGER items_name_upper_insert BEFORE INSERT ON items FOR EACH ROW trigger items_name_upper_insertbefore insert on items for each rowset new.name_upper=upper(new.name);CREATE TRIGGER items_name_upper_update BEFORE UPDATE ON items FOR EACH ROW trigger items_name_upper_updatebefore update on items for each rowbeginif new.name<>old.namethenset new.name_upper=upper(new.name);end if;end;
业务大部分 SQL 都很简单,稍微特殊的SQL 有表 history_uint 的批量插入。此外 Zabbix 的 Housekeep 逻辑也会定时清理数据,清理逻辑初步看起来是按 item 挨个根据时间清理。
DELETE FROM history_uint WHERE itemid = ? AND clock < ?
2. 性能分析
租户 24小时内 SQL 总体读写比例 5:6 。平均耗时水平也很低(主要得益于 Zabbix 的表结构和 SQL 设计)。


初次迁移过来为确保性能稳定,租户的Primary Zone 设置为单 Zone 。所以,SQL执行计划 类型都是本地执行计划。

内存方面,增量内存转储比较多。
目前这样的数据量下,每天大合并一次,其他时间都是自动转储。OCP 提示租户平均转储次数 3000+,实际观察内存变化平均每小时转储 2 次 。OCP 的统计逻辑还需要确认,可能是 BUg, 也可能跟 4.2 以后有些表写入优化,会自动转储有关。
转储参数 freeze_trigger_percentage=70 ,增量内存参数 memstore_limit_percentage=50 。


总结
从客户自行操作经验来看,Zabbix 数据库从MySQL 迁移到 OB 的MySQL 租户还是比较顺利。使用 OMS 社区版做数据迁移,表结构里稍微有点曲折的就是外键表的迁移会影响数据同步,需要提前将租户的外键约束检查关闭,迁移完后再开启。估计Zabbix 的所有表都有主键,所以 OMS 做 MySQL 数据迁移还是很顺利的。Zabbix 的数据量增长非常快,客户服务器稍具规模监控几个月后,大表数据量就容易上亿。在 MySQL 里性能会下降比较明显,需要 Zabbix 自动清理历史数据。在 OB 里,使用分区表技术,加上数据压缩以及 OB SQL 自身能力,这些数据的存储空间成本非常低,性能衰减也不会那么明显,所以也不用频繁的清理历史数据。
Zabbix 监控逻辑很简单,是它流行的主要原因。针对监控对象(主机和数据库)定义监控指标,然后就是套常用的公式去计算、展示指标、预警指标。并不深入到主机或数据库的内部复杂逻辑。所以也使得其在性能问题分析时作用有限,非常依赖运维人员自身的分析经验。为了降低运维门槛,数据库监控还是要看专业领域内的监控产品。




