本教程用于 Zabbix 6.0.11-7.4+的数据库从 MySQL 迁移到 PostgreSQL + TimescaleDB ,适用于 Rocky Linux 8-9 系统。内容包括版本检查、准备步骤、迁移过程、功能测试以及启用 TimescaleDB 和性能优化的指导。
注意:!! 迁移前必须备份好数据,用于失败后回退。
PS:本教程使用 Zabbix 7.0.12 版本。
相对于 Mysql 可以更快的读写监控数据,TimescaleDB 利用分区(分块 chunk )的机制,将时间序列数据按时间切分,有效减少单个表的数据量,提升写入吞吐量,适合 Zabbix 这种需要大量实时数据写入的场景。 (至少三倍有以上)
支持监控历史数据压缩,节省存储空间。
删除监控历史数据的性能相对也比 Mysql 更好。
zabbix_server -V
zabbix_server (Zabbix) 7.0.12
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 源
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.
dnf install pgloader -y
pgloader -V
# 安装转换工具 ( pgloader 是一款开源的数据迁移和加载工具)
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 用于转换使用。
注意: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”并更改创建的数据库用户的密码,以便在给定的哈希算法中重新生成该密码。为简单起见,最好使用您在创建此用户时输入的相同密码。
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
# 在[mysqld]下添加以上参数给予 Mysql
systemctl restart mysqld
# 然后重启使其生效。
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
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 = 1000
、batch rows = 1000
、batch concurrency = 1
:控制数据批量读取和加载的参数,性能相关。
**ALTER SCHEMA 'zabbix' RENAME TO 'public'**:把导入的 zabbix
schema 重命名为 PostgreSQL 默认的 public
schema 。
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 字段,代表转换完成。
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)
## 创建索引架构、告警、触发器并清理数据库。
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
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
# 查看启动日志
systemctl disable --now mysqld
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
vim /etc/zabbix/zabbix_server.conf
AllowUnsupportedDBVersions=1
# 添加以上字段,因为 zabbix 会拒绝较新未支持的数据库版本,所以需要修改允许一下。
systemctl restart zabbix-server
# 重启
本教程使用 Zabbix 7.0.12 、Rocky Linux 8 作为示例,如果需要其他版本或帮助请加入知识星球。
发送邮件到 ➡️ [email protected]
或者关注 WX 公众号:网工格物
![]() |
1
qW7bo2FbzbC0 164 天前 ![]() @livid 推广
|
![]() |
2
Livid MOD PRO @qW7bo2FbzbC0 谢谢,这个广告贴已经被移动并下沉。这个账号会被降权。
|