简介

Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案,Percona XtraDB Cluster提供的特性如下:

1.同步复制,事务要么在所有节点提交或不提交。

2.多主复制,可以在任意节点进行写操作。

3.在从服务器上并行应用事件,真正意义上的并行复制。

4.节点自动配置。

5.数据一致性,不再是异步复制。

Percona XtraDB Cluster完全兼容MySQL和Percona Server,表现在:

1.数据的兼容性

2.应用程序的兼容性:无需更改应用程序

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。

  1. node1 192.168.0.100
  2. node2 192.168.0.101
  3. node3 192.168.0.102

1.安装软件依赖包(添加repl源,再安装依赖,3台server操作一样。)

  1. [root@node1 ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  1. [root@node1 ~]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc -y

2.安装xtrabackup(PXC同步数据需要用到,为什么使用xtrabackup?自己查询官方文档)

  1. [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
  2. [root@node1 ~]# rpm -ivh percona-xtrabackup-2.2.-.el6.x86_64.rpm

3.下载安装Percona-XtraDB-Cluster

  1. [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
  1. [root@node1 ~]# tar xf Percona-XtraDB-Cluster-5.6.-rel67.-25.6..Linux.x86_64.tar.gz -C /usr/local/
  2. [root@node1 ~]# cd /usr/local/
  3. [root@node1 local]# ln -s Percona-XtraDB-Cluster-5.6.-rel67.-25.6..Linux.x86_64/ mysql
  4. [root@node1 local]# cd mysql
  5. [root@node1 mysql]# groupadd mysql
  6. [root@node1 mysql]# useradd -r -g mysql mysql
  7. [root@node1 mysql]# chown -R mysql .
  8. [root@node1 mysql]# chgrp -R mysql .
  9. [root@node1 mysql]# cp support-files/my-default.cnf /etc/my.cnf
  10. [root@node1 mysql]# mkdir -p /data/mysql
  11. [root@node1 mysql]# chown -R mysql.mysql /data/mysql/
  12. [root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/
  1. [root@node1 mysql]# chown -R root .
  2. [root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysql
  3. [root@node1 mysql]# chmod /etc/init.d/mysql

修改my.cnf配置文件如下:

  1. [root@node1 mysql]# grep dir /etc/my.cnf
  2. basedir = /usr/local/mysql
  3. datadir = /data/mysql
  4. [root@node1 mysql]#

并在[mysqld]段落添如下参数:

  1. wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so #库文件
  2. wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102 #节点中所有ip
  3. wsrep_node_address=192.168.0.100 #节点的ip
  4. wsrep_slave_threads= #开启的复制线程数,cpu核数*
  5. binlog_format=ROW #binlog格式必须为row
  6. default_storage_engine=InnoDB #暂时不支持其他存储引擎,只支持innodb,当然可以支持myisam,需要另外参数打开
  7. innodb_autoinc_lock_mode= #自增锁的优化
  8. wsrep_cluster_name=pxc-yayun #集群名字
  9. wsrep_sst_auth=sst:yayun #sst模式需要的用户名和密码
  10. wsrep_sst_method=xtrabackup-v2 #采用什么方式复制数据。还支持mysqldump,rsync

启动,进行授权操作,对于第一个节点必须以特殊方式启动,如下:

  1. [root@node1 mysql]# /etc/init.d/mysql --help
  2. Usage: mysql {start|stop|restart|restart-bootstrap|reload|force-reload|status|bootstrap-pxc} [ MySQL (Percona XtraDB Cluster) options ]
  3. [root@node1 mysql]# /etc/init.d/mysql bootstrap-pxc
  4. Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (P[ OK ]traDB Cluster).........
  5. [root@node1 mysql]#

进行查看,可以发现启动两个端口

  1. [root@node1 ~]# netstat -nltp | grep mysqld
  2. tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
  3. tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
  4. [root@node1 ~]#

进行授权,推荐使用grant方式

  1. mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON * . * TO 'sst'@'localhost' IDENTIFIED BY 'yayun';
  2. Query OK, rows affected (0.03 sec)
  3.  
  4. mysql> FLUSH PRIVILEGES;
  5. Query OK, rows affected (0.03 sec)
  6.  
  7. mysql>

到这里我们的第一个节点就搞定了,剩下的两个节点配置稍微不同,安装方式都是一样的,不再重复。
node2的配置如下:

  1. wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
  2. wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102
  3. wsrep_node_address=192.168.0.101
  4. wsrep_slave_threads=
  5. binlog_format=ROW
  6. default_storage_engine=InnoDB
  7. innodb_autoinc_lock_mode=
  8. wsrep_cluster_name=pxc-yayun
  9. wsrep_sst_auth=sst:yayun
  10. wsrep_sst_method=xtrabackup-v2

node3的配置如下:

  1. wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
  2. wsrep_cluster_address=gcomm://192.168.0.100,192.168.0.101,192.168.0.102
  3. wsrep_node_address=192.168.0.102
  4. wsrep_slave_threads=
  5. binlog_format=ROW
  6. default_storage_engine=InnoDB
  7. innodb_autoinc_lock_mode=
  8. wsrep_cluster_name=pxc-yayun
  9. wsrep_sst_auth=sst:yayun
  10. wsrep_sst_method=xtrabackup-v2

node2,node3节点都配置完成以后,我们启动,对于第2,3个节点启动和我们普通的MySQL启动方式一样。

node2启动:

  1. [root@node2 ~]# /etc/init.d/mysql start
  2. MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists
  3. Starting MySQL (Percona XtraDB Cluster)...............State transfer in progress, setting sleep higher
  4. ............. [ OK ]
  5. [root@node2 ~]#

日志输出如下:

  1. [root@node2 mysql]# tail -n node2.err
  2. -- :: [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646
  3. -- :: [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.
  4. -- :: [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.
  5. -- :: [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.
  6. -- :: [Note] Server hostname (bind-address): '*'; port:
  7. -- :: [Note] IPv6 is available.
  8. -- :: [Note] - '::' resolves to '::';
  9. -- :: [Note] Server socket created on IP: '::'.
  10. -- :: [Note] Event Scheduler: Loaded events
  11. -- :: [Note] WSREP: Signalling provider to continue.
  12. -- :: [Note] WSREP: inited wsrep sidno
  13. -- :: [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:
  14. -- :: [Note] /usr/local/mysql/bin/mysqld: ready for connections.
  15. Version: '5.6.19-67.0-25.6' socket: '/tmp/mysql.sock' port: Percona XtraDB Cluster binary (GPL) 5.6.-25.6, Revision , wsrep_25..r4111
  16. -- :: [Note] WSREP: 1.0 (node2): State transfer from 0.0 (node1) complete.
  17. -- :: [Note] WSREP: Shifting JOINER -> JOINED (TO: )
  18. -- :: [Note] WSREP: Member 1.0 (node2) synced with group.
  19. -- :: [Note] WSREP: Shifting JOINED -> SYNCED (TO: )
  20. -- :: [Note] WSREP: Synchronized with group, ready for connections
  21. -- :: [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
  22. [root@node2 mysql]#

node3启动:

  1. [root@node3 ~]# /etc/init.d/mysql start
  2. MySQL (Percona XtraDB Cluster) is not running, but lock fil[FAILED]lock/subsys/mysql) exists
  3. Starting MySQL (Percona XtraDB Cluster)....................................State transfer in progress, setting sleep higher
  4. ..... [ OK ]
  5. [root@node3 ~]#

日志输出如下:

  1. [root@node3 mysql]# tail -n node3.err
  2. -- :: [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646
  3. -- :: [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.
  4. -- :: [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.
  5. -- :: [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.
  6. -- :: [Note] Server hostname (bind-address): '*'; port:
  7. -- :: [Note] IPv6 is available.
  8. -- :: [Note] - '::' resolves to '::';
  9. -- :: [Note] Server socket created on IP: '::'.
  10. -- :: [Note] Event Scheduler: Loaded events
  11. -- :: [Note] WSREP: Signalling provider to continue.
  12. -- :: [Note] WSREP: inited wsrep sidno
  13. -- :: [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:
  14. -- :: [Note] /usr/local/mysql/bin/mysqld: ready for connections.
  15. Version: '5.6.19-67.0-25.6' socket: '/tmp/mysql.sock' port: Percona XtraDB Cluster binary (GPL) 5.6.-25.6, Revision , wsrep_25..r4111
  16. -- :: [Note] WSREP: 0.0 (node3): State transfer from 1.0 (node1) complete.
  17. -- :: [Note] WSREP: Shifting JOINER -> JOINED (TO: )
  18. -- :: [Note] WSREP: Member 0.0 (node3) synced with group.
  19. -- :: [Note] WSREP: Shifting JOINED -> SYNCED (TO: )
  20. -- :: [Note] WSREP: Synchronized with group, ready for connections
  21. -- :: [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
  22. [root@node3 mysql]#

如果启动失败,日志里面也会有提示的,通常启动失败的原因有如下:
(1)配置文件错误

(2)防火墙没有开放相应的端口,比如默认的4567端口

(3)忘记进行授权账号

(4)xtrabackup没有安装或者安装有问题

下面我们进行相关的测试,比如在node节点创建表,插入数据,看另外两个节点是否有数据。

node1节点创建表t1,插入数据,在另外两个节点也可以看见:

  1. mysql> create database yayun;
  2. Query OK, row affected (0.02 sec)
  3.  
  4. mysql> use yayun
  5. Database changed
  6. mysql> create table t1 ( id int,name char()) engine=innodb;
  7. Query OK, rows affected (0.03 sec)
  8.  
  9. mysql> insert into t1 select ,'yayun';
  10. Query OK, row affected (0.00 sec)
  11. Records: Duplicates: Warnings:
  12.  
  13. mysql> select * from t1;
  14. +------+-------+
  15. | id | name |
  16. +------+-------+
  17. | | yayun |
  18. +------+-------+
  19. row in set (0.00 sec)
  20.  
  21. mysql>

node2节点:

  1. mysql> select * from yayun.t1;
  2. +------+-------+
  3. | id | name |
  4. +------+-------+
  5. | 1 | yayun |
  6. +------+-------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql>

node3节点:

  1. mysql> select * from yayun.t1;
  2. +------+-------+
  3. | id | name |
  4. +------+-------+
  5. | 1 | yayun |
  6. +------+-------+
  7. 1 row in set (0.00 sec)
  8.  
  9. 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

Percona XtraDB Cluster的更多相关文章

  1. 如何搭建Percona XtraDB Cluster集群

    一.环境准备 主机IP                     主机名               操作系统版本     PXC 192.168.244.146     node1           ...

  2. PXC(Percona XtraDB Cluster)集群的安装与配置

    Percona XtraDB Cluster是针对MySQL用户的高可用性和扩展性解决方案,基于Percona Server .其包括了Write Set REPlication补丁,使用Galera ...

  3. Percona XtraDB Cluster(转)

    Percona XtraDB Cluster是针对MySQL用户的高可用性和扩展性解决方案,基于Percona Server .其包括了Write Set REPlication补丁,使用Galera ...

  4. 使用percona xtradb cluster的IST方式添加新节点

    使用percona xtradb cluster的IST(Incremental State Transfer)特性添加新节点,防止新节点加入时使用SST(State SnapShop Transfe ...

  5. mysql高可用之PXC(Percona XtraDB Cluster)

    简介 Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案,Percona XtraDB Cluster提供的特性如下: 1).同步复制,事务要么在所有节点提交或不提交 ...

  6. docker1.12 安装pxc(Percona XtraDB Cluster )测试

    docker1.12 安装pxc(Percona XtraDB Cluster )测试

  7. 1.1 About Percona XtraDB Cluster

    摘要: 出处:kelvin19840813 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎 ...

  8. PXC5.7(Percona XtraDB Cluster)+HAproxy+Keepalived 集群部署

    Percona-XtraDB-Cluster+Haproxy 搭建集群环境 环境准备及服务器信息: 配置防火墙 firewall-cmd --add-port=3306/tcp --permanent ...

  9. MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解

    MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...

  10. Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication

    Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication Overview Galera Cluster 由 Coders ...

随机推荐

  1. STM32F10X-定时器/计数器

    1.STM32F10X的计数器与定时器关系 当时钟连接外脉冲时是计数器:当时钟采用系统内部时钟时是定时器! 2.STM32F10X定时器的时钟源 STM32F10X定时器的时钟不是直接来至于APB1和 ...

  2. _ZNote_编程语言_Qt_信号槽实现_拖拽方式使用控件

    所谓的信号槽,实际上就是观察者模式. 当某个事件发生后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal). 这种发出信号是没有目的的,类似于广播.如果对象对这个信号感兴趣,它就会使 ...

  3. 验证手机格式的js代码

    function isMobil(s)         {             var patrn = /(^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$)/;          ...

  4. [mobile]监听手机mobile上面软键盘的回车[enter]事件

    $(document).keypress(function(e) { if(e.which == 13) { if(!$(".qaSearchInput").val()) { Hn ...

  5. Android-Kotlin-代理和委托

    代理和委托,在生活中的案例有很多: 例如:小明工作很忙,需要办理银行卡,此时他委托给>>小李去给自己办理银行卡,小李来到办理中心 把自己的身份证/小李的身份证,给办理人员,说是小明委托我, ...

  6. Spring Boot 应用系列 6 -- Spring Boot 2 整合Quartz

    Quartz是实现定时任务的利器,Quartz主要有四个组成部分,分别是: 1. Job(任务):包含具体的任务逻辑: 2. JobDetail(任务详情):是对Job的一种详情描述: 3. Trig ...

  7. SQLSqlserver中如何将一列数据,不重复的拼接成一个字符串

    把一列数据拼接成一个字符串比较简单: declare @test varchar(500) set @test=''; select @test=@test+name+',' from person ...

  8. 实验4 IIC通讯与EEPROM接口

    1.       用C语言编程,利用定时器产生一个0~99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化写入实验板上AT24C02,当关闭实验板电源,并再次打开实验板电源时,单片机从AT24C0 ...

  9. 定时任务 Wpf.Quartz.Demo.1

    Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...

  10. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...