一、PXC 简介
1.1.优缺点
优点:
-
同步复制,实时同步,保证数据一致性
-
多主复制,任意节点可写操作
-
并行复制,从服务器并行事件
-
自动配置,节点不再异步复制
-
故障切换,多点写入易进行故障切换
-
自动节点克隆,新增节点自动拉取数据
缺点:
-
复制局限,只支持innodb引擎
-
写入效率局限,取决于最弱的一台节点
-
所有表都要有主键
-
不支持 LOCK TABLE 显示锁
-
锁冲突,死锁问题较多
-
节点越多,同步越慢,两两同步
1.2.PXC 常用端口
-
3306:数据库对外服务的端口号
-
4444:请求 SST(全量传输) 的端口
-
4567:组成员之间进行沟通的一个端口号
-
4568:用于传输 IST(增量传输)
二、配置
Percona XtraDB Cluster (简称 PXC)集群是基于 Galera 2.x library,事务型应用下的通用的多主同步复制插件,主要用于解决强一致性问题,使得各个节点之间的数据保持实时同步以及实现多节点同时读写。提高了数据库的可靠性,也可以实现读写分离,是 MySQL 关系型数据库中大家公认的集群优选方案之一。
2.1.环境准备
-
准备好下面三台服务器,本文搭建 PXC 集群基于 Rocky8.x:
IP | 端口 | 角色 |
---|---|---|
192.168.67.160 | 3306 | pxc1 |
192.168.67.161 | 3306 | pxc2 |
192.168.67.162 | 3306 | pxc3 |
2.2.hosts 解析
-
配置 hosts 解析(每台都需配置)
cat >> /etc/hosts << EOF
192.168.67.160 pxc1
192.168.67.161 pxc2
192.168.67.162 pxc3
EOF
2.3.安装 PXC
-
在线安装 PXC,参考官网(每台都需安装)
-
不用下载 MySQL,PXC 会自带MySQL
Install Percona XtraDB Cluster on Red Hat Enterprise Linux and CentOS - Percona XtraDB Clusterhttps://docs.percona.com/percona-xtradb-cluster/8.0/yum.html#install-from-percona-software-repository
yum module disable mysql
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup pxc-80
yum install percona-xtradb-cluster
2.4.修改my.cnf配置文件
-
修改配置文件(每台都需做)
-
server-id,节点名称,节点IP,每个主机根据自身修改
vim /etc/my.cnf
# Template my.cnf for PXC
# Edit to your requirements.
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=160 # server-id可以是本机IP(唯一)
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
######## 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.67.160,192.168.67.161,192.168.67.162 # 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.67.160 # 当前节点IP
# Cluster name
wsrep_cluster_name=pxc-cluster # 集群名称
#If wsrep_node_name is not specified, then system hostname will be used
wsrep_node_name=pxc-1 # 当前节点名称
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
pxc_strict_mode=ENFORCING
# SST method
wsrep_sst_method=xtrabackup-v2
2.5.统一证书
-
复制 pxc1 的证书到 pxc2 和 pxc3 中(只需 pxc1 做)
scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql/
scp /var/lib/mysql/*.pem pxc3:/var/lib/mysql/
-
修改 pxc2 和 pxc3 证书的权限(只需 pxc2 和 pxc3 做)
chown -R mysql.mysql /var/lib/mysql/
2.6.启动服务
-
第一个节点需要以引导模式启动(只需 pxc1 做)
systemctl start mysql@bootstrap.service
-
第二和第三个节点上正常启动数据库服务(pxc2 和 pxc3 做)
systemctl start mysql
2.7.修改MySQL密码
- (每台都需做)
mysql_passwd=$(awk '/password/ {print $NF}' /var/log/mysqld.log)
mysql -uroot -p${mysql_passwd}
mysql> alter user root@localhost identified by 'Mysql@123';
2.8.验证状态
mysql> select * from performance_schema.pxc_cluster_view;
show status where Variable_name in ('wsrep_cluster_size','wsrep_cluster_status','wsrep_connected','wsrep_ready') ;
2.9.验证复制
-
在 pxc2 上创建一个新数据库
CREATE DATABASE percona;
-
在 pxc3 切换到新创建的数据库(注意:建表必须有主键)
USE percona;
CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
-
在 pxc1 上插入数据
INSERT INTO percona.example VALUES (1, 'percona1');
-
在 pxc2 上查询表
SELECT * FROM percona.example;