简介
本教程用于 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:Songxwn.com@127.0.0.1/zabbix
INTO postgresql://zabbix:Songxwn.com@127.0.0.1/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 = 1000
、batch rows = 1000
、batch 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作为示例,如果需要其他版本或帮助请加入知识星球。
# 运维技术交流群
发送邮件到 ➡️ <me@songxwn.com>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。