pxc是基于galera协议的mysql高可用集群架构。具有高可用性、方便扩展且可以实现多个mysql节点间的数据同步复制和读写,保证数据的强一致性。可以基本达到实时同步且相互的关系是对等的,各节点之间各自为主,这种架构不共享任何数据,是一种高冗余架构。
pxc的操作流程。首先客户端发起一个事务,该事务先在本地执行,执行完成后发起对事务的提交操作前会将产生的复制集广播出去获得一个全局的事务id号一起传送给其它节点,其它的节点经过验证合并数据后发现没有冲突数据则执行apply_cb和commit_cb操作,否则就执行discard(取消)此次事务操作。当前节点通过验证之后执行提交并返回ok,如果验证不通过则执行回滚。生产环境中如果有一个节点验证没有通过,产生数据冲突则会将不一致的节点踢出集群,被踢出节点自己会执行shutdown。
2.1 优点
(1)实现了mysql数据库的高可用和数据的强一致性
(2)完成了真正的多节点读写的集群方案
(3)基本达到了实时同步,改善了传统意义上的主从延迟问题
(4)新加入的节点可以自动部署,无需提供手动备份
(5)数据库的故障切换容易
2.2 缺点
(1)新加入的节点开销大,需要复制完整的数据。采用sst传输开销太大
(2)任何更新事务都需要全局验证通过,才会在每个节点库上执行,集群性能受限于性能最差的节点(短板效应)。
(3)因为需要保证数据的一致性,所以在多个节点并发写时,所冲突比较严重
(4)存在写扩大问题,所有节点都会发生写操作
(5)只支持innodb存储引擎
(6)没有表级别的锁定,执行ddl语句操作会把整个集群锁住,而且“kill”不掉(建议使用osc操作)
(7)所有表必须有主键,不然操作数据时会报错
3.1 使用到的常见端口
3306-数据库对外服务的端口
4444-请求sst端口(sst是指数据库一个备份全量文件的传输)
4567-组成员之间进行沟通的端口号
4568-用于传输ist(相对sst来说的一个增量)
3.2 节点状态变化阶段
open-节点启动成功,尝试连接到集群
primary-节点已处于集群中,在新节点加入时选区doner进行数据同步会产生的状态
joiner-节点处于等待接受同步文件时的状态
joined-节点完成数据同步工作,尝试保持与集群进度一致
synced-节点正常提供服务的状态,表示以经同步完成并和集群进度保持一致
doner-节点处于为新加入的节点提供全量数据时的状态
当doner节点向新加入集群的节点同步数据时使用sst传输,由于数据量很大可能会因此而拖垮整个集群的性能。所以在生产环境中如果数据量下可以使用sst全量传输,但是如果数据量很大则可以先建立主从关系再加入集群
3.3 节点间数据传输
pxc有两种节点的传输方式:sst(全量传输)和ist(增量传输)。sst传输有xtrabackup、mysqldump和rsync三种方法,但增量传输只有xtrabackup一种。
3.3.1 配置文件中需配置的传输参数
wsrep_cluster_name ##标识该集群的名字
wsrep_cluster_address=gcomm: ##列出集群中的成员
wsrep_node_address ##当前节点的ip地址
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so ##指定galera库的路径和文件名
wsrep_sst_method=xtrabackup-v2 ##传输数据的方法
wrep_sst_auth=sst:zs ##节点的数据库用户的账号密码
3.3.2 集群内存
pxc有一个特别重要模块gcache。他的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入则可以将新数据的增量传递给新节点,而不需使用sst。涉及参数如下:
gcache.size-缓存写集增量信息的大小。默认为128mb,通过wsrep_provider_options参数设置,建议调整为2g~4g
gcache.mem_size-代表gcache中内存缓存大小,适度调大可以提高整个集群的性能
gcache.page_size-可以理解为如果内存不够(gcache不足),就直接将写集写入磁盘文件中
3.4pxc 架构的搭建
3.4.1 环境介绍及主备
192.168.56.11-node1 192.168.56.12-node2 192.168.56.13 node3
软件下载:https://www.percona.com/downloads/percona-xtradb-cluster-latest/
https://www.percona.com/downloads/percona-xtrabackup-latest/
每个节点均安装配置pxc软件包和xtrabackup软件包,并安装依赖包
yum install perl-io-socket-ssl.noarch
yum install perl-dbd-mysql.x86_64
yum install perl-time-hirres
yum install opensll
yum install opensll-devel
yum install socat
3.4.2 解压pxc软件并安装(所有节点均执行)
和mysql单节点安装配置过程一样
cd /usr/local
tar -xzvf percona-xtradb-cluster-8.0.19-r217-el7-x86_64-bundle.tar
mv percona-xtradb-cluster-8.0.19-r217-el7-x86_64-bundle mysql
chown mysql:mysql -r mysql
mkdir -p /data/mysql
3.4.3 修改配置文件(添加如下内容,其它和mysql配置文件相同)所有节点均配置
#pxc
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_cluster_name=pxc_zs
wsrep_cluster_address=gcomm://192.168.56.11,192.168.56.12,192.168.56.13
wsrep_node_address=192.168.56.100
wsrep_provider_options="gcache.size=1g"
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:zs
3.4.4 第一个节点启动和配置
3.4.4.1 初始化数据
cd /usr/local/mysql/bin
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql --initialize
3.4.4.2 启动第一个节点服务
cd /usr/local/mysql/support-files
cp mysql.server /etc/init.d/mysql
/etc/init.d/mysql bootstrap-pxc
3.4.4.3 创建超管用户和pxc sst传输账号
create user 'zs'@'192.168.56.%' identified by 'zs';
grant all privileges on *.* to 'zs'@'192.168.56.%';
create user 'sst'@'localhost' identified by 'zs';
grant all privileges on *.* to 'sst'@'localhost';
flush privilges;
3.4.5 配置第二节点
初始化数据(同第一个节点)
启动第二节点:
/etc/init.d/mysql start
3.4.6 配置第三节点(和第二节点相同)
show global status like 'wsrep%';
wsrep_cluster_state_uuid:集群中所有的节点值是相同的,如果不同值的节点说明没有连接如集群
wsrep_cluster_size:该值如果和预期的节点数一致,说明所有集群节点以经连接
wsrep_cluster_status:集群组成的状态,如果不为“primary”说明出现分区或脑裂现象
wsrep_local_state:值为4表示正常
(1)joining==表示节点正在加入集群
(2)donor–当前节点是数据奉献者,正在为新加入的节点同步数据
(3)joined–当前节点以经成功加入集群
(4)synced–当前节点与整个集群是同步状态
wsrep_last_committed:最后提交的事务数目
wsrep_ready:值为on表示当前节点可以正常服务,如果值为off该节点可能发生脑裂或网络问题
5.1 环境介绍
将新节点56.14加入到集群中,新节点以经安装好了pxc的软件,服务已启动
5.2 操作过程
5.2.1 将新节点(node4)成为集群中某个节点(node3)的从节点,搭建主从架构。
https://www.modb.pro/db/29815
5.2.2 关闭node4上的服务
/etc/init.d/mysql stop
将pxc的相关配置参数加入到配置文件中(见3.4.3)
5.2.3 在node3上确认pxc需要同步的位置(position号和xid)
/usr/local/mysql/bin/mysqlbinlog -v -v mysql-bin.000001|grep xid
5.2.4 配置grastate.dat文件
cat /data/mysql/grastate.dat
node3的输出结果中uuid是集群的wsrep_cluster_state_uuid。seqno是集群中wsrep_last_committed的值,节点正在运行和非正常关闭状态值都为-1。
scp grastate.dat 192.168.56.14:/data/mysql
修改node4刚拷贝过来的grastate.dat文件中的seqno值设为node3上查询出的xid,并修改权限
chown mysql:mysql grastate.dat
5.2.5 启动node4节点上的pxc服务
/etc/init.d/mysql start
查看新加入的节点node4的状态
show gloabl status like '%ws%';