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

本文最后更新于 2025年4月24日 晚上

简介

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

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

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

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

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

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

安装前检查和准备

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

1
2
3
4
zabbix_server -V

zabbix_server (Zabbix) 7.0.12

安装PostgreSQL + TimescaleDB时序数据库

配置PG YUM源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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安装和初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
dnf install timescaledb-2-postgresql-16 -y
# 安装postgresql 和 timescaledb

sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
# 初始化数据库

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用户并配置密码

sudo -u postgres createdb -O zabbix zabbix
# 创建zabbix数据库并指定所属用户为zabbix.

安装转换数据库工具 - pgloader

1
2
3
4
5
dnf install pgloader -y

pgloader -V

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

准备使用pgloader迁移

生成Zabbix数据库结构SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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数据库之前步骤已创建。

1
2
3
4
5
6
7
8
9
10
11
12

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

1
2
3
4
5
6
7
8
9
10
11
12
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
...
default-authentication-plugin=mysql_native_password

# 添加以上参数给予Mysql

systemctl restart mysqld

# 然后重启使其生效。


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

1
2
3
4
5
6
7
8
9
10
11
12

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;

\q

创建pgloader 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 开始正式迁移

1
2
3
4
5
6
7
8
9
10
11
12
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

# 开始转换

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

cp /etc/zabbix/zabbix_server.conf /opt/zabbix-db-migration/

# 卸载前备份配置文件

dnf remove zabbix-server-mysql zabbix-web-mysql -y

yum install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf -y

```

## 修改Zabbix_server 配置文件

```bash
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

1
2
systemctl disable --now mysqld

开启时序数据库 TimescaleDB

1
2
3
4
5
6
7
8
9
10
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

1
2
3
4
5
6
7
8
9
vim /etc/zabbix/zabbix_server.conf

AllowUnsupportedDBVersions=1

# 添加以上字段,因为zabbix会拒绝较新未支持的数据库版本,所以需要修改允许一下。

systemctl restart zabbix-server

# 重启

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

运维技术交流群

发送邮件到 ➡️ [email protected]

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

微信扫码

博客(最先更新)

https://songxwn.com/

参考

https://www.initmax.com/wiki/zabbix-migration-from-mysql-to-postgresql/


跃迁进化Zabbix性能:MySQL转向TimescaleDB的实战教程
https://songxwn.com/zabbix-MYSQLtoTimescaleDB/
作者
Song
发布于
2025年4月24日
更新于
2025年4月24日
许可协议