一、什么是 PXC
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;
PXC 的特点
完全兼容 MySQL。
同步复制,事务要么在所有节点提交或不提交。
多主复制,可以在任意节点进行写操作。
在从服务器上并行应用事件,真正意义上的并行复制。
节点自动配置,数据一致性,不再是异步复制。
故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster 会自动拉取在线节点数据,集群最终会变为一致。
PXC 的优缺点
优点:
服务高可用。
数据同步复制(并发复制),几乎无延迟。
多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让 galera 解决数据冲突。
新节点可以自动部署,部署操作简单。
数据严格一致性,尤其适合电商类应用。
完全兼容 MySQL。
缺点:
复制只支持InnoDB 引擎,其他存储引擎的更改不复制。
写入效率取决于节点中最弱的一台,因为 PXC 集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。
所有表都要有主键。
不支持 LOCK TABLE 等显式锁操作
锁冲突、死锁问题相对更多。
PXC 集群节点越多,数据同步的速度就越慢。
二、PXC的原理

复制分为四个阶段
1.Local read phase
本地(client连接的节点)执行事务Ti,但是不真正提交,真正提交(提交给引擎)之前进入Send phase发送阶段
2.Send phase
1). 若事务只读,直接提交,结束
2). 若事务非只读,将事物的写操作封装成WS(Write Set,基于行),并且携带一个全局唯一标识global tex ID,广播到所有节点(包括自身)
3.Certification phase 认证测试阶段
Certification based conflict detect 测试发送来的事务与本地事务是否有冲突
4.Write phase 写阶段
a) 若检测出冲突,其他节点discard,原节点回滚Ti
b) 否则,执行WS,提交事务后释放锁资源
c) 对于源节点,提交事务并向client返回结果
PXC 常用端口
3306:数据库对外服务的端口号。
4444:请求 SST 的端口。
4567:组成员之间进行沟通的一个端口号。
4568:用于传输 IST。
SST(State Snapshot Transfer): 全量传输
IST(Incremental state Transfer)??*增量传输
三、搭建 PXC 集群
Percona XtraDB Cluster (简称 PXC)集群是基于 Galera 2.x library,事务型应用下的通用的多主同步复制插件,主要用于解决强一致性问题,使得各个节点之间的数据保持实时同步以及实现多节点同时读写。提高了数据库的可靠性,也可以实现读写分离,是 MySQL 关系型数据库中大家公认的集群优选方案之一。
准备好下面三台服务器,本文搭建PXC集群基于Rocky8.x:
IP 端口 角色
192.168.150.11 3306 pxc1
192.168.150.12 3306 pxc2
192.168.150.13 3306 pxc3
1)配置hosts解析
# cat >> /etc/hosts << EOF
192.168.150.11 pxc1
192.168.150.12 pxc2
192.168.150.13 pxc3
EOF
2)关闭msyql服务
yum module disable mysql
3)在线下载qpress,开启pxc80口,安装pxc
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup pxc-80
yum install percona-xtradb-cluster
4)之后还是对 Percona Server 数据库的初始化:
初始化数据库
应为使用的是8.0版本,部分配置需要在初始化数据库前进行配置,如忽略表名大小写等。
[root@pxc1 ~]# 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即可
5)然后我们启动 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)
6)创建集群
# 停止所有节点的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.150.11,192.168.150.12,192.168.150.13 # 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.11 # 当前节点的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 # 同步方法
注意:pxc2和pxc3参照,修改集群节点ip和名称 wsrep_node_name,wsrep_node_address
7)将引导服务mysql目录下的*.pem拷贝给其他服务器,并启动服务
[root@pxc1 ~]# scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql/
[root@pxc1 ~]# scp /var/lib/mysql/*.pem pxc3:/var/lib/mysql/
(1)第一个节点(任意一台皆可)需要以引导模式启动:
[root@pxc1 ~]# systemctl start mysql@bootstrap.service
(2)接着在第二和第三个节点上正常启动数据库服务,命令如下:
[root@pxc2 ~]# chown -R mysql.mysql /var/lib/mysql/
[root@pxc2 ~]# systemctl start mysqld
[root@pxc3 ~]# chown -R mysql.mysql /var/lib/mysql/
[root@pxc3 ~]# systemctl start mysqld
8)查询集群信息
mysql> show status like 'wsrep%';
| wsrep_incoming_addresses | 192.168.150.13:3306,192.168.150.11:3306,192.168.150.12:3306 |
| wsrep_cluster_weight | 3 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | df5aed67-940d-11ee-bc8f-8e8bab9eea9d |
| wsrep_gmcast_segment | 0 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 47f68dce-940c-11ee-85d5-c29e7cbcc6e4 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON
9)查看 PXC 集群状态信息,在任意一个节点执行以下命令:
[root@pxc1 ~]# mysql -uroot -p123456 -e "show status like 'wsrep_cluster%';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_cluster_weight | 3 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 47f68dce-940c-11ee-85d5-c29e7cbcc6e4 |
| wsrep_cluster_status | Primary |
+----------------------------+--------------------------------------+
10)节点下线
PXC 集群允许动态下线节点,但需要注意的是节点的启动命令和关闭命令必须一致,如以引导模式启动的第一个节点必须
以引导模式来进行关闭:
# systemctl stop mysql@bootstrap.service
1
其他节点则可以按照正常方式关闭:
# systemctl stop mysqld
四、测试效果
在主节点上创建个新用户,在另外一台住上(第四台)远程登录连接看实验效果即可。
如我开的第四台主机ip:192.168.150.25
mysql -uadmin -p'Abc_123456' -h'192.168.150.25'
2784

被折叠的 条评论
为什么被折叠?



