Zabbix 6 基于 OB 4.2 MySQL 部署实践

2024年 5月 13日 171.6k 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 版本.

Zabbix 6 基于 OB 4.2 MySQL 部署实践-1

部署过程很简单。

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 。

        Zabbix 6 基于 OB 4.2 MySQL 部署实践-2

        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 6 基于 OB 4.2 MySQL 部署实践-3

                                Zabbix 6 基于 OB 4.2 MySQL 部署实践-4

                                Zabbix 6 基于 OB 4.2 MySQL 部署实践-5

                                这个报错信息在前面也看到过,前面的日志里提示的很清楚,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

                                    然后数据库连接成功,继续下一步。

                                    Zabbix 6 基于 OB 4.2 MySQL 部署实践-6

                                    Zabbix 6 基于 OB 4.2 MySQL 部署实践-7

                                    Zabbix 6 基于 OB 4.2 MySQL 部署实践-8

                                    Zabbix 6 基于 OB 4.2 MySQL 部署实践-9

                                    默认用户名/密码: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 

                                          相关文章

                                          Oracle如何使用授予和撤销权限的语法和示例
                                          Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
                                          下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
                                          社区版oceanbase安装
                                          Oracle 导出CSV工具-sqluldr2
                                          ETL数据集成丨快速将MySQL数据迁移至Doris数据库

                                          发布评论