V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Songxwn
V2EX  ›  推广

跃迁进化 Zabbix 性能: MySQL 转向 TimescaleDB 的实战教程

  •  
  •   Songxwn · 164 天前 · 1034 次点击
    这是一个创建于 164 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    本教程用于 Zabbix 6.0.11-7.4+的数据库从 MySQL 迁移到 PostgreSQL + TimescaleDB ,适用于 Rocky Linux 8-9 系统。内容包括版本检查、准备步骤、迁移过程、功能测试以及启用 TimescaleDB 和性能优化的指导。

    注意:!! 迁移前必须备份好数据,用于失败后回退。

    PS:本教程使用 Zabbix 7.0.12 版本。

    为什么要用 TimescaleDB 时序数据库?

    • 相对于 Mysql 可以更快的读写监控数据,TimescaleDB 利用分区(分块 chunk )的机制,将时间序列数据按时间切分,有效减少单个表的数据量,提升写入吞吐量,适合 Zabbix 这种需要大量实时数据写入的场景。 (至少三倍有以上)

    • 支持监控历史数据压缩,节省存储空间。

    • 删除监控历史数据的性能相对也比 Mysql 更好。

    安装前检查和准备

    Zabbix Server Mysql 包版本检查(下载源码使用)

    zabbix_server -V
    
    zabbix_server (Zabbix) 7.0.12
    
    

    安装 PostgreSQL + TimescaleDB 时序数据库

    配置 PG YUM 源

    sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{centos})-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
    
    # 配置 Postgresql 源
    
    
    sudo tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
    [timescale_timescaledb]
    name=timescale_timescaledb
    baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
    repo_gpgcheck=1
    gpgcheck=0
    enabled=1
    gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
    sslverify=1
    sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    metadata_expire=300
    EOL
    
    
    # 配置 TimescaleDB 源
    
    
    
    dnf -qy module disable postgresql
    # 关闭系统的 PG 源
    
    

    PG 安装和初始化

    dnf install timescaledb-2-postgresql-16 postgresql16-contrib -y
    # 安装 postgresql 和 timescaledb
    
    
    sudo -u postgres /usr/pgsql-16/bin/initdb --encoding=UTF8 --locale=en_US.UTF-8 -D /var/lib/pgsql/16/data
    
    # 初始化数据库,指定数据库编码。
    
    timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=256
    
    # 自动调优参数,一路 yes 即可
    
    sudo systemctl enable --now postgresql-16
    # 配置 PG 开机启动,并启动
    
    sudo systemctl status postgresql-16
    ss -an | grep 5432
    # 检查状态是否正常
    
    sudo -u postgres psql
    \password postgres
    \q
    # 进入 psql 然后配置管理员密码,并退出。
    
    sudo -u postgres createuser --pwprompt zabbix
    # 创建 zabbix 用户并配置密码,我这里配置密码为 Songxwn.com
    
    sudo -u postgres createdb -O zabbix zabbix
    # 创建 zabbix 数据库并指定所属用户为 zabbix.
    
    

    安装转换数据库工具 - pgloader

    dnf install pgloader -y
    
    pgloader -V
    
    # 安装转换工具 ( pgloader 是一款开源的数据迁移和加载工具)
    

    准备使用 pgloader 迁移

    生成 Zabbix 数据库结构 SQL

    mkdir /opt/zabbix-db-migration/ && cd $_
    
    
    # 创建一个迁移用文件夹
    
    
    wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.12.tar.gz
    
    # 在迁移用文件夹内下载第一步检查获取版本的对应版本 Zabbix 源码,这里是 7.0.12 。
    
    
    tar -zxvf zabbix-*.tar.gz
    
    # 在迁移用文件夹内解压
    
    cd /opt/zabbix-db-migration/zabbix-*/database/postgresql/
    
    # 进入 PG 数据库文件目录
    
    
    
    grep -v 'ALTER TABLE ONLY' schema.sql | grep -v INSERT | grep -v 'CREATE INDEX' | grep -v 'CREATE UNIQUE INDEX' > /opt/zabbix-db-migration/create_tables.sql
    
    sed -i '/create\ or\ replace\ function/,$d' /opt/zabbix-db-migration/create_tables.sql
    
    awk '/INSERT INTO dbversion/{p=1;next} /ALTER TABLE/{p=0} p' schema.sql > /opt/zabbix-db-migration/triggers.sql
    
    grep -E 'CREATE INDEX|CREATE UNIQUE INDEX' schema.sql > /opt/zabbix-db-migration/create_index.sql
    
    grep 'ALTER TABLE ONLY' schema.sql > /opt/zabbix-db-migration/alter_table.sql
    
    ## 分五个步骤生成结构 SQL 用于转换使用。
    
    

    准备 PostgreSQL

    注意:Zabbix 用户和 zabbix 数据库之前步骤已创建。

    
    sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/create_tables.sql
    
    
    # 导入 SQL ,需要输入配置的 zabbix 用户密码
    
    
    sudo -u postgres psql -c "SET password_encryption='md5';"
    sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD 'Songxwn.com';"
    
    # 为了与 pgloader 程序兼容,请暂时将加密哈希设置为“md5”并更改创建的数据库用户的密码,以便在给定的哈希算法中重新生成该密码。为简单起见,最好使用您在创建此用户时输入的相同密码。
    
    

    准备 MySQL

    vim /etc/my.cnf.d/mysql-server.cnf
    [mysqld]
    
    default-authentication-plugin=mysql_native_password
    
    # 在[mysqld]下添加以上参数给予 Mysql
    
    systemctl restart mysqld
    
    # 然后重启使其生效。
    
    
    

    创建访问 MySQL Zabbix 数据库的用户

    
    mysql -uroot -p
    
    CREATE USER 'zabbix'@'127.0.0.1' IDENTIFIED BY 'Songxwn.com';
    
    # 已有 zabbix 用户可以忽略
    
    GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'127.0.0.1';
    FLUSH PRIVILEGES;
    
    
    SELECT User, Host FROM mysql.user WHERE User='zabbix';
    
    # 确认已经修改完成。
    
    \q
    
    

    创建 pgloader 配置文件

    vim /opt/zabbix-db-migration/pgloader.conf
    
    LOAD DATABASE
    FROM mysql://zabbix:[email protected]/zabbix
    INTO postgresql://zabbix:[email protected]/zabbix
    WITH include no drop,
    truncate,
    create no tables,
    create no indexes,
    no foreign keys,
    reset sequences,
    data only,
    prefetch rows = 1000,
    batch rows = 1000,
    batch concurrency = 1
    ALTER SCHEMA 'zabbix' RENAME TO 'public';
    
    

    配置文件说明

    原有的 Zabbix Mysql 连接信息:用户名 zabbix 、密码为 Songxwn.com 、连接地址为 127.0.0.1 、数据名称为 zabbix 。

    新建的 Zabbix Postgresql 连接信息:用户名 zabbix 、密码为 Songxwn.com 、连接地址为 127.0.0.1 、数据名称为 zabbix 。

    • **FROM mysql://...**:从 MySQL 数据库 zabbix 读取数据。

    • **INTO postgresql://...**:把数据导入到 PostgreSQL 数据库 zabbix

    • WITH 参数说明

      • include no drop:迁移过程中不要执行 DROP 操作,不会删除表或其他对象。

      • truncate:在导入数据之前先清空目标表(删除旧数据)。

      • create no tables:不创建表,默认你 PostgreSQL 中已经有对应表结构。

      • create no indexes:不创建索引。

      • no foreign keys:不创建外键。

      • reset sequences:重置序列(自增 ID )以保证正确。

      • data only:只导入数据,不导入表结构。

      • prefetch rows = 1000batch rows = 1000batch concurrency = 1:控制数据批量读取和加载的参数,性能相关。

    • **ALTER SCHEMA 'zabbix' RENAME TO 'public'**:把导入的 zabbix schema 重命名为 PostgreSQL 默认的 public schema 。

    使用 pgloader 开始正式迁移

    systemctl stop zabbix-server httpd nginx
    
    # 停止 zabbix 后端和前端服务
    
    mkdir /opt/zabbix-db-migration/data
    
    # 创建数据存储文件夹
    
    pgloader --root-dir=/opt/zabbix-db-migration/data /opt/zabbix-db-migration/pgloader.conf
    
    # 开始转换,转换日志最后一行有 Total import time 字段,代表转换完成。
    
    

    将 PG 加密方式切换回去和初始化数据库结构

    sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';"
    sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD 'Songxwn.com';"
    
    # 切换加密方式并重新设定密码
    
    sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/create_index.sql
    
    sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/alter_table.sql
    
    sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/triggers.sql
    
    sudo -u postgres vacuumdb --dbname=zabbix --analyze --username=postgres --jobs=$(grep -c processor /proc/cpuinfo)
    
    ## 创建索引架构、告警、触发器并清理数据库。
    
    

    卸载 Zabbix Mysql 版本安装配置 Zabbix pgsql 版本

    
    cp  /etc/zabbix/zabbix_server.conf /opt/zabbix-db-migration/
    
    # 卸载前备份配置文件
    
    dnf remove zabbix-server-mysql zabbix-web-mysql -y
    
    dnf install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf -y
    
    

    修改 Zabbix_server 配置文件

    vim /etc/zabbix/zabbix_server.conf
    
    DBName=zabbix
    DBPassword=Songxwn.com
    
    ### 增加数据库用户密码配置
    
    rm /etc/zabbix/web/zabbix.conf.php
    
    # 删除 Web 配置文件
    
    systemctl restart zabbix-server nginx
    
    # 启动 Zabbix
    
    cat /var/log/zabbix/zabbix_server.log
    
    # 查看启动日志
    

    Zabbix Web 初始化

    登录 Zabbix Web

    输入 PG 数据库连接信息(主要是密码)

    配置 Zabbix 主机名称和时区 - 完成安装

    停止无用的 Mysql

    systemctl disable --now mysqld
    
    

    开启时序数据库 TimescaleDB

    systemctl stop zabbix-server
    
    
    echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql --dbname=zabbix
    
    sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/zabbix-7.*/database/postgresql/timescaledb/schema.sql
    
    
    
    
    

    修改数据库允许兼容性并启动 Zabbix Server

    vim /etc/zabbix/zabbix_server.conf
    
    AllowUnsupportedDBVersions=1
    
    # 添加以上字段,因为 zabbix 会拒绝较新未支持的数据库版本,所以需要修改允许一下。
    
    systemctl restart zabbix-server
    
    # 重启
    

    转换到时序数据库完成确认

    其他版本

    本教程使用 Zabbix 7.0.12 、Rocky Linux 8 作为示例,如果需要其他版本或帮助请加入知识星球。

    运维技术交流群

    发送邮件到 ➡️ [email protected]

    或者关注 WX 公众号:网工格物

    微信扫码

    博客(最先更新)

    https://songxwn.com/

    qW7bo2FbzbC0
        1
    qW7bo2FbzbC0  
       164 天前   ❤️ 1
    @livid 推广
    Livid
        2
    Livid  
    MOD
    PRO
       164 天前
    @qW7bo2FbzbC0 谢谢,这个广告贴已经被移动并下沉。这个账号会被降权。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2663 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:20 · PVG 22:20 · LAX 07:20 · JFK 10:20
    ♥ Do have faith in what you're doing.