Zabbix5.0 的数据库迁移(从MariaDB到TimescaleDB)

首先

我们在使用MariaDB运营Zabbix数据库的时候,发现history syncer internal processes等数值定期上升,因此决定迁移到时序数据库TimescaleDB。本文总结了在验证环境中的验证结果。

环境

由于一个年前搭建了验证环境,我们在更新Zabbix版本(5.0.15)后进行了验证。
我们使用了PostgreSQL和TimescaleDB的社区版。

項目移行前移行後OSCentOS 8.2同左PHPphp-7.2.24-1同左Webhttpd-2.4.37-21同左DBmariadb-10.3.17-1postgresql12-12.8-1PGDG + timescaledb_12-2.4.2-1Zabbix Serverzabbix-server-mysql-5.0.15-1zabbix-server-pgsql-5.0.15-1

转型的趋势

我們將按照以下方式進行轉移。

    1. 停用Zabbix服务器

 

    1. 卸载/安装Zabbix相关软件包

 

    1. 安装和配置PostgreSQL

 

    1. 使用pgloader进行迁移

 

    1. 安装和应用TimescaleDB

 

    1. 停用MariaDB

 

    1. 配置和启动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)

广告
将在 10 秒后关闭
bannerAds