MySQL 8.0使用PXC实现高可用
1. 概述
PXC(Percona XtraDB Cluster)是一个开源的高可用性、高性能的 MySQL 集群解决方案。它由 Percona 公司开发,基于 MySQL 和 Percona Server,结合了 Galera Cluster 的同步复制技术。PXC 提供了多主复制(Multi-Master Replication)和自动节点故障转移功能,可以确保数据库集群的高可用性和数据一致性。
PXC 的主要特性包括:
同步复制
:PXC 使用 Galera Cluster 技术,确保集群中的所有节点在写操作后保持数据一致性。这消除了传统 MySQL 主从复制中可能遇到的延迟和数据不一致的问题。多主复制
:在 PXC 集群中,每个节点都可以作为主节点,任何节点都可以接受写入操作。这有助于提高集群的负载均衡和性能。自动故障转移
:当 PXC 集群中的一个节点发生故障时,集群会自动将流量转移至其他可用节点,确保数据库的高可用性。在线模式更改
:PXC 支持在线添加和删除集群节点,无需停机维护。这可以降低运维成本并减少业务影响。
无需
keepalived
就能实现高可用
2. 环境说明
序号 | 操作系统 | IP | 主机名 | 备注 |
---|---|---|---|---|
1 | Rockylinux 9.2 | 192.168.3.51 | mysql-01.tiga.cc | mysql-01 |
2 | Rockylinux 9.2 | 192.168.3.52 | mysql-02.tiga.cc | mysql-02 |
3 | Rockylinux 9.2 | 192.168.3.53 | web-01.tiga.cc | 仲裁节点 |
为了节省成本,MySQL使用2个节点,再找一台机器作为仲裁节点。
3. 部署PXC
3.1 使用yum安装PXC
两个MySQL节点
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup pxc-80
yum install -y percona-xtradb-cluster
不用再装MySQL了,如果已经装了MySQL,需要先卸载;
3.2 修改root密码
systemctl start mysql
mysql_passwd=`grep 'temporary password' /var/log/mysqld.log|awk '{print $NF}'`
mysql -uroot -p"${mysql_passwd}"
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootPass';
mysql> exit
systemctl stop mysql
3.3 编辑配置文件/etc/my.cnf
节点1
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
binlog_expire_logs_seconds=604800
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
# 指定集群IP
wsrep_cluster_address=gcomm://192.168.3.51,192.168.3.52
# Galera只支持ROW模式
binlog_format=ROW
wsrep_slave_threads=8
wsrep_log_conflicts
# Galera 只支持 InnoDB 的交错( 2 )锁定模式。
innodb_autoinc_lock_mode=2
# 本节点的IP地址
wsrep_node_address=192.168.3.51
# 集群名称
wsrep_cluster_name=pxc-cluster
# 本节点名称
wsrep_node_name=pxc-cluster-node-1
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
# 关闭ssl
pxc-encrypt-cluster-traffic=OFF
节点2
# 除了下面这两个参数,其他参数所有节点必须一模一样
wsrep_node_address=192.168.3.52
wsrep_node_name=pxc-cluster-node-2
3.4 启动第一个节点
# 需要注意,这样启动的mysql,关闭时也要用systemctl stop mysql@bootstrap.service;而不能用systemctl stop mysql
systemctl start mysql@bootstrap.service
确保集群已初始化,登录mysql执行命令
mysql -uroot -p -e "show status like 'wsrep%';"
输出显示 wsrep_cluster_size
为1
, wsrep_local_state_comment
为Synced
状态;
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |
| ... | ... |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| ... | ... |
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| ... | ... |
| wsrep_ready | ON |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)
3.5 向集群添加节点
启动第2个节点
systemctl start mysql
检查第二个节点的状态
mysql -uroot -p -e "show status like 'wsrep%';"
输出
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |
| ... | ... |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| ... | ... |
| wsrep_cluster_size | 2 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| ... | ... |
| wsrep_ready | ON |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)
4. 验证集群同步状态
4.1 登录mysql-01创建数据库
mysql -uroot -p'rootPass' -e "CREATE DATABASE percona;"
4.2 登录mysql-02查看数据库
mysql -uroot -p'rootPass' -e "SHOW DATABASES;"
输出
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| percona |
| performance_schema |
| sys |
+--------------------+
4.3 登录mysql-01创建表
mysql -uroot -p'rootPass' -e "CREATE TABLE percona.example (node_id INT PRIMARY KEY, node_name VARCHAR(30));"
4.4 登录mysql-02插入数据
mysql -uroot -p'rootPass' -e "INSERT INTO percona.example VALUES (1, 'percona1');"
4.5 在两台mysql分别执行语句查询数据
mysql -uroot -p'rootPass' -e "SELECT * FROM percona.example;"
输出
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
+---------+-----------+
5. 添加仲裁节点
如果集群中剩余的节点数量为偶数,则仲裁器很重要。仲裁器将节点数保持为奇数,避免了裂脑情况。
Galera 仲裁器是 Percona XtraDB 集群的轻量级成员。该成员可以投票但不进行任何复制,并且不包括在流量控制计算中。 Galera Arbitrator 是一个名为 garbd 的独立守护进程。您可以从集群中单独启动此守护程序,并将此守护程序作为服务或从 shell 运行。
5.1 安装 Galera Arbitrator
仲裁节点
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup pxc-80
yum install -y percona-xtradb-cluster-garbd
5.2 编辑garbd配置文件
编辑文件/etc/sysconfig/garb
GALERA_NODES="192.168.3.51:4567,192.168.3.52:4567"
GALERA_GROUP="pxc-cluster"
LOG_FILE="/var/log/garbd/garbd.log"
注意,无关的内容要全部删除掉,
不要保留
注释,否则会报错:garb-systemd[2910]: ERROR! Garbd config /etc/sysconfig/garb is not configured yet
5.3 启动garbd
mkdir -p /var/log/garbd
systemctl start garb
# garbd --group=pxc-cluster --address="gcomm://192.168.3.51:4567, 192.168.3.52:4567"
查看garb状态
systemctl status garb
输出
● garb.service - Galera Arbitrator Daemon
Loaded: loaded (/usr/lib/systemd/system/garb.service; disabled; preset: disabled)
Active: active (running) since Tue 2023-06-06 20:57:35 CST; 12min ago
Docs: man:garbd(8)
https://galeracluster.com/library/documentation/arbitrator.html
Main PID: 2965 (garb-systemd)
Tasks: 4 (limit: 100468)
Memory: 4.6M
CPU: 1.452s
CGroup: /system.slice/garb.service
├─2965 /usr/bin/bash -ue /usr/bin/garb-systemd start
└─2970 /usr/bin/garbd -a gcomm://192.168.3.51:4567,192.168.3.52:4567 -g pxc-cluster -l /var/log/g