ITPub博客

首页 > 数据库 > 数据库开发技术 > Zabbix 6 基于 OB 4.2 MySQL 部署实践

Zabbix 6 基于 OB 4.2 MySQL 部署实践

原创 数据库开发技术 作者:plvision 时间:2024-05-11 20:12:13 0 删除 编辑

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.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.conf
DBHost=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: usmAES192PrivProtocol                                                                            May 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.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 ~]# 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 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 -AWelcome to the MariaDB monitor.  Commands end with ; or \g.Your MySQL connection id is 96129Server 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_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 监控逻辑很简单,是它流行的主要原因。针对监控对象(主机和数据库)定义监控指标,然后就是套常用的公式去计算、展示指标、预警指标。并不深入到主机或数据库的内部复杂逻辑。所以也使得其在性能问题分析时作用有限,非常依赖运维人员自身的分析经验。为了降低运维门槛,数据库监控还是要看专业领域内的监控产品。


更多阅读

原文作者:数据库技术闲谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-11-02

  • 博文量
    156
  • 访问量
    96862