PXC原理分析

基本环境

节点1 192.168.1.114
节点2 192.168.1.115
节点3 192.168.1.116

Percona-Xtradb-Cluster 5.6 版本下载:

wget http://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.21-25.8/binary/tarball/Percona-XtraDB-Cluster-5.6.21-rel70.1-25.8.938.Linux.x86_64.tar.gz

依赖包安装:

[root@bogon mysql3306]# yum install  perl-DBD-MySQL.x86_64 perl-IO-Socket-SSL.noarch socat.x86_64 nc -y

[root@bogon opt]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm -y

[root@bogon opt]#yum install epel-release -y

[root@bogon mysql3306]# yum install -y percona-xtrabackup

初始化报错:

This probably means that your libc libraries are not 100 % compatible with this binary MySQL version. The MySQL daemon, mysqld, should work normally with the exception that host name resolving will not work. This means that you should use IP addresses instead of hostnames when specifying MySQL privileges !

解决办法:echo "ip 主机名" >>/etc/hosts

初始化报错:

./bin/my_print_defaults: error while loading shared libraries: libssl.so.6: cannot open shared object file: No such file or directory
FATAL ERROR: Neither host 'bogon' nor 'localhost' could be looked up with
./bin/resolveip
Please configure the 'hostname' command to return a correct
hostname.
If you want to solve this at a later stage, restart this script
with the --force option

解决办法:[root@bogon mysql]# yum -y install openssl098e.x86_64

[root@bogon mysql]# ./scripts/mysql_install_db 

[root@bogon mysql]# cp support-files/mysql.server /etc/init.d/mysql

my.cnf中添加配置文件:

binlog_format = row

default_storage_engine=InnoDB
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
wsrep_cluster_name=zhangshuo #cluster 的名字
wsrep_cluster_address=gcomm://192.168.1.114,192.168.1.115,192.168.1.116 #cluster 中的节点 ip
wsrep_node_address=192.168.1.115 #cluster 当前节点的 ip
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
#wsrep_sst_method=rsync
wsrep_sst_method=xtrabackup
wsrep_sst_auth=sst:mysql

第一节点启动:

[root@bogon mysql]# /etc/init.d/mysql bootstrap-pxc

root@localhost:mysql3306.sock  04:11:44 [(none)]>grant all privileges on *.* to 'mysql'@'%' identified by 'mysql';

root@localhost:mysql3306.sock  04:15:31 [(none)]>grant all privileges on *.* to 'sst'@'localhost' identified by 'mysql';

root@localhost:mysql3306.sock  04:16:18 [(none)]>flush privileges;

其他节点启动:

[root@bogon mysql]# /etc/init.d/mysql  start

检查集群状态:

show global status like “wsrep%”;

wsrep_local_state  4      #表示正常监听

wsrep_local_state_comment  Synced

wsrep_cluster_status  Primary    #表示是主节点可写入
wsrep_connected  ON

注意:
第一个节点启动的节点( 如果集群全部关闭,第一个起动也需要用这样的形式)
#/etc/init.d/mysql bootstrap-pxc
其它节点
#/etc/init.d/mysql start
备注:
如集群是不是所有的节点都关闭不用使#/etc/init.d/mysql bootstrap-pxc 启动。都可以用
#/etc/init.d/mysql start启动

新加入节点相当于新启一个节点,在启动时间把自己写入 wsrep_cluster_address 中,同时在
wsrep_node_address 中声明自已的 IP 即可。

当一个节点需要加入集群时(称为joiner)向集群申请全量,也可以指定集群中的机器:/etc/init.d/mysql start --wsrep_sst_donor=xxx.

SST:state snapshop transfer(镜像全量传输),提供SST的节点称为donor,一般不参与负载,IST:Incremental State Transfer(增量传输)。

SST,IST这些数据存放在gcache.size,默认是128M,有参数

gcache对应磁盘中galera.cache,数据库重启gcache会全部释放。

gcache分配算法:一个小时形成了多少binlog ,10分钟500M,一个小时3G。如果说离线1个小时,就需要设置大于3G

[root@bogon data]# cat grastate.dat
# GALERA saved state
version: 2.1
uuid: 6dae0dc2-2834-11e6-a45a-66ae03d92d96
seqno: -1  
cert_index:

seqno-1表示已加入到集群,数据库关闭后seqno会变。

PXC不是sql层的合并,而是文件、引擎层的合并。基本没有延迟,如果设备足够快如pci-e设备,其他节点可能比主库还快。

a,b,c 三个节点

a: update tb set col1=col1+100 where id = 100;

b: update tb set col1=col1-100 where id=100;

c: update tb set col1=500 where id=100;

如果3个事物同一时间同时更新往其他节点会验证时会通过吗?

因为是本地native processing操作是乐观锁,所以他们都可以操作成功。往其他节点同步时会更新冲突,三个节点都回滚,报Error: 1213 SQLSTATE: 40001

updatedelete引起的这些问题。可以将updatedelete放到一个节点解决问题。所以严格环境建议只有一个节点写,其他节点做故障接管、或读。

PXC的局限性:

1,仅仅工作在InnoDB引擎表上,因此对mysql库下的系统表的修改不能被复制,但是DDL操作时可以被复制的,所以可以通过create usergrant 等方式操作系统表

2,不支持在没有主键的表上的DELETE操作,select ... limit 也会在不同节点上返回不同的值

3,不支持的操作: LOCK/UNLOCK TABLES、 lock functions (GET_LOCK(), RELEASE_LOCK

4,query log日志不能存放在表里面,必须存放在文件

5,最大的事务大小由 wsrep_max_ws_rowswsrep_max_ws_size定义,LOAD DATA INFILE10k行提交一次,这种事务将被分割成数

个小的事务.

6,由于集群是基于乐观的并发控制( optimistic concurrency control ),事务冲突的情况可能会在commit阶段发生,当多个节点修改同时同一行数据,只有其中一个节点能够成功,失败的节点将终止,并且返回死锁错误代码 Error: 1213 SQLSTATE: 40001

7,不支持XA事务,因为XA事务有可能在commit的时候出现异常发生rollback

8,整个集群的吞吐量/性能取决于最慢的那个节点,因为需要在所有节点上做Certification,同时还取决于节点间的网络性能,因此需要所有节点都有相同的硬件配置,并且网络、磁盘等性能要尽可能的高,例如使用SSD

9,最小建议的集群节点数为3,为解决脑裂, 最多8个节点

10. DDL语句要特别小心,建议使用pt-online-schema-change。 

利用从库使用IST加入PXC集群:

保证从库没有延迟的情况下将同步和数据库关闭,配置PXC参数。记录从库同步位置然后解析binlog记录最后position点。

然后去主库(PXC节点)看最后同步position执行什么事务,找到对应xid。将主库grastate.dat拷贝到slave并修改seqno为对应的xid,最后启动mysql完成IST加入PXC集群。(建议使用mysqld_safe start  --wsrep_sst_donor=xxx。xid从这台机器来,所以要指定这个机器)

在PXC集群环境中也有uuid概念:wsrep_gcomm_uuid ,此uuid公共全局可见。(注意与binlog中记录的serverid+事物编号的GTID是两种不同的概念)。

官方文档: http://www.percona.com/doc/percona-xtradb-cluster/5.6/

原文地址:https://www.cnblogs.com/xxmysql/p/5568097.html