1.什么是 PXC
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性。
2.PXC 的特点
-
完全兼容 MySQL。
-
同步复制,事务要么在所有节点提交或不提交。
-
多主复制,可以在任意节点进行写操作。
-
在从服务器上并行应用事件,真正意义上的并行复制。
-
节点自动配置,数据一致性,不再是异步复制。
-
故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
-
自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster 会自动拉取在线节点数据,集群最终会变为一致。
3.PXC 的优缺点
优点:
-
服务高可用。
-
数据同步复制(并发复制),几乎无延迟。
-
多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让 galera 解决数据冲突。
-
新节点可以自动部署,部署操作简单。
-
数据严格一致性,尤其适合电商类应用。
-
完全兼容 MySQL。
缺点:
-
复制只支持InnoDB 引擎,其他存储引擎的更改不复制。
-
写入效率取决于节点中最弱的一台,因为 PXC 集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。
-
所有表都要有主键。
-
不支持 LOCK TABLE 等显式锁操作。
-
锁冲突、死锁问题相对更多。
PXC 集群节点越多,数据同步的速度就越慢。
4.PXC 常用端口
-
3306:数据库对外服务的端口号。
-
4444:请求 SST 的端口。
-
4567:组成员之间进行沟通的一个端口号。
-
4568:用于传输 IST。
5.搭建 PXC 集群
准备好下面三台服务器,本文搭建PXC集群基于CentOS8.x:
IP | 角色 |
192.168.1.11 | pxc1 |
192.168.1.12 | pxc2 |
192.168.1.13 | pxc3 |
RHEL8和其他EL8系统默认启用MySQL模块。该模块隐藏了Percona提供的软件包,必须禁用该模块才能使这些软件包可见。
1.三台服务器同时进行
安装必要的依赖包所需要的软件和禁用相应模块
[root@localhost ~]#yum module disable mysql
[root@localhost ~]#yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
[root@localhost ~]#percona-release setup pxc-80
[root@localhost ~]#yum install percona-xtradb-cluster
同时关闭服务器和SELinux
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#systemctl disable firewalld
[root@localhost ~]#setenforce 0
编辑本地解析
[root@localhost ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.11 pxc1
192.168.1.12 pxc2
192.168.1.13 pxc3
2.三台服务器初始化数据库
进入配置文件修改server-id,记得每台mysql的id不能相同,三台主机只需要设置不一样的server-id,其他指令完全一样
192.168.1.11
[root@localhost ~]# 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
开启数据库,获取mysql初始密码
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# grep -i password /var/log/mysqld.log
登录数据库修改密码为123456
[root@localhost ~]# mysql -uroot -p'(H?XG7CprRci'
mysql> alter user root@localhost identified by '123456';
# 授权用户
mysql> CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc_123456';
mysql> GRANT all privileges ON *.* TO 'admin'@'%';
mysql>exit
[root@localhost ~]#systemctl stop mysqld
修改好密码后退出,记得关闭数据库
同理192.168.1.12 和192.168.1.13进行一样的配置
192.168.1.12和192.168.1.13设置不一样的server-id
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=12
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=13
同时记得关闭mysql
3.三台服务器创建集群
192.168.1.11
添加PXC集群的所有ip,更改该当前节点的IP为192.168.1.11,更改当前节点的名称为pxc1
[root@localhost ~]# vim /etc/my.cnf
192.168.1.12
添加PXC集群的所有ip,更改该当前节点的IP为192.168.1.12,更改当前节点的名称为pxc2
[root@localhost ~]# vim /etc/my.cnf
192.168.1.13
添加PXC集群的所有ip,更改该当前节点的IP为192.168.1.13,更改当前节点的名称为pxc3
[root@localhost ~]# vim /etc/my.cnf
4.复制密钥和证书文件
确保集群使用一套证书,将节点二(192.168.1.12)和节点三(192.168.1.13)的证书进行删除
[root@localhost mysql]# cd
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# rm -fr *.pem
在192.168.1.11(pxc1)上将证书拷贝到节点二和节点三上
[root@localhost ~]# scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql
[root@localhost ~]# scp /var/lib/mysql/*.pem pxc3:/var/lib/mysql
5.开启集群
192.168.1.11第一个节点需要以引导模式启动
[root@pxc1 ~]# systemctl start mysql@bootstrap.service
192.168.1.12(pxc2)和192.168.1.13(pxc3)接着正常启动数据库服务
[root@pxc2 ~]# chown -R mysql.mysql /var/lib/mysql/
[root@pxc2 ~]# systemctl start mysql
[root@pxc3 ~]# chown -R mysql.mysql /var/lib/mysql/
[root@pxc3 ~]# systemctl start mysql
192.168.1.11查看 PXC 集群状态信息,在任意一个节点执行以下命令:
[root@localhost ~]# mysql -uroot -p123456 -e "show status like 'wsrep_cluster%';"
192.168.1.11登录Mysql查询集群信息
[root@localhost ~]# mysql -uroot -p123456
mysql> show status like 'wsrep%';