Zabbix5.0 的数据库迁移(从MariaDB到TimescaleDB)
首先
我们在使用MariaDB运营Zabbix数据库的时候,发现history syncer internal processes等数值定期上升,因此决定迁移到时序数据库TimescaleDB。本文总结了在验证环境中的验证结果。
环境
由于一个年前搭建了验证环境,我们在更新Zabbix版本(5.0.15)后进行了验证。
我们使用了PostgreSQL和TimescaleDB的社区版。
转型的趋势
我們將按照以下方式進行轉移。
-
- 停用Zabbix服务器
-
- 卸载/安装Zabbix相关软件包
-
- 安装和配置PostgreSQL
-
- 使用pgloader进行迁移
-
- 安装和应用TimescaleDB
-
- 停用MariaDB
-
- 配置和启动Zabbix服务器
- 生成和安装SELinux模块
1. 停止Zabbix服务器。
为了防止数据库的值更新,停止Zabbix服务器。
sudo systemctl stop zabbix-server
2. 卸载或安装Zabbix相关软件包。
卸载用于 MySQL 连接的 Zabbix 相关软件包,并安装用于 PostgreSQL 连接的 Zabbix 相关软件包。
sudo dnf remove -y zabbix-server-mysql
sudo dnf install -y zabbix-server-pgsql
sudo dnf remove -y zabbix-web-mysql
sudo dnf install -y zabbix-web-pgsql zabbix-apache-conf
3. 安装和配置PostgreSQL。
根据PostgreSQL官方网站的手册,进行PostgreSQL的安装和设置。
安装存储库。
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
禁用随操作系统捆绑的PostgreSQL模块。
sudo dnf -qy module disable postgresql
安装社区版 PostgreSQL。
sudo dnf install -y postgresql12-server
初始化数据库。
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
更改连接设置。
sudo cp -p /var/lib/pgsql/12/data/pg_hba.conf{,.default}
sudo vi /var/lib/pgsql/12/data/pg_hba.conf
sudo diff -u /var/lib/pgsql/12/data/pg_hba.conf{.default,}
--- /var/lib/pgsql/12/data/pg_hba.conf.default 2021-09-26 16:42:06.589004356 +0900
+++ /var/lib/pgsql/12/data/pg_hba.conf 2021-09-26 16:46:38.837010714 +0900
@@ -83,9 +83,9 @@
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
-host all all 127.0.0.1/32 ident
+host all all 127.0.0.1/32 md5
# IPv6 local connections:
-host all all ::1/128 ident
+host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
我們將啟動並設定 PostgreSQL 的自動啟動。
sudo systemctl start postgresql-12
sudo systemctl status postgresql-12
sudo systemctl enable postgresql-12
创建用户和数据库。
cd /var/tmp
sudo -u postgres createuser --pwprompt zabbix
sudo -u postgres createdb -O zabbix zabbix
4. 使用pgloader进行迁移
安装pgloader并将数据从MariaDB迁移到PostgreSQL。
值得注意的是,epel或PostgreSQL的仓库中没有pgloader的软件包。为了验证和单独执行的目的,我们安装了第三方软件包,但也可以编译pgloader的源码。
安装。
sudo dnf install -y https://pkgs.dyn.su/el8/base/x86_64/pgloader-3.6.2-1.el8.x86_64.rpm
我会准备适用于模式注册的SQL和导入到pgloader的命令。
mkdir /var/tmp/pgzabbix
cd /var/tmp/pgzabbix
gzip -d -c /usr/share/doc/zabbix-server-pgsql/create.sql.gz > schema.sql
sed '/INSERT.*/,$d' schema.sql > create.sql
grep ^ALTER schema.sql > alter.sql
vi commands.load
LOAD DATABASE FROM mysql://zabbix:PASSWORD@localhost/zabbix INTO postgresql://zabbix:PASSWORD@localhost/zabbix
WITH include no drop, truncate, create no tables, create no indexes, no foreign keys, reset sequences,
data only SET maintenance_work_mem TO '1024MB', work_mem to '256MB'
ALTER SCHEMA 'zabbix' RENAME TO 'public'
BEFORE LOAD EXECUTE create.sql
AFTER LOAD EXECUTE alter.sql;
我要搬家了。
pgloader mysql://zabbix:PASSWORD@localhost/zabbix postgresql://zabbix:PASSWORD@localhost/zabbix
pgloader commands.load
为了确认行动,首先需要确认日志。
less /tmp/pgloader/pgloader.log
确认编码为UTF-8。
mysql -u zabbix -p -e "SHOW CREATE DATABASE zabbix;"
sudo -u postgres psql -U postgres -l
我要检查一下桌子。
mysql -u zabbix -p -e "SHOW TABLES FROM zabbix;"
psql -U zabbix -d zabbix -c "\dt" -h localhost
我原本以為 PostgreSQL 的模式是 public,但卻是 zabbix。
可能是因為已經有一個名為 public 的模式存在,所以無法更改名稱。
即使無法更改,我們可以通過設定參考來處理,所以我們決定繼續進行下去。
5. 安装和应用TimescaleDB。
安装TimescaleDB。
sudo dnf -y install timescaledb_12
由于提供了一个名为timescaledb-tune的工具,可以用来编辑TimescaleDB的设置(postgresql.conf),因此我们可以使用该工具。
sudo cp -p /var/lib/pgsql/12/data/postgresql.conf{,.default}
sudo dnf install -y https://packagecloud.io/timescale/timescaledb/el/8/x86_64/timescaledb-tools-0.11.0-0.el8.x86_64.rpm
sudo timescaledb-tune -pg-config /usr/pgsql-12/bin/pg_config
sudo diff -u /var/lib/pgsql/12/data/postgresql.conf{.default,}
请确认以下行已经被添加。
+shared_preload_libraries = 'timescaledb' # (change requires restart)
重新启动 PostgreSQL。
sudo systemctl restart postgresql-12
将 TimescaleDB 应用于 Zabbix 数据库。
echo "CREATE EXTENSION IF NOT EXISTS timescaledb SCHEMA zabbix CASCADE;" | sudo -u postgres psql -U postgres zabbix
gzip -d -c /usr/share/doc/zabbix-server-pgsql/timescaledb.sql.gz > timescaledb.sql
cat timescaledb.sql | psql -U zabbix zabbix -h localhost
作为操作确认,将确认 history 数据库表的状态。
psql -U zabbix -d zabbix -c "\d+ history;" -h localhost
テーブル"zabbix.history"
列 | 型 | 照合順序 | Null 値を許容 | デフォルト | ストレージ | 統計目標 | 説明
--------+------------------+----------+---------------+-----------------------+------------+----------+------
itemid | numeric | | not null | | main | |
clock | bigint | | not null | '0'::bigint | plain | |
value | double precision | | not null | '0'::double precision | plain | |
ns | bigint | | not null | '0'::bigint | plain | |
インデックス:
"history_clock_idx" btree (clock DESC)
"idx_16883_history_1" btree (itemid, clock)
トリガー:
ts_insert_blocker BEFORE INSERT ON history FOR EACH ROW EXECUTE FUNCTION _timescaledb_internal.insert_blocker()
子テーブル: _timescaledb_internal._hyper_1_1_chunk,
_timescaledb_internal._hyper_1_2_chunk
アクセスメソッド: heap
可以确认创建了用于分区的BEFORE INSERT触发器,并且子表存在。
6. 停止MariaDB
由于不再需要 MariaDB,所以将停止使用。
sudo systemctl stop mariadb
sudo systemctl disable mariadb
7. Zabbix服务器的配置和启动
进行PostgreSQL连接的设置。
cd /etc/zabbix
sudo cp -p zabbix_server.conf{,.default}
sudo vi zabbix_server.conf
sudo diff -u zabbix_server.conf{.default,}
--- zabbix_server.conf.default 2021-08-30 18:32:00.000000000 +0900
+++ zabbix_server.conf 2021-09-26 17:50:32.458100230 +0900
@@ -105,6 +105,7 @@
# Mandatory: no
# Default:
# DBSchema=
+DBSchema=zabbix
### Option: DBUser
# Database user.
@@ -122,6 +123,7 @@
# Mandatory: no
# Default:
# DBPassword=
+DBPassword=PASSWORD
### Option: DBSocket
# Path to MySQL socket.
最终我们将启动Zabbix服务器,但在此之前,如果SELinux已启用,则需要先停止它。
sudo setenforce 0
sudo systemctl restart zabbix-server
在管理界面上进行设置以访问PostgreSQL连接。
cd /etc/zabbix/web
sudo cp -p zabbix.conf.php{,.default}
sudo vi zabbix.conf.php
diff -u zabbix.conf.php{.default,}
--- zabbix.conf.php.default 2020-10-27 17:03:50.308617898 +0900
+++ zabbix.conf.php 2021-09-26 17:55:05.496106605 +0900
@@ -1,7 +1,7 @@
<?php
// Zabbix GUI configuration file.
-$DB['TYPE'] = 'MYSQL';
+$DB['TYPE'] = 'POSTGRESQL';
$DB['SERVER'] = 'localhost';
$DB['PORT'] = '0';
$DB['DATABASE'] = 'zabbix';
@@ -9,7 +9,7 @@
$DB['PASSWORD'] = 'PASSWORD';
// Schema name. Used for PostgreSQL.
-$DB['SCHEMA'] = '';
+$DB['SCHEMA'] = 'zabbix';
// Used for TLS connection.
$DB['ENCRYPTION'] = false;
由于重新安装了 zabbix-web-deps,需要重新设置 PHP 的时区。
cd /etc/php-fpm.d
sudo vi zabbix.conf
php_value[date.timezone] = Asia/Tokyo
应用更改。
sudo systemctl restart httpd
8. 生成和安装 SELinux 模块
由于 audit.log 中出现了 denied 日志,所以我们将从 audit.log 中生成一个模块并安装它。这里我们大致从所有日志中生成了一个名为 zabbix-server 的模块。
cd /var/tmp
sudo ausearch -m AVC | audit2allow -M zabbix-server
sudo semodule -i zabbix-server.pp
安装完成后,请重新启用SELinux并重新启动Zabbix Server,以确保正常运行。
sudo setenforce 1
sudo systemctl restart zabbix-server
sudo systemctl status zabbix-server
作業到此结束。
故障排除
我将提到在验证过程中遇到的问题。
无法访问文件”$libdir/timescaledb-1.4.0″:没有这个文件或目录。
- https://github.com/timescale/timescaledb/issues/1425
重新安装了TimescaleDB后问题得到了解决。
sudo -u postgres psql -U postgres zabbix
DROP EXTENSION timescaledb CASCADE;
CREATE EXTENSION IF NOT EXISTS timescaledb SCHEMA zabbix CASCADE;
提示:将您的许可证升级为“时序”以使用此免费社区功能。
以下的内容已被记录在/var/log/zabbix/zabbix_server.log文件中。
- https://github.com/timescale/timescaledb/issues/2901
将zabbix用户授予超级用户权限并不能解决问题。
重新安装TimescaleDB后,问题得到了解决。
可以向某人寻求帮助或意见。
-
- How to deploy Zabbix on PostgreSQL with Timescale DB plugin – Zabbix Blog
Second Zabbix Meetup Online 2020 in Russian ※ロシア語です
MySQLからPostgreSQLへの移行
pgloaderでMySQL→Postgresへの移行を行う
PostgreSQL: Linux downloads (Red Hat family)