Percona XtraDB Cluster是MySQL高可用的一种方案,PXC集群是以节点组成(建议至少3个节点),每个节点都是常规的MySQL或者Percona Server,并且所有节点都是可读可写的,集群中的每个节点都保留着完整的数据,相对于主从架构,PXC更加体现出数据的强一致性。

优点

(1)服务高可用:所有节点数据是相同的,所有节点可读可写,只要存在一个节点可用,整个服务还能正常运行
(2)同步复制:当请求过来,只有所有节点成功提交,否则算提交失败
(3)多主复制:所有节点可读可写
总结来说PXC最大的优势:强一致性、所有节点可读可写、无同步时延

缺点

(1)仅支持InnoDB事务控制
(2)数据重复,所有节点都保留一份完整的数据
(3)PXC具有强一致性,必须所有节点执行成功才算提交成功,写入效率取决于节点最弱的一台
(4)新加入节点需要复制一份完整的数据,采用全量数据传输(SST)代价高
(5)所有表都要有主键
(6)存在较多的锁冲突、死锁问题
(7)不支持LOCK TABLE
(8)不支持XA

环境准备

node1:192.168.37.142
node2:192.168.37.143
node3:192.168.37.144

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
#设置hostname,三台机器分别对应node1 node2 node3
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
#重启
reboot

安装Percona XtraDB Cluster 5.7

#所有机器配置yum源 vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl =https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0

#所有机器安装
yum -y install Percona-XtraDB-Cluster-57

配置文件

wsrep_provider:指定Gelera库的路径
wsrep_cluster_address:Galera集群各节点地址
binlog_format:二进制日志格式,仅支持row格式的二进制日志
default_storage_engine:指定默认存储引擎,仅支持InnoDB
wsrep_slave_threads:用于设置读节点执行写集的线程个数
wsrep_log_conflicts:启用时输出的错误日志将包含产生冲突的表和schema
innodb_autoinc_lock_mode:只能设置为2,设置0或1时无法正确处理死锁问题
wsrep_node_address:本节点IP
wsrep_cluster_name:集群名称
wsrep_node_name:本节点hostname
pxc_strict_mode:是否限制pxc启动正在试用阶段的功能,默认值ENFORCING,表示不启用
wsrep_sst_method:全量传输SST,可用方法有mysqldump、rsync和xtrabackup,前2者在传输时都需要对Donor加全局只读锁,xtrabackup不需要,推荐使用xtrabackup
wsrep_sst_auth:在SST传输时需要用到的认证凭据,格式为:"用户:密码"

配置

配置文件都放在/etc/percona-xtradb-cluster.conf.d目录里,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三个文件

# cat mysqld.cnf 
# Template my.cnf for PXC
# Edit to your requirements.
[client]
socket=/var/lib/mysql/mysql.sock

[mysqld]
#server-id必须保证不一样
server-id=3
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# cat mysqld_safe.cnf 
#
# The Percona Server 5.7 configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
#不需要改变
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 0
[mysqld]
# Path to Galera library
wsrep_provider=/usr/lib64/galera3/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
#集群内所有节点IP,保证本地节点IP在最后
wsrep_cluster_address=gcomm://192.168.37.142,192.168.37.143,192.168.37.144

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# 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
#指定自己节点的IP
wsrep_node_address=192.168.37.144
# Cluster name
#集群名称,三台一样
wsrep_cluster_name=pxc-cluster

#If wsrep_node_name is not specified, then system hostname will be used
#每台机器对应的hostname
wsrep_node_name=node3

#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
pxc_strict_mode=ENFORCING

# SST method
#推荐使用xtrabackup
wsrep_sst_method=xtrabackup-v2

#Authentication for SST method
#SST复制所需要使用的mysql用户名和密码
wsrep_sst_auth="admin:admin"

启动PXC集群第一个节点

#启动
systemctl start mysql@bootstrap.service
#获取初始密码
grep "temporary password" /var/log/mysqld.log
#登录mysql
mysql -uroot -p'密码'
#修改密码
ALTER user root@'localhost' IDENTIFIED BY '123456';
#授予远程登录权限
use mysql;
update mysql.user set host='%' where user='root';
#刷新权限
FLUSH PRIVILEGES;

#创建SST传输需要的用户
CREATE user admin@'%' IDENTIFIED BY 'admin';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO admin@'%';
//刷新权限
FLUSH PRIVILEGES;

启动其他节点

#启动其他PXC节点与第一个节点命令不同
service mysql start

查看集群状态

show status like '%wsrep%'

wsrep_cluster_size表示集群节点数量
#当wsrep_local_state 为4,wsrep_local_state_comment为Synced 时,表示数据同步完成
wsrep_local_state #本地状态
wsrep_local_state_comment #本地状态评论
#当wsrep_cluster_status为Primary表示当前节点已经完成连接并准备好
wsrep_cluster_status

验证集群是否成功

使用navicat连接三个节点

在其中一个节点创建数据库staff,刷新下其他节点

可以发现其他节点也创建了staff数据库,整个集群状态是正常的