简介html
Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案,Percona XtraDB Cluster提供的特性以下:node
1.同步复制,事务要么在全部节点提交或不提交。mysql
2.多主复制,能够在任意节点进行写操做。sql
3.在从服务器上并行应用事件,真正意义上的并行复制。数据库
4.节点自动配置。bootstrap
5.数据一致性,再也不是异步复制。服务器
Percona XtraDB Cluster彻底兼容MySQL和Percona Server,表如今:架构
1.数据的兼容性并发
2.应用程序的兼容性:无需更改应用程序app
1.集群是有节点组成的,推荐配置至少3个节点,可是也能够运行在2个节点上。
2.每一个节点都是普通的mysql/percona服务器,能够将现有的数据库服务器组成集群,反之,也能够将集群拆分红单独的服务器。
3.每一个节点都包含完整的数据副本。
优势以下:
1.当执行一个查询时,在本地节点上执行。由于全部数据都在本地,无需远程访问。
2.无需集中管理。能够在任什么时候间点失去任何节点,可是集群将照常工做,不受影响。
3.良好的读负载扩展,任意节点均可以查询。
缺点以下:
1.加入新节点,开销大。须要复制完整的数据。
2.不能有效的解决写缩放问题,全部的写操做都将发生在全部节点上。
3.有多少个节点就有多少重复的数据。
架构图以下:
(图片来源官网)
Percona XtraDB Cluster与MySQL Replication区别在于:
分布式系统的CAP理论。
C— 一致性,全部节点的数据一致。
A— 可用性,一个或多个节点失效,不影响服务请求。
P— 分区容忍性,节点间的链接失效,仍然能够处理请求。
任何一个分布式系统,须要知足这三个中的两个。
MySQL Replication: 可用性和分区容忍性
Percona XtraDB Cluster: 一致性和可用性
所以MySQL Replication并不保证数据的一致性,而Percona XtraDB Cluster提供数据一致性。
Percona XtraDB Cluster组件:
Percona XtraDB Cluster基于XtraDB的Percona Server以及包含写复制集补丁。使用Galera 2.x library,事务型应用下的通用的多主同步复制插件。
Galera 2.x新特性有:
1.IST(Incremental State Transfer)增量状态传输。对于WAN特别有用。
2.RSU(Rolling Schema Update)旋转更新架构。不会阻止对表进行操做。
局限性
1.目前的复制仅仅支持InnoDB存储引擎。任何写入其余引擎的表,包括mysql.*表将不会复制。可是DDL语句会被复制的,所以建立用户将会被复制,可是insert into mysql.user…将不会被复制的。
2.DELETE操做不支持没有主键的表。没有主键的表在不一样的节点顺序将不一样,若是执行SELECT…LIMIT… 将出现不一样的结果集。
3.在多主环境下LOCK/UNLOCK TABLES不支持。以及锁函数GET_LOCK(), RELEASE_LOCK()…
4.查询日志不能保存在表中。若是开启查询日志,只能保存到文件中。
5.容许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操做将被拒绝。如大型的LOAD DATA操做。
6.因为集群是乐观的并发控制,事务commit可能在该阶段停止。若是有两个事务向在集群中不一样的节点向同一行写入并提交,失败的节点将停止。对于集群级别的停止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
7.XA事务不支持,因为在提交上可能回滚。
8.整个集群的写入吞吐量是由最弱的节点限制,若是有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,全部的节点应使用统一的硬件。
9.集群节点建议最少3个。2个也能够运行,可是官方不推荐这么作,由于3个节点是为了预防脑裂。
10.若是DDL语句有问题将破坏集群。建议使用pt-online-schema-change操做DDL。
经过以上的简单了解,相信你们已经有了初步认识,更加深刻的内容,推荐童鞋们阅读官方文档。下面咱们进行环境的搭建与测试。测试机器信息以下:
注意:Percona-XtraDB-Cluster在启动之后会额外启动端口来进行状态检测,因此请开放相应的端口,默认是4567端口。我测试环境关闭了iptables。
node1 192.168.0.100 node2 192.168.0.101 node3 192.168.0.102
1.安装软件依赖包(添加repl源,再安装依赖,3台server操做同样。)
[root@node1 ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@node1 ~]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc -y
2.安装xtrabackup(PXC同步数据须要用到,为何使用xtrabackup?本身查询官方文档)
[root@node1 ~]# wget -q http://www.percona.com/downloads/XtraBackup/LATEST/binary/redhat/6/x86_64/percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm [root@node1 ~]# rpm -ivh percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
3.下载安装Percona-XtraDB-Cluster
[root@node1 ~]# wget http://www.percona.com/downloads/Percona-XtraDB-Cluster-56/LATEST/binary/tarball/Percona-XtraDB-Cluster-5.6.19-rel67.0-25.6.824.Linux.x86_64.tar.gz
[root@node1 ~]# tar xf Percona-XtraDB-Cluster-5.6.19-rel67.0-25.6.824.Linux.x86_64.tar.gz -C /usr/local/ [root@node1 ~]# cd /usr/local/ [root@node1 local]# ln -s Percona-XtraDB-Cluster-5.6.19-rel67.0-25.6.824.Linux.x86_64/ mysql [root@node1 local]# cd mysql [root@node1 mysql]# groupadd mysql [root@node1 mysql]# useradd -r -g mysql mysql [root@node1 mysql]# chown -R mysql . [root@node1 mysql]# chgrp -R mysql . [root@node1 mysql]# cp support-files/my-default.cnf /etc/my.cnf [root@node1 mysql]# mkdir -p /data/mysql [root@node1 mysql]# chown -R mysql.mysql /data/mysql/ [root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
[root@node1 mysql]# chown -R root . [root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysql [root@node1 mysql]# chmod 755 /etc/init.d/mysql
修改my.cnf配置文件以下:
[root@node1 mysql]# grep dir /etc/my.cnf basedir = /usr/local/mysql datadir = /data/mysql [root@node1 mysql]#
并在[mysqld]段落添以下参数:
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so #库文件 wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102 #节点中全部ip wsrep_node_address=192.168.0.100 #节点的ip wsrep_slave_threads=2 #开启的复制线程数,cpu核数*2 binlog_format=ROW #binlog格式必须为row default_storage_engine=InnoDB #暂时不支持其余存储引擎,只支持innodb,固然能够支持myisam,须要另外参数打开 innodb_autoinc_lock_mode=2 #自增锁的优化 wsrep_cluster_name=pxc-yayun #集群名字 wsrep_sst_auth=sst:yayun #sst模式须要的用户名和密码 wsrep_sst_method=xtrabackup-v2 #采用什么方式复制数据。还支持mysqldump,rsync
启动,进行受权操做,对于第一个节点必须以特殊方式启动,以下:
[root@node1 mysql]# /etc/init.d/mysql --help Usage: mysql {start|stop|restart|restart-bootstrap|reload|force-reload|status|bootstrap-pxc} [ MySQL (Percona XtraDB Cluster) options ] [root@node1 mysql]# /etc/init.d/mysql bootstrap-pxc Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (P[ OK ]traDB Cluster)......... [root@node1 mysql]#
进行查看,能够发现启动两个端口
[root@node1 ~]# netstat -nltp | grep mysqld tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 2964/mysqld tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2964/mysqld [root@node1 ~]#
进行受权,推荐使用grant方式
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON * . * TO 'sst'@'localhost' IDENTIFIED BY 'yayun'; Query OK, 0 rows affected (0.03 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.03 sec) mysql>
到这里咱们的第一个节点就搞定了,剩下的两个节点配置稍微不一样,安装方式都是同样的,再也不重复。
node2的配置以下:
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102 wsrep_node_address=192.168.0.101 wsrep_slave_threads=2 binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 wsrep_cluster_name=pxc-yayun wsrep_sst_auth=sst:yayun wsrep_sst_method=xtrabackup-v2
node3的配置以下:
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102 wsrep_node_address=192.168.0.102 wsrep_slave_threads=2 binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 wsrep_cluster_name=pxc-yayun wsrep_sst_auth=sst:yayun wsrep_sst_method=xtrabackup-v2
node2,node3节点都配置完成之后,咱们启动,对于第2,3个节点启动和咱们普通的MySQL启动方式同样。
node2启动:
[root@node2 ~]# /etc/init.d/mysql start MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists Starting MySQL (Percona XtraDB Cluster)...............State transfer in progress, setting sleep higher ............. [ OK ] [root@node2 ~]#
日志输出以下:
[root@node2 mysql]# tail -n 20 node2.err 2014-07-25 10:44:29 33172 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646 2014-07-25 10:44:29 33172 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 997242b1-13a5-11e4-aa74-000c29fedc91. 2014-07-25 10:44:29 33172 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work. 2014-07-25 10:44:29 33172 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work. 2014-07-25 10:44:29 33172 [Note] Server hostname (bind-address): '*'; port: 3306 2014-07-25 10:44:29 33172 [Note] IPv6 is available. 2014-07-25 10:44:29 33172 [Note] - '::' resolves to '::'; 2014-07-25 10:44:29 33172 [Note] Server socket created on IP: '::'. 2014-07-25 10:44:29 33172 [Note] Event Scheduler: Loaded 0 events 2014-07-25 10:44:29 33172 [Note] WSREP: Signalling provider to continue. 2014-07-25 10:44:29 33172 [Note] WSREP: inited wsrep sidno 1 2014-07-25 10:44:29 33172 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1 2014-07-25 10:44:29 33172 [Note] /usr/local/mysql/bin/mysqld: ready for connections. Version: '5.6.19-67.0-25.6' socket: '/tmp/mysql.sock' port: 3306 Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111 2014-07-25 10:44:30 33172 [Note] WSREP: 1.0 (node2): State transfer from 0.0 (node1) complete. 2014-07-25 10:44:30 33172 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1) 2014-07-25 10:44:30 33172 [Note] WSREP: Member 1.0 (node2) synced with group. 2014-07-25 10:44:30 33172 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1) 2014-07-25 10:44:30 33172 [Note] WSREP: Synchronized with group, ready for connections 2014-07-25 10:44:30 33172 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification. [root@node2 mysql]#
node3启动:
[root@node3 ~]# /etc/init.d/mysql start MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists Starting MySQL (Percona XtraDB Cluster)....................................State transfer in progress, setting sleep higher ..... [ OK ] [root@node3 ~]#
日志输出以下:
[root@node3 mysql]# tail -n 20 node3.err 2014-07-25 10:49:26 38949 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646 2014-07-25 10:49:26 38949 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4ad6df19-13a6-11e4-aae1-000c29d894d0. 2014-07-25 10:49:27 38949 [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work. 2014-07-25 10:49:27 38949 [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work. 2014-07-25 10:49:27 38949 [Note] Server hostname (bind-address): '*'; port: 3306 2014-07-25 10:49:27 38949 [Note] IPv6 is available. 2014-07-25 10:49:27 38949 [Note] - '::' resolves to '::'; 2014-07-25 10:49:27 38949 [Note] Server socket created on IP: '::'. 2014-07-25 10:49:27 38949 [Note] Event Scheduler: Loaded 0 events 2014-07-25 10:49:27 38949 [Note] WSREP: Signalling provider to continue. 2014-07-25 10:49:27 38949 [Note] WSREP: inited wsrep sidno 1 2014-07-25 10:49:27 38949 [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:1 2014-07-25 10:49:27 38949 [Note] /usr/local/mysql/bin/mysqld: ready for connections. Version: '5.6.19-67.0-25.6' socket: '/tmp/mysql.sock' port: 3306 Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111 2014-07-25 10:49:28 38949 [Note] WSREP: 0.0 (node3): State transfer from 1.0 (node1) complete. 2014-07-25 10:49:28 38949 [Note] WSREP: Shifting JOINER -> JOINED (TO: 1) 2014-07-25 10:49:28 38949 [Note] WSREP: Member 0.0 (node3) synced with group. 2014-07-25 10:49:28 38949 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 1) 2014-07-25 10:49:28 38949 [Note] WSREP: Synchronized with group, ready for connections 2014-07-25 10:49:28 38949 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification. [root@node3 mysql]#
若是启动失败,日志里面也会有提示的,一般启动失败的缘由有以下:
(1)配置文件错误
(2)防火墙没有开放相应的端口,好比默认的4567端口
(3)忘记进行受权帐号
(4)xtrabackup没有安装或者安装有问题
下面咱们进行相关的测试,好比在node节点建立表,插入数据,看另外两个节点是否有数据。
node1节点建立表t1,插入数据,在另外两个节点也能够看见:
mysql> create database yayun; Query OK, 1 row affected (0.02 sec) mysql> use yayun Database changed mysql> create table t1 ( id int,name char(20)) engine=innodb; Query OK, 0 rows affected (0.03 sec) mysql> insert into t1 select 1,'yayun'; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 1 | yayun | +------+-------+ 1 row in set (0.00 sec) mysql>
node2节点:
mysql> select * from yayun.t1; +------+-------+ | id | name | +------+-------+ | 1 | yayun | +------+-------+ 1 row in set (0.00 sec) mysql>
node3节点:
mysql> select * from yayun.t1; +------+-------+ | id | name | +------+-------+ | 1 | yayun | +------+-------+ 1 row in set (0.00 sec) mysql>
到这里搭建就基本结束了。3个节点同时支持write/read操做。更加详细的介绍以及细节建议你们参考官方文档。
总结:
Percona XtraDB Cluster如今已经有企业在使用了,我这里只是简单的搭建以及测试,若是线上须要使用咱们还须要进行相关压力测试。好比使用sysbench,或者tpcc-mysql。
一般咱们单独使用Percona XtraDB Cluster也没有任何问题的,若是使用经过结合harproxy,或者lvs+keepalived的方式来使用会更加的完美。前面说到的那些局限性一般咱们不多可以触发到,因此使用Percona XtraDB Cluster来实现高可用是很是不错的选择。后续我会进行一个压力测试对比。
参考资料:
http://www.percona.com/doc/percona-xtradb-cluster/5.6/intro.html
http://www.percona.com/doc/percona-xtradb-cluster/5.6/howtos/cenots_howto.html