1.1 PXC 简介
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;
1.2 PXC特性和优点
- 完全兼容 MySQL。
- 同步复制,事务要么在所有节点提交或不提交。
- 多主复制,可以在任意节点进行写操作。
- 在从服务器上并行应用事件,真正意义上的并行复制。
- 节点自动配置,数据一致性,不再是异步复制。
- 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
- 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;
PXC最大的优势:强一致性、无同步延迟
1.3 PXC的局限和劣势
- 复制只支持
InnoDB
引擎,其他存储引擎的更改不复制 - 写入效率取决于节点中最慢的一台
1.4 PXC与Replication的区别
Replication | PXC |
---|---|
数据同步是单向的,master负责写,然后异步复制给slave;如果slave写入数据,不会复制给master。 | 数据同步时双向的,任何一个mysql节点写入数据,都会同步到集群中其它的节点。 |
异步复制,从和主无法保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
1.5 PXC 常用端口
- 3306:数据库对外服务的端口号。
- 4444:请求SST的端口。
- 4567:组成员之间进行沟通的一个端口号
- 4568:用于传输IST。
名词解释:
- SST(State Snapshot Transfer): 全量传输
- IST(Incremental state Transfer):增量传输
从图中可以看出PXC的操作流程。首先客户端先发起一个事务,该事务先在本地执行,执行完成之后就要发起对事务的提交操作了。在提交之前需要将产生的复制写集广播出去,然后获取到一个全局的事务ID号,一并传送到另一节点上面。通过验证合并数据之后,发现没有冲突数据,执行apply_cb和commit_cb动作,否则就需要取消(discard)此次事务的操作。而当前server节点通过验证之后,执行提交操作,并返回OK,如果验证没通过,则执行回滚。当然在生产中至少要有三个节点的集群环境,如果其中有一个节点没有验证通过,出现数据冲突,那么此时采取的方式就是将出现不一致的节点踢出集群环境,而且它自己会执行shutdown命令,自动关机。
首先要规范集群中节点的数量,整个集群中节点数控制在最少3个、最大8个的范围内。最少3个节点是为了防止出现脑裂现象,因为只有在啊两个节点下才会出现此现象。脑裂现象的标志就是输入任何命令,返回结果都是unknow command.节点在集群中,会因新节点的假如或者故障,同步失效等而发生状态的切换。
节点状态变化阶段:
open--节点启动成功,尝试连接到集群。
primary--节点已处于集群中,在新节点加入时,选取donor进行数据同步时会产生的状态。
joiner--节点处于等待接收同步文件时的状态。
joined--节点完成数据同步的工作,尝试保持和集群进度一致。
synced--节点正常提供服务的状态,表示已经同步完成并和集群进度保持一致。
doner--节点处于为新加入的节点提供全量数据时的状态。
注:doner节点就是数据的贡献者,如果一个新节点加入集群,此时又需要大量数据的SST传输,就有可能因此而拖垮整个集群的性能。所以在生产环境中,如果数据量小,还可以使用SST全量传输,但如果数据量很大就不建议使用这种方式了。可以考虑先建立主从关系,再加入集群。
搭建PXC集群过程中,需要在PXC配置文件中设置好如下参数:
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 ##传输数据的方法,现在版本中都使用xtrabackup V2方式
wsrep_sst_auth=sst:zs ##节点的数据库用户的账号和密码
在PXC中还有一个特别重要的模块就是GCache。他的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用SST方式了。这样可以让几点更快的加入集群中。涉及如下参数:
gcache.size 代表用来缓存写集增量信息的大小。它的默认大小是128MB,通过wsrep_provider_options 参数设置。建议调整为2GB~4GB范围,足够的空间便于缓存更多的增量信息。
gcache.mem_size 代表Gcache中内存缓存的大小,适度调大可以提高整个集群的性能。
gcache.page_size 可以理解为如果内存不够用(Gcache不足),就直接将写集写入磁盘文件中。
安装之前的注意事项:
首先要保证三台机器的防火墙iptables、selinux都要关闭,三台机器的server-id不能一样。
PXC集群下载地址:
https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/
其安装方式类似于mysql,然后就是配置文件:
default_storage_engine=Innodb
innodb_autoinc_lock_mode=2
wsrep_cluster_name=pxc_wcf --------集群的名字
wsrep_cluster_address=gcomm://192.168.2.100,192.168.2.101,192.168.2.102(集群中节点的IP)
wsrep_cluster_address=192.168.2.100 ------当前几区的IP地址
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=1G"
wsrep_sst_method=xtrabackup-v2 (SST传输方法)
wsrep_sst_auth=sst:zs (账号权限)
初始化 :/usr/loca/mysql/bin/mysql --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/ --user=mysql --initialize
启动第一个服务节点:
cd /usr/local/mysql/support-files
cp mysql.server /etc/init.d/mysql
/etc/init.d/mysql bootstrap-pxc
然后就是创建超管用户,创建PXC SST用户:
注:节点2和节点3的PXC启动方式不是/etc/init.d/mysql bootstrap-pxc,而换成了/etc/init.d/mysql start 方式。只有节点1才使用/etc/init.d/mysql bootstrap-pxc方式启动。
PXC集群状态的监控
使用show global status like 'wsrep%'命令来查看集群中的参数状态。下面列出几个重要的参数,便于诊断问题。
wsrep_cluster_state_uuid:集群中所有的节点值应该是相同的,如果有不同值的节点,说明其没有连接入集群。
wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接。
wsrep_cluster_status:集群组成的状态。如果不为“primary”,说明出现‘分区’或‘脑裂’现象。
wsrep_local_state:值为4表示正常。节点状态有如下4个值。
joining——表示节点正在加入集群;
donor——当前节点是数据奉献者,正在为新加入的节点同步数据;
joined——当前节点已经成功加入集群;
synced——表示当前节点与整个集群是同步状态。
wsrep_last_committed:最后提交的事务数目。
wsrep_ready:值为ON表示当前节点可以正常服务,如果值为OFF,则该节点可能发生脑裂或者网络问题。
从复制节点在线转换为PXC节点
先把node3的配置成node2的从库
待主从一致后记录从库的binlog位置
停掉从库
然后把PXC的配置写进node3的/my.cnf配置文件。。
然后用mysqlbinlog去查看position位置对应的XID
接下来将node2上的grastate.dat复制到node3对应的目录下。
命令如下:
scp grastate.dat 192.168.2.103:/data/mysql/
最后在node3节点上设置同步开始位置:
cd /data/mysql
编辑grastate.dat文件,修改seqno的值,将seqno:-1改成刚才获取的position对应的Xid的值,这个就是PXC同步开始的位置。