暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Zabbix 6 基于 OB 4.2 MySQL 部署实践

1840

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_typecount(*)

                                      [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.name<>old.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.name<>old.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 < ?

                                          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 监控逻辑很简单,是它流行的主要原因。针对监控对象(主机和数据库)定义监控指标,然后就是套常用的公式去计算、展示指标、预警指标。并不深入到主机或数据库的内部复杂逻辑。所以也使得其在性能问题分析时作用有限,非常依赖运维人员自身的分析经验。为了降低运维门槛,数据库监控还是要看专业领域内的监控产品。


                                          更多阅读

                                          文章转载自数据库技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                          评论