Percona XtraDB Cluster
简介
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。
- 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.-.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.-rel67.-25.6..Linux.x86_64.tar.gz -C /usr/local/
- [root@node1 ~]# cd /usr/local/
- [root@node1 local]# ln -s Percona-XtraDB-Cluster-5.6.-rel67.-25.6..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 /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= #开启的复制线程数,cpu核数*
- binlog_format=ROW #binlog格式必须为row
- default_storage_engine=InnoDB #暂时不支持其他存储引擎,只支持innodb,当然可以支持myisam,需要另外参数打开
- innodb_autoinc_lock_mode= #自增锁的优化
- 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.0.0:* LISTEN /mysqld
- tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
- [root@node1 ~]#
进行授权,推荐使用grant方式
- mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON * . * TO 'sst'@'localhost' IDENTIFIED BY 'yayun';
- Query OK, rows affected (0.03 sec)
- mysql> FLUSH PRIVILEGES;
- Query OK, 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=
- binlog_format=ROW
- default_storage_engine=InnoDB
- innodb_autoinc_lock_mode=
- 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=
- binlog_format=ROW
- default_storage_engine=InnoDB
- innodb_autoinc_lock_mode=
- 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 node2.err
- -- :: [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646
- -- :: [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.
- -- :: [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.
- -- :: [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.
- -- :: [Note] Server hostname (bind-address): '*'; port:
- -- :: [Note] IPv6 is available.
- -- :: [Note] - '::' resolves to '::';
- -- :: [Note] Server socket created on IP: '::'.
- -- :: [Note] Event Scheduler: Loaded events
- -- :: [Note] WSREP: Signalling provider to continue.
- -- :: [Note] WSREP: inited wsrep sidno
- -- :: [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:
- -- :: [Note] /usr/local/mysql/bin/mysqld: ready for connections.
- 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
- -- :: [Note] WSREP: 1.0 (node2): State transfer from 0.0 (node1) complete.
- -- :: [Note] WSREP: Shifting JOINER -> JOINED (TO: )
- -- :: [Note] WSREP: Member 1.0 (node2) synced with group.
- -- :: [Note] WSREP: Shifting JOINED -> SYNCED (TO: )
- -- :: [Note] WSREP: Synchronized with group, ready for connections
- -- :: [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 node3.err
- -- :: [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.19-67.0 started; log sequence number 1626646
- -- :: [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.
- -- :: [Note] RSA private key file not found: /data/mysql//private_key.pem. Some authentication plugins will not work.
- -- :: [Note] RSA public key file not found: /data/mysql//public_key.pem. Some authentication plugins will not work.
- -- :: [Note] Server hostname (bind-address): '*'; port:
- -- :: [Note] IPv6 is available.
- -- :: [Note] - '::' resolves to '::';
- -- :: [Note] Server socket created on IP: '::'.
- -- :: [Note] Event Scheduler: Loaded events
- -- :: [Note] WSREP: Signalling provider to continue.
- -- :: [Note] WSREP: inited wsrep sidno
- -- :: [Note] WSREP: SST received: 2dc360e7-135f-11e4-a4e9-126b1471680b:
- -- :: [Note] /usr/local/mysql/bin/mysqld: ready for connections.
- 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
- -- :: [Note] WSREP: 0.0 (node3): State transfer from 1.0 (node1) complete.
- -- :: [Note] WSREP: Shifting JOINER -> JOINED (TO: )
- -- :: [Note] WSREP: Member 0.0 (node3) synced with group.
- -- :: [Note] WSREP: Shifting JOINED -> SYNCED (TO: )
- -- :: [Note] WSREP: Synchronized with group, ready for connections
- -- :: [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, row affected (0.02 sec)
- mysql> use yayun
- Database changed
- mysql> create table t1 ( id int,name char()) engine=innodb;
- Query OK, rows affected (0.03 sec)
- mysql> insert into t1 select ,'yayun';
- Query OK, row affected (0.00 sec)
- Records: Duplicates: Warnings:
- mysql> select * from t1;
- +------+-------+
- | id | name |
- +------+-------+
- | | yayun |
- +------+-------+
- 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
Percona XtraDB Cluster的更多相关文章
- 如何搭建Percona XtraDB Cluster集群
一.环境准备 主机IP 主机名 操作系统版本 PXC 192.168.244.146 node1 ...
- PXC(Percona XtraDB Cluster)集群的安装与配置
Percona XtraDB Cluster是针对MySQL用户的高可用性和扩展性解决方案,基于Percona Server .其包括了Write Set REPlication补丁,使用Galera ...
- Percona XtraDB Cluster(转)
Percona XtraDB Cluster是针对MySQL用户的高可用性和扩展性解决方案,基于Percona Server .其包括了Write Set REPlication补丁,使用Galera ...
- 使用percona xtradb cluster的IST方式添加新节点
使用percona xtradb cluster的IST(Incremental State Transfer)特性添加新节点,防止新节点加入时使用SST(State SnapShop Transfe ...
- mysql高可用之PXC(Percona XtraDB Cluster)
简介 Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案,Percona XtraDB Cluster提供的特性如下: 1).同步复制,事务要么在所有节点提交或不提交 ...
- docker1.12 安装pxc(Percona XtraDB Cluster )测试
docker1.12 安装pxc(Percona XtraDB Cluster )测试
- 1.1 About Percona XtraDB Cluster
摘要: 出处:kelvin19840813 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎 ...
- PXC5.7(Percona XtraDB Cluster)+HAproxy+Keepalived 集群部署
Percona-XtraDB-Cluster+Haproxy 搭建集群环境 环境准备及服务器信息: 配置防火墙 firewall-cmd --add-port=3306/tcp --permanent ...
- MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解
MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...
- Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication
Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication Overview Galera Cluster 由 Coders ...
随机推荐
- STM32F10X-定时器/计数器
1.STM32F10X的计数器与定时器关系 当时钟连接外脉冲时是计数器:当时钟采用系统内部时钟时是定时器! 2.STM32F10X定时器的时钟源 STM32F10X定时器的时钟不是直接来至于APB1和 ...
- _ZNote_编程语言_Qt_信号槽实现_拖拽方式使用控件
所谓的信号槽,实际上就是观察者模式. 当某个事件发生后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal). 这种发出信号是没有目的的,类似于广播.如果对象对这个信号感兴趣,它就会使 ...
- 验证手机格式的js代码
function isMobil(s) { var patrn = /(^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$)/; ...
- [mobile]监听手机mobile上面软键盘的回车[enter]事件
$(document).keypress(function(e) { if(e.which == 13) { if(!$(".qaSearchInput").val()) { Hn ...
- Android-Kotlin-代理和委托
代理和委托,在生活中的案例有很多: 例如:小明工作很忙,需要办理银行卡,此时他委托给>>小李去给自己办理银行卡,小李来到办理中心 把自己的身份证/小李的身份证,给办理人员,说是小明委托我, ...
- Spring Boot 应用系列 6 -- Spring Boot 2 整合Quartz
Quartz是实现定时任务的利器,Quartz主要有四个组成部分,分别是: 1. Job(任务):包含具体的任务逻辑: 2. JobDetail(任务详情):是对Job的一种详情描述: 3. Trig ...
- SQLSqlserver中如何将一列数据,不重复的拼接成一个字符串
把一列数据拼接成一个字符串比较简单: declare @test varchar(500) set @test=''; select @test=@test+name+',' from person ...
- 实验4 IIC通讯与EEPROM接口
1. 用C语言编程,利用定时器产生一个0~99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化写入实验板上AT24C02,当关闭实验板电源,并再次打开实验板电源时,单片机从AT24C0 ...
- 定时任务 Wpf.Quartz.Demo.1
Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...
- Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...