Zabbix 是流行了二十多年的开源监控产品,其元数据库支持 MySQL、PostgreSQL。Zabbix 近期跟 OceanBase 完成一个兼容性验证,正好也有客户自己将元数据库从 MySQL迁移到 OceanBase 社区版 4.2。故本文分享 Zabbix 基于 OB 的部署和运维经验。
Zabbix 6 安装部署
官网路径: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.rpm
dnf 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.conf
DBHost=10.0.0.63
DBName=zabbix6
DBUser=zabbix@obmysql#obv4
DBPassword=zab@BIX#123
DBPort=2883
AllowUnsupportedDBVersions=1
5. 修改 Nginx 的配置文件。
vim etc/nginx/conf.d/zabbix.conf
listen 8080;
server_name server070;
6. 启动 Zabbix 相关服务并设置为自动启动。
systemctl restart zabbix-server zabbix-agent nginx php-fpm
systemctl enable zabbix-server zabbix-agent nginx php-fpm
systemctl 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: usmAES192PrivProtocol
May 11 10:05:32 server070 systemd[1]: zabbix-server.service: Control process exited, code=exited status=127
May 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.conf
7704: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 ~]# getenforce
Enforcing
[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 database
8083:20240511:122233.620 Unsupported DB! MySQL version 50625 is older than minimum required 50728
8083:20240511:122233.620
8083: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 -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 96129
Server version: 5.6.25
Copyright (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 。
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_insert
before insert on hosts for each row
set new.name_upper=upper(new.name);
CREATE TRIGGER hosts_name_upper_update BEFORE UPDATE ON hosts FOR EACH ROW trigger hosts_name_upper_update
before update on hosts for each row
begin
if new.nameold.name
then
set 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_insert
before insert on items for each row
set new.name_upper=upper(new.name);
CREATE TRIGGER items_name_upper_update BEFORE UPDATE ON items FOR EACH ROW trigger items_name_upper_update
before update on items for each row
begin
if new.nameold.name
then
set new.name_upper=upper(new.name);
end if;
end;
业务大部分 SQL 都很简单,稍微特殊的SQL 有表 history_uint 的批量插入。此外 Zabbix 的 Housekeep 逻辑也会定时清理数据,清理逻辑初步看起来是按 item 挨个根据时间清理。
DELETE FROM history_uint WHERE itemid = ? AND clock