1. 核心特性
-
多主复制(Multi-Master Replication):
-
所有节点都是可读写的,数据可以在任意节点上写入,并实时同步到其他节点。
-
避免了传统主从复制中单点写入的限制。
-
-
同步复制(Synchronous Replication):
-
数据在写入时会被同步到所有节点,确保数据一致性。
-
适合对数据一致性要求高的场景。
-
-
高可用性(High Availability):
-
如果某个节点故障,其他节点可以继续提供服务,无需手动切换。
-
自动故障检测和恢复。
-
-
数据一致性(Data Consistency):
-
使用 Galera 的认证机制,确保所有节点的数据一致。
-
支持真正的 ACID 事务。
-
-
线性扩展(Linear Scalability):
-
可以通过增加节点来扩展读写能力。
-
适合高并发、大数据量的场景。
-
-
兼容 MySQL:
-
完全兼容 MySQL 协议和工具,可以无缝替换 MySQL。
-
支持 MySQL 的应用程序和驱动程序。
-
2. 架构和工作原理
-
PXC 基于 Galera Cluster 技术,采用 Write-Set Replication (WSREP) 协议实现数据同步。
-
当一个节点接收到写操作时,它会将写操作广播到其他节点。
-
其他节点验证并应用这些写操作,确保所有节点的数据一致。
-
事务只有在大多数节点确认后才会提交。
3. 适用场景
-
高可用性需求:如金融、电商等对数据库可用性要求高的场景。
-
多写需求:需要多个节点同时写入数据的场景。
-
数据一致性要求高:如分布式系统中需要强一致性的场景。
-
MySQL 替代方案:需要更高性能和可靠性的 MySQL 替代方案。
4. 优缺点
优点:
-
高可用性和数据一致性。
-
多主架构,支持多点写入。
-
兼容 MySQL,易于迁移。
-
自动故障恢复,减少运维成本。
缺点:
-
同步复制可能导致写性能下降,尤其是在网络延迟较高的情况下。
-
集群规模较大时,节点间的通信开销会增加。
-
需要较高的硬件和网络配置。
5. 与 MHA、MGR 的对比
-
PXC vs MHA(Master High Availability):
-
MHA 是主从架构,PXC 是多主架构。
-
MHA 需要手动或半自动故障切换,PXC 是自动故障切换。
-
-
PXC vs MGR(MySQL Group Replication):
-
MGR 是 MySQL 官方提供的集群方案,PXC 是基于 Galera 的第三方方案。
-
MGR 支持单主和多主模式,PXC 是多主模式。
-
PXC 的成熟度和社区支持较好,MGR 是 MySQL 官方推荐方案。
-
6. 安装与部署
配置主机清单:在3台机器上编辑 /etc/hosts文件

删除 MariaDB 程序包:
yum -y remove mari*
下载 PXC 安装包

安装 PXC 里面集成了 Percona Server 数据库,所以不需要安装数据库。
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only pxc-80 release
percona-release enable tools release
yum install percona-xtradb-cluster
初始化数据库
应为使用的是8.0版本,部分配置需要在初始化数据库前进行配置,如忽略表名大小写等
[root@CentOS7-1 ~]# vim /etc/my.cnf
...
[mysqld]
server-id=11 #每台mysql的id不能相同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Binary log expiration period is 604800 seconds, which equals 7 days
binlog_expire_logs_seconds=604800 #二进制日志过期时间为604800秒,等于7天
注意:pxc2和pxc3只需要server-id设置为12和13即可。
然后我们启动 mysql,修改密码。(三台机器都要)
systemctl start mysqld
tmp_pass=$(awk '/temporary password/ {print $NF}' /var/log/mysqld.log)
mysql -uroot -p${tmp_pass}
mysql> alter user root@localhost identified by '123456';
Query OK, 0 rows affected (0.01 sec)
授权用户
mysql -uroot -p123456
mysql> CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc_123456';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT all privileges ON *.* TO 'admin'@'%';
Query OK, 0 rows affected (0.00 sec)
创建集群
所有节点停止mysqld服务:
systemctl stop mysqld
配置文件
[root@pxc1 ~]# vim /etc/my.cnf
...
######## wsrep ###############
Path to Galera library
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
wsrep_cluster_address=gcomm://192.168.121.111,192.168.121.112,192.168.121.113 # PXC集群的所有ip
In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
Slave thread to use
wsrep_slave_threads=8
wsrep_log_conflicts
This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2 # 主键自增长不锁表
Node IP address
wsrep_node_address=192.168.150.111 # 当前节点的IP
Cluster name
wsrep_cluster_name=pxc-cluster # PXC集群的名称
#If wsrep_node_name is not specified, then system hostname will be used
wsrep_node_name=pxc1 # 当前节点的名称
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
pxc_strict_mode=ENFORCING
SST method
wsrep_sst_method=xtrabackup-v2 # 同步方法
引导服务mysql目录下的*.pem拷贝给其它服务器:
默认情况下,系统变量pxc_encrypt_cluster_traffic设置为ON,意味着所有集群流量都使用证书进行保护,所以要求所有节点使用相同的密钥和证书文件,systemctl start mysql启动初始话过程中生成默认密钥和证书文件,并将其放在datadir数据目录下,这就造成故障节点和其他节点密钥和证书文件不一致,因此需要将故障节点的*.pem全部删除,并将某一个正常节点数据目录下的 *.pem文件全部复制到故障节点。
scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql/
scp /var/lib/mysql/*.pem pxc3:/var/lib/mysql/
启动集群:
第一个节点需要以引导模式启动
systemctl start mysql@bootstrap.service
第二和第三个节点上正常启动数据库服务
-
chown -R mysql.mysql /var/lib/mysql/
-
systemctl start mysql
查看集群信息
mysql> show status like 'wsrep%';
可通过视图performance_schema.pxc_cluster_view、dstat工具监控同步状态。
mysql> select * from performance_schema.pxc_cluster_view;
查看PXC集群状态信息
mysql> show status like 'wsrep_cluster%';

mysql> show status where Variable_name in ('wsrep_cluster_size','wsrep_cluster_status','wsrep_connected','wsrep_ready');

节点下线
PXC 集群允许动态下线节点,但需要注意的是节点的启动命令和关闭命令必须一致。以引导模式启动的第一个节点必须以引导模式来进行关闭:
systemctl stop mysql@bootstrap.service
其他节点则可以按照正常方式关闭:
systemctl stop mysql