本页目录

  • 先决条件
  • 配置 /etc/hosts 与 Firewalld
  • 安装 Percona XtraDB Cluster
  • 复制 SSL/TLS 证书
  • 在 pxc-rock01 上初始化 Percona XtraDB Cluster
  • 将服务器 pxc-rock02 加入 Percona XtraDB Cluster
  • 将服务器 pxc-rock03 加入 Percona XtraDB Cluster
  • 测试数据库复制
  • 结语

Percona XtraDB Cluster 是面向 MySQL 的一款完全开源的数据库集群解决方案。它可以让你构建具备健壮性与高性能的高可用 MySQL 服务器部署。Percona XtraDB Cluster 的最新版本为 8.0,与 MySQL Server Community Edition 8.0 完全兼容。

Percona XtraDB Cluster 提供同步复制、多源复制、自动节点初始化配置、自动 SSL 加密配置以及性能优化等特性。

Percona XtraDB Cluster 可确保数据库服务器的高可用性,提供线性可扩展性,并避免停机与数据丢失。

本指南将介绍如何在 Rocky Linux 9 服务器上通过 Percona XtraDB Cluster(PXC)搭建 MySQL 集群。你将在多台 Rocky Linux 系统上安装 Percona XtraDB Cluster,并配置其实现服务器之间的数据库复制,随后还将通过向一台服务器写入数据、再从另一台服务器查询数据来进行验证。

先决条件

要完成本指南,你需要两台或以上运行 Rocky Linux 9 的服务器。你还必须在所有服务器上拥有一个具备 sudo/root 管理员权限的非 root 用户。此外,SELinux 需运行在 permissive(宽松)模式。

在本示例中,将使用三台 Rocky Linux 9 服务器。以下是各服务器的详细信息:

Hostname       IP Address
--------------------------
pxc-rock01       192.168.5.80
pxc-rock02       192.168.5.81
pxc-rock03       192.168.5.82

如果各项先决条件都已就绪,就可以开始安装 Percona XtraDB Cluster 了。

配置 /etc/hosts 与 Firewalld

在第一步中,你将在所有 Rocky Linux 服务器上配置 /etc/hosts 文件与 firewalld。你将修改 /etc/hosts 文件,为每台服务器添加 IP 地址与主机名信息,然后开放 Percona XtraDB Cluster 所需使用的若干端口。

下面是需要你在防火墙上开放的 Percona XtraDB Cluster 端口详情。

Ports   Used for
---------------------------
3306    MySQL client connection and SST (State Snapshot Transfer)
4444    SST via Percona XtraBackup
4567    write-set replication traffic (over TCP) and multicast replication (over TCP and UDP)
4568    IST (Incremental State Transfer)

首先,使用以下 nano 编辑器命令打开 '/etc/hosts' 文件。

sudo nano /etc/hosts

添加集群将要使用的主机名与 IP 地址信息。请务必根据你的服务器环境修改其中的内容。

192.168.5.80  pxc-rock01
192.168.5.81  pxc-rock02
192.168.5.82  pxc-rock03

完成后保存并关闭文件。

接下来,执行以下 'firewall-cmd' 命令,将你的内部网络子网添加为可信来源。这样,只有受信任的网络才能访问所有服务器。

sudo firewall-cmd --permanent --add-source=192.168.5.0/24

现在为 Percona XtraDB Cluster 开放若干端口,并重新加载 firewalld 使更改生效。出现 'success' 输出即表示新规则已添加到 firewalld。

sudo firewall-cmd --add-port={3306/tcp,4444/tcp,4567/tcp,4567/udp,4568/tcp} --permanent
sudo firewall-cmd --reload

最后,执行以下 'firewall-cmd' 命令,验证 firewalld 上已启用的规则列表。

sudo firewall-cmd --list-all

终端 shell 中将打印出类似下面的输出。请确认其中列出了 Percona XtraDB Cluster 将要使用的所有端口。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

/etc/hosts 文件与 firewalld 配置完成后,接下来将安装 Percona XtraDB Cluster 软件包。

安装 Percona XtraDB Cluster

在本节中,你将在所有 Rocky Linux 服务器上安装 Percona XtraDB Cluster。你将配置 Percona XtraDB 仓库,然后安装 Percona XtraDB Cluster 软件包。最后,你还会修改所有服务器上 MySQL 默认的 root 密码。

首先,必须添加并启用 EPEL 仓库。执行以下 'dnf install' 命令来添加 EPEL 仓库。

sudo dnf install epel-release

现在执行以下命令安装 Percona release 工具。在提示时输入 y 并按 ENTER 继续。该软件包提供了一个名为 'percona-release' 的命令行工具,可用于管理 Percona 仓库。

sudo dnf install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

接下来,运行以下 'percona-release' 命令以启用 Percona XtraDB Cluster 8.0 仓库。过程中会提示你禁用默认的 MySQL 仓库,输入 y 确认并按 ENTER 继续。

sudo percona-release setup pxc-80

出现 'All done!' 输出信息即表示操作成功。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

执行下面的 'dnf repolist' 命令验证已启用的仓库列表。你应当看到 'pxc-80-release' 仓库已启用并出现在输出中,同时还会列出 'prel-release'、'tools-release' 等附加仓库。

sudo dnf repolist

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

现在执行以下 'dnf install' 命令安装 Percona XtraDB Cluster 软件包。在提示确认时输入 y 并按 ENTER 继续。

sudo dnf install percona-xtradb-cluster

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

当提示接受 Percona GPG 密钥时,输入 y 并按 ENTER 确认。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

Percona XtraDB Cluster 安装完成后,执行以下 systemctl 命令启动并启用 MySQL 服务。

sudo systemctl start mysql
sudo systemctl enable mysql

现在使用以下命令查看 MySQL 服务状态。出现 'active (running)' 输出表示 MySQL 正在运行;出现 '..; enabled; .' 输出表示 MySQL 会在系统启动时自动启动。

sudo systemctl status mysql

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

Percona XtraDB Cluster 运行起来后,现在将为所有 MySQL 服务器修改默认的 root 密码。

执行以下命令查看 MySQL root 用户默认生成的密码。请复制该默认 root 密码。

sudo grep 'temporary password' /var/log/mysqld.log

接下来,通过下面的 'mysql' 命令登录 MySQL shell。当提示输入密码时,粘贴你复制的默认 MySQL 密码。

sudo mysql -u root -p

登录成功后,你将看到带有 'mysql>' 提示符的 MySQL shell。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

执行以下 MySQL 查询修改 root 用户的默认密码,然后退出 mysql。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewP4ssr00tMySQL';
quit

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

最后,在配置 Percona XtraDB Cluster 之前,必须停止 MySQL 服务。在所有服务器上执行以下 'systemctl' 命令停止 MySQL 服务。

sudo systemctl stop mysql

完成 Percona XtraDB Cluster 安装、MySQL root 配置,并停止 MySQL 服务后,现在就可以开始配置并搭建集群了。

复制 SSL/TLS 证书

从 Percona XtraDB Cluster 8.0 起,集群内服务器之间的默认连接必须加密。要实现服务器间的加密通信,所有服务器上必须拥有相同的 SSL/TLS 证书。

在本节中,你将把 'pxc-rock01' 服务器上默认生成的 SSL/TLS 证书复制到 'pxc-rock02' 和 'pxc-rock03' 服务器。

在 'pxc-rock01' 服务器上,执行以下命令查看可用的证书。据此,你应将证书文件 'server-cert.pem'、'server-key.pem' 和 'ca.pem' 复制到 pxc-rock02 与 pxc-rock03 两台服务器。

ls /var/lib/mysql/*.pem

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

将工作目录切换到 '/var/lib/mysql'。

cd /var/lib/mysql

现在执行以下 scp 命令,将 SSL/TLS 证书文件复制到 pxc-rock02 和 pxc-rock03 两台服务器。

scp server-key.pem server-cert.pem ca.pem root@pxc-rock02:/var/lib/mysql
scp server-key.pem server-cert.pem ca.pem root@pxc-rock03:/var/lib/mysql

以下是从 pxc-rock01 向 pxc-rock02 复制 SSL/TLS 证书过程中的输出。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

以下是从 pxc-rock01 向 pxc-rock03 复制 SSL/TLS 证书过程中的输出。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

在 pxc-rock01 上初始化 Percona XtraDB Cluster

首先,你将基于 pxc-rock01 服务器初始化 Percona XtraDB Cluster。为此,你需要修改 MySQL 服务器配置文件 '/etc/my.cnf',然后启动 'mysql@bootstrap' 服务。

使用以下 nano 编辑器命令打开 MySQL 配置文件 '/etc/my.cnf'。

sudo nano /etc/my.cnf

将你的 Percona XtraDB Cluster 服务器 IP 地址列表添加到 'wsrep_cluster_address' 参数,并添加 'default_storage_engine=InnoDB' 参数。

# Cluster connection URL contains the IPs of pxc-rock01, pxc-rock02, and pxc-rock03
wsrep_cluster_address=gcomm://192.168.5.80,192.168.5.81,192.168.5.82
# Using the MyISAM storage engine is not recommended.
default_storage_engine=InnoDB

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

将 'wsrep_node_address' 改为当前服务器的 IP 地址,'wsrep_node_name' 改为系统主机名,'wsrep_cluster_name' 改为你集群的名称。

# Node 1 address
wsrep_node_address=192.168.5.80
# Node Name
wsrep_node_name=pxc-rock01
# Cluster name
wsrep_cluster_name=pxc-cluster

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

最后,在文件末尾添加以下配置,以启用 Percona XtraDB Cluster 服务器之间以及 sst 连接上的安全 SSL/TLS 通信。

# enable ssl/tls connection
wsrep_provider_options="socket.ssl_key=server-key.pem;socket.ssl_cert=server-cert.pem;socket.ssl_ca=ca.pem"
[sst]
encrypt=4
ssl-key=server-key.pem
ssl-ca=ca.pem
ssl-cert=server-cert.pem

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

完成后保存并关闭文件。

接下来,执行以下 systemctl 命令启动 'mysql@bootstrap' 服务,从而初始化第一台 Percona XtraDB Cluster 服务器。

systemctl start 
[email protected]

要验证并确保 Percona XtraDB Cluster 初始化成功,你应登录 MySQL shell 并查看 'wsrep%' 状态。

执行以下 'mysql' 命令以 'root' 用户登录 MySQL 服务器。在提示时输入你新设置的 MySQL root 密码。

sudo mysql -u root -p

登录后,执行以下查询查看 'wsrep%' 状态的详细信息。

SHOW STATUS LIKE 'wsrep%';

你将收到类似如下的输出——在 'wsrep_cluster_size' 部分会看到值 '1',表示 Percona XtraDB Cluster 已初始化且包含 1 台服务器。在 'wsrep_incoming_address' 部分还会显示服务器 IP 地址。最后,节点处于 Synced 状态,表示它已完全连接并就绪,可以进行 write-set 复制。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

至此,Percona XtraDB Cluster 的第一台服务器 'pxc-rock01' 已初始化完成。下一步,你将把 'pxc-rock02' 和 'pxc-rock03' 服务器加入集群。

将服务器 pxc-rock02 加入 Percona XtraDB Cluster

第一台 Percona XtraDB Cluster 初始化完成后,现在将 pxc-rock02 服务器加入集群。将服务器加入 Percona XtraDB Cluster 的方式与初始化过程类似:你需要修改默认的 MySQL 服务器配置文件 '/etc/my.cnf' 并定义集群服务器列表,然后正常启动 MySQL 服务。

执行以下 nano 编辑器命令打开 MySQL 配置文件 '/etc/my.cnf'。

sudo nano /etc/my.cnf

将你的 Percona XtraDB Cluster 服务器 IP 地址列表添加到 'wsrep_cluster_address' 参数,并添加 'default_storage_engine=InnoDB' 参数。

# Cluster connection URL contains the IPs of pxc-rock01, pxc-rock02, and pxc-rock03
wsrep_cluster_address=gcomm://192.168.5.80,192.168.5.81,192.168.5.82
# Using the MyISAM storage engine is not recommended.
default_storage_engine=InnoDB

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

将 'wsrep_node_address' 改为当前服务器的 IP 地址,'wsrep_node_name' 改为系统主机名,'wsrep_cluster_name' 改为你集群的名称。

# Node #2 address
wsrep_node_address=192.168.5.81
# Node Name
wsrep_node_name=pxc-rock02
# Cluster name
wsrep_cluster_name=pxc-cluster

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

最后,在文件末尾添加以下配置,以启用 Percona XtraDB Cluster 服务器之间以及 sst 连接上的安全 SSL/TLS 通信。

# enable ssl/tls connection
wsrep_provider_options="socket.ssl_key=server-key.pem;socket.ssl_cert=server-cert.pem;socket.ssl_ca=ca.pem"
[sst]
encrypt=4
ssl-key=server-key.pem
ssl-ca=ca.pem
ssl-cert=server-cert.pem

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

完成后保存并关闭文件。

接下来,执行以下 systemctl 命令启动 MySQL 服务。这也会让 'pxc-rock02' 服务器加入已初始化的 Percona XtraDB Cluster。

sudo systemctl start mysql

最后,为确保 pxc-rock02 服务器已加入 Percona XtraDB Cluster,你必须通过以下命令以 root 用户登录 MySQL shell。在提示时输入你的 MySQL root 密码。

sudo mysql -u root -p

现在执行以下查询查看 'wsrep%' 状态的详细信息。

SHOW STATUS LIKE 'wsrep%';

你将收到类似如下的输出——在 'wsrep_cluster_size' 部分会看到值 '2',表示 Percona XtraDB Cluster 中已有两台可用服务器。在 'wsrep_incoming_address' 部分还会显示服务器 IP 地址,即 pxc-rock01 与 pxc-rock02 的 IP 地址。最后,节点处于 Synced 状态,表示它已完全连接并就绪,可以进行 write-set 复制。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

将服务器 pxc-rock03 加入 Percona XtraDB Cluster

在本节中,你现在将第三台服务器 pxc-rock03 加入 Percona XtraDB Cluster。

使用以下 nano 编辑器命令打开配置文件 '/etc/my.cnf'。

sudo nano /etc/my.cnf

将你的 Percona XtraDB Cluster 服务器 IP 地址列表添加到 'wsrep_cluster_address' 参数,并添加 'default_storage_engine=InnoDB' 参数。

# Cluster connection URL contains the IPs of pxc-rock01, pxc-rock02, and pxc-rock03
wsrep_cluster_address=gcomm://192.168.5.80,192.168.5.81,192.168.5.82
# Using the MyISAM storage engine is not recommended.
default_storage_engine=InnoDB

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

将 'wsrep_node_address' 改为当前服务器的 IP 地址,'wsrep_node_name' 改为系统主机名,'wsrep_cluster_name' 改为你集群的名称。

# Node #3 address
wsrep_node_address=192.168.5.82
# Node Name
wsrep_node_name=pxc-rock02
# Cluster name
wsrep_cluster_name=pxc-cluster

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

最后,在文件末尾添加以下配置,以启用 Percona XtraDB Cluster 服务器之间以及 sst 连接上的安全 SSL/TLS 通信。

# enable ssl/tls connection
wsrep_provider_options="socket.ssl_key=server-key.pem;socket.ssl_cert=server-cert.pem;socket.ssl_ca=ca.pem"
[sst]
encrypt=4
ssl-key=server-key.pem
ssl-ca=ca.pem
ssl-cert=server-cert.pem

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

完成后保存并关闭文件。

接下来,执行以下 systemctl 命令启动 MySQL 服务,使当前服务器 pxc-rock03 加入 Percona XtraDB Cluster。

sudo systemctl start mysql

最后,执行以下 mysql 命令登录 MySQL shell 并验证 'wsrep%' 状态。在提示时输入你的 MySQL root 密码。

sudo mysql -u root -p

现在执行以下查询查看 'wsrep%' 状态的详细信息。

SHOW STATUS LIKE 'wsrep%';

你将收到类似如下的输出——在 'wsrep_cluster_size' 部分会看到值 '3',表示 Percona XtraDB Cluster 中已有三台可用服务器。在 'wsrep_incoming_address' 部分还会显示服务器 IP 地址,即 pxc-rock01、pxc-rock02 和 pxc-rock03 的 IP 地址。最后,节点处于 Synced 状态,表示它已完全连接并就绪,可以进行 write-set 复制。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

至此,你已使用三台不同的 Rocky Linux 9 服务器完成了 Percona XtraDB Cluster 的配置。这样一来,Percona XtraDB Cluster 中服务器之间的数据库复制应当已经可以正常工作。下一步,你将在多台服务器之间验证数据库的复制情况。

测试数据库复制

在本节中,你将验证 Percona XtraDB Cluster 上的数据库复制,以确认安装已成功完成。

首先,从 pxc-rock02 服务器登录 MySQL shell,并创建一个名为 'testdb' 的新数据库。

sudo mysql -u root -p
CREATE DATABASE testdb;

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

现在切换到 pxc-rock03 服务器,以 root 用户连接 MySQL shell,然后将默认工作数据库切换为 'testdb'。

sudo mysql -u root -p
USE testdb;

执行以下查询创建一个名为 'table1' 的新表。

CREATE TABLE table1 (node_id INT PRIMARY KEY, node_name VARCHAR(30));

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

接下来切换到 pxc-rock01 服务器,登录 MySQL shell,然后通过下面的 'INSERT' 查询向 'testdb' 数据库插入新数据。

sudo mysql -u root -p
INSERT INTO testdb.table1 VALUES (1, 'pxc-rock01');
INSERT INTO testdb.table1 VALUES (2, 'pxc-rock02');
INSERT INTO testdb.table1 VALUES (3, 'pxc-rock03');

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

数据插入完成后,回到 pxc-rock02 服务器,执行下面的 SELECT 查询,检索 'testdb' 数据库与 'table1' 表中的全部数据。

SELECT * FROM testdb.table1;

如果复制成功,你在 pxc-rock02 服务器上应当能看到所插入的数据。你的数据会存储在 Percona XtraDB Cluster 的所有服务器上。

在 Rocky Linux 9 上安装并配置 Percona XtraDB 集群

这证实了在 Rocky Linux 9 服务器上安装 Percona XtraDB Cluster 已成功。

结语

在本指南中,你已在三台 Rocky Linux 9 服务器上安装并部署了 Percona XtraDB Cluster。你已学会如何安装 Percona XtraDB Cluster、通过 firewalld 保护部署、初始化集群,以及向集群添加节点。

此外,你还通过 SSL/TLS 证书以及 'pxc-encrypt-cluster-traffic' 选项(在 Percona XtraDB Cluster 8.0 中默认启用)加密了所有服务器之间的流量,从而进一步加强了 Percona XtraDB Cluster 安装的安全性。

至此,你可以利用此前为 pxc-rock02 和 pxc-rock03 服务器添加节点所学到的步骤,向当前 Percona XtraDB Cluster 添加更多服务器。或者,你也可以借助 ProxySQL、HAPROXY 等第三方应用搭建负载均衡与高可用。如需了解更多,请访问 Percona XtraDB Cluster 官方文档。