高可用PXC

1.Percona XtraDB Cluster的搭建

安装环境:

节点1:A: 192.168.91.18

节点2:B:192.168.91.20

节点3:C:192.168.91.21

innodb引擎层实现的复制

ABC server_id要不一样

ABC:

下载软件:

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

安装依赖包:

yum install -y socat

yum install -y perl-DBD-MySQL.x86_64 perl-IO-Socket-SSL.noarch socat.x86_64 nc

(其中nc是一个强大的网络工具)

yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

#安装xtrabackup备份软件:

yum list |grep percona-xtrabackup

yum install -y percona-xtrabackup.x86_64

#rpm -qa |grep percona

percona-release-0.1-3.noarch

percona-xtrabackup-2.3.7-2.el6.x86_64

ABC:

解压PXC包:

tar xf Percona-XtraDB-Cluster-5.6.21-rel70.1-25.8.938.Linux.x86_64.tar.gz

软链接:

ln -s /home/tools/Percona-XtraDB-Cluster-5.6.21-rel70.1-25.8.938.Linux.x86_64 /usr/local/mysql

创建 mysql 的用户及组

groupadd mysql

useradd –g msyql –s /sbin/nologin –d /usr/local/mysql mysql

创建启动文件:

cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld

创建 mysql 需要的基本目录

mkdir -p /data/mysql3306/{data,logs,tmp}

chown -R mysql:mysql *

A 配置文件:

vim /etc/my.cnf

#pxc

default_storage_engine=Innodb

#innodb_locks_unsafe_for_binlog=1

innodb_autoinc_lock_mode=2

wsrep_cluster_name=pxc_cluster      #集群名称

wsrep_cluster_address=gcomm://192.168.91.18,192.168.91.20,192.168.91.21

wsrep_node_address=192.168.91.18

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so

#wsrep_provider_options="gcache.size = 1G;debug = yes"

wsrep_provider_options="gcache.size = 1G;"

#wsrep_sst_method=rsync

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth=sst:147258

B配置文件:

#pxc

default_storage_engine=Innodb

#innodb_locks_unsafe_for_binlog=1

innodb_autoinc_lock_mode=2

wsrep_cluster_name=pxc_cluster

wsrep_cluster_address=gcomm://192.168.91.18,192.168.91.20,192.168.91.21

wsrep_node_address=192.168.91.20

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so

#wsrep_provider_options="gcache.size = 1G;debug = yes"

wsrep_provider_options="gcache.size = 1G;"

#wsrep_sst_method=rsync

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth=sst:147258

C配置文件:

#pxc

default_storage_engine=Innodb

#innodb_locks_unsafe_for_binlog=1

innodb_autoinc_lock_mode=2

wsrep_cluster_name=pxc_cluster

wsrep_cluster_address=gcomm://192.168.91.18,192.168.91.20,192.168.91.21

wsrep_node_address=192.168.91.21

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so

#wsrep_provider_options="gcache.size = 1G;debug = yes"

wsrep_provider_options="gcache.size = 1G;"

#wsrep_sst_method=rsync

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth=sst:147258

ABC:

初始化:

[[email protected] mysql]# ./scripts/mysql_install_db

A:

第一个节点启动:

/etc/init.d/mysql bootstrap-pxc

Bootstrapping PXC (Percona XtraDB Cluster)Starting MySQL (Percona XtraDB Cluster)......... SUCCESS!

>mysql

delete from mysql.user where user!=‘root‘ or host!=‘localhost‘;

truncate mysql.db;

drop database test;

grant all on *.* to [email protected] identified by ‘147258‘;     #创建用于xtrabackup的用户sst,密码要和my.cnf中对应

flush privileges;

BC:

启动节点二和节点三:

/etc/init.d/iptables stop

sed -i ‘s#SELINUX=enforcing#SELINUX=disabled#g‘ /etc/selinux/config

[[email protected] data]# /etc/init.d/mysqld start

Starting MySQL (Percona XtraDB Cluster).........State transfer in progress, setting sleep higher

... SUCCESS!

[[email protected] data]# /etc/init.d/mysqld start

ERROR! MySQL (Percona XtraDB Cluster) is not running, but lock file (/var/lock/subsys/mysql) exists

Starting MySQL (Percona XtraDB Cluster)..................State transfer in progress, setting sleep higher

... SUCCESS!

测试:

A:

[email protected] [testdb]> create database testdb;

[email protected] [testdb]>create table t1(c1 int auto_increment not null,c2 timestamp,primary key(c1));

[email protected] [testdb]>insert into t1 select 1,now();

[email protected] [testdb]>select * from testdb.t1;

+----+---------------------+

| c1 | c2                  |

+----+---------------------+

|  1 | 2017-03-06 12:29:56 |

+----+---------------------+

B:

[email protected] [testdb]>select * from testdb.t1;

+----+---------------------+

| c1 | c2                  |

+----+---------------------+

|  1 | 2017-03-06 12:29:56 |

+----+---------------------+

C:

[email protected] [testdb]>select * from testdb.t1;

+----+---------------------+

| c1 | c2                  |

+----+---------------------+

|  1 | 2017-03-06 12:29:56 |

+----+---------------------+

关闭方式:

关闭:/etc/init.d/mysql stop

全部节点关闭后重启:

第一个节点启动的节点:/etc/init.d/mysql bootstrap-pxc

其它节点/etc/init.d/mysql start

SST和IST

State Snapshot Transfer(SST) 全量传输

发生在:新节点的加入,或者集群中节点故障(关闭)时间过长

wsrep_sst_method = xtrabackup-v2

这个参数有三个值:

(1)xtrabackup-v2

使用xtrabackup传输,需要提前创建用于备份的用户并制定参数用户名和密码:wsrep_sst_auth=sst:147258

(2)rsync:最快的传输方式,不需要指定wsrep_sst_auth参数,拷贝数据的时候read-only(flush table with read lock)

(3)mysqldump:不建议使用,数据量大的时候不行,拷贝数据的时候read-only(flush table with read lock)

Incremental state Transfer(IST) 增量传输

发生在:一个节点数据的改变,把增量的部分拷贝到另几个节点,通过一个缓存gcache控制,如果增量大于gcache会选择全量传输,再有在增量小于等于gcache时候,才会选择增量传输。

wsrep_provider_options="gcache.size = 1G"

如果去停止PXC其中的一个节点?

当 wsrep_local_state_comment 的状态是 Synced 表示三个节点之间数据同步,这样才能去停止其中一个的服务,滚动重启;

每个节点能够离线多长时间计算?

比如说想离线2h,算一下2个小时能够生成多大的binlog,对应的gcache.size就设置多大。

如一个比较繁忙的订单系统,5分钟产生200M的binog,则一个小时产生2.4G,两个小时4.8G,那么wsrep_provider_options="gcache.size = 6G",gcache是需要实际内存分配的,也不能设置太大,否则会出现oom-kill;

故障恢复后,加入集群的过程分析:

(1)如果数据量不是很大,重新初始化,搞一次SST;

(2)如果数据量很大,用rsync传输;

PXC的特点及注意事项:

(1)PCX每个节点都自动配置了自增初始值和步长,跟双主一样,这样是为了防止主键冲突;

node1:

auto_increment_offset=1

auto_incremnet_increment=3

node2:

auto_increment_offset=2

auto_incremnet_increment=3

node3:

auto_increment_offset=3

auto_incremnet_increment=3

(2)PCX集群是乐观控制,事物冲突情况可能发生在commit阶段,当多个节点修改同一行数据,只有其中一个节点能够成功,失败的节点将终止,并且返回死锁错误代码:

如:

A:

[email protected] [testdb]>begin;

[email protected] [testdb]>update t1 set c2=now() where c1=3;

B:

[email protected] [testdb]>begin;

[email protected] [testdb]>update t1 set c2=now() where c1=3;

[email protected] [testdb]>commit;

A:

出现报错deadlock:

[email protected] [testdb]>commit;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

(3)PXC只支持innodb引擎,mysql库下的表基本上都是myisam表怎么传输呢,PXC虽然不支持myisam表,但是支持DCL语句,如create user,drop user,grant,revoke等,可以通过开启参数wsrep_replicate_myisam,使pxc支持myisam表,因此当PXC出现数据不一致的时候,首先要查看是否是myisam表;

如:

node1:

[email protected] [testdb]>show create table t2\G

*************************** 1. row ***************************

Table: t2

Create Table: CREATE TABLE `t2` (

`c1` int(11) NOT NULL AUTO_INCREMENT,

`c2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (`c1`)

) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

[email protected] [testdb]>select * from t2;

+----+---------------------+

| c1 | c2                  |

+----+---------------------+

|  2 | 2017-03-08 11:41:31 |

+----+---------------------+

在node2和node3节点上面都看不到,因为没有传送过来。

(4)PXC每个表必须要有主键,如果没有主键,可能造成集群中每个节点的data page里的数据不一样,select limit 可能在不同的节点产生不同的结果集;

(5)不支持表级锁 (lock table),所有的DDL操作都是实例级别的锁,需要用pt-osc工具

如:

例1:

node1:

[email protected] [testdb]>lock table t1 read;

[email protected] [testdb]>insert into t1 select 69,now();

ERROR 1099 (HY000): Table ‘t1‘ was locked with a READ lock and can‘t be updated

node2:节点2仍然可以插入,说明read lock没有生效

[email protected] [testdb]>insert into t1 select 69,now();

Query OK, 1 row affected (0.01 sec)

Records: 1  Duplicates: 0  Warnings: 0

例2:

node1:

[email protected] [testdb]>lock table t1 write;

[email protected] [testdb]>insert into t1 select 1,now();

Query OK, 1 row affected (0.03 sec)

Records: 1  Duplicates: 0  Warnings: 0

[email protected] [testdb]>select * from t1;

+----+---------------------+

| c1 | c2                  |

+----+---------------------+

|  1 | 2017-03-08 14:59:46 |

+----+---------------------+

node2: 节点二没有受写锁影响,可以读写:

[email protected] [testdb]>insert into t1 select 2,now();

Query OK, 1 row affected (0.05 sec)

Records: 1  Duplicates: 0  Warnings: 0

[email protected] [testdb]>select * from t1;

+----+---------------------+

| c1 | c2                  |

+----+---------------------+

|  1 | 2017-03-08 14:59:46 |

|  2 | 2017-03-08 14:59:57 |

+----+---------------------+

(6)不支持XA 事物

(7)query log日志存放在文件中,不能放在表里,即需要指定参数log_output=file;

(8)整个集群的性能/吞吐量由性能最差的节点决定,木桶效应;

不考虑延迟的主从复制:每秒6万insert,

考虑到延迟的主从复制:每秒3万insert,

pxc:每秒1万insert


(9)节点数量是3<=num<=8

(10)脑裂,所以至少需要三个节点,有个仲裁节点,防止脑裂;

演示脑裂:

强制干掉mysql进程:

node2:

[[email protected] mysql3306]# kill -9 10014

node3:

[[email protected] ~]# kill -9 10115

node1:

[email protected] [(none)]>use testdb;

ERROR 1047 (08S01): Unknown command

脑裂前的值:

show global status like ‘%wsrep%‘;

wsrep_local_state_comment    | Synced

wsrep_cluster_status         | Primary

wsrep_ready                  | ON

脑裂后的值:

wsrep_local_state_comment    | Initialized

wsrep_cluster_status         | non-Primary

wsrep_ready                  | OFF

重启node2或者node3会报错:

[[email protected] data]# /etc/init.d/mysqld start

ERROR! MySQL (Percona XtraDB Cluster) is not running, but PID file exists

解决方法:重启node1,然后再重启node2和node3

时间: 2024-10-08 01:51:44

高可用PXC的相关文章

MySQL高可用——PXC简介

PXC简介: galera产品是以galera cluster方式为mysql提高高可用集群解决方案的.galera cluster就是集成了galera插件的mysql集群.galera replication是codership提供的mysql数据同步方案,具有高可用性,方便扩展,并且可以实现多个mysql节点间的数据同步复制与读写,可保障数据库的服务高可用及数据强一致性. PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+kee

15、高可用 PXC(percona xtradb cluster) 搭建

安装环境: 集群名 pxc_lk 节点1: 192.168.1.20 节点2: 192.168.1.21 节点3: 192.168.1.22 所有节点安装 wget http://www.percona.com/redir/downloads/XtraBackup/LATEST/binary/redhat/6/x86_64/percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm wget http://www.percona.com/redir/download

基于PXC的MySQL高可用环境简单部署

PXC简介 Percona XtraDB Cluster(简称PXC集群)提供了MySQL高可用的一种实现方法. 1.集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上. 2.每个节点都是普通的mysql/percona服务器,可以将现有的数据库服务器组成集群,反之,也可以将集群拆分成单独的服务器. 3.每个节点都包含完整的数据副本. PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(使

HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境

HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入?引入了frontend,backend:frontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend. Keepalived介绍Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障.一个WEB服务至少会有2台服务

企业主流MySQL高可用集群架构三部曲之PXC

前段时间,老张给大家介绍了企业中主流MySQL高可用集群架构三部曲中的前两部,有不了解的同学可以去访问我之前的博客内容. 第一部曲直通车>> 企业中MySQL主流高可用架构实战三部曲之MHA 第二部曲直通车>>企业中MySQL高可用集群架构三部曲之MM+keepalived 独家新课程上线>>MySQL体系结构深入剖析及实战DBA视频课程 今儿给大家介绍最后一部曲,是percona公司的percona xtraDB cluster.简称PXC.它是基于GaLera协议的

Percona XtraDB Cluster(PXC)-高可用架构设计说明(原创)

Mycat+PXC高可用集群 一.架构图 架构说明: 1.mysql 集群高可用部分: l 针对业务场景选用Percona XtraDB Cluter(PXC)复制集群.两个片集群 PXC-dataNode01.PXC-dataNode01 由Mycat 管理,实现分库分表.读写分离 l PXC 复制模式保证强一致性.不会存在数据复制延迟:当client 发起事务请求只有在集群节点都同步响应完成时才会返回成功给客户端,否则回滚.客户端报错 l 节点集群扩展方案: 增加新节点集群需要对现有的需要分

企业中MySQL高可用集群架构三部曲之MM+keepalived

各位老铁们,老张与大家又见面了.看到各位在博客里面给我的留言和访问量的情况,我很是欣慰,也谢谢大家对我的认可.我写这些博客,就是想把自己对于MySQL数据库的一些看法和自己平时的实战经验分享出来,我们可以一起探讨,共同进步.也保证今后只要一有空就更新博文,推出更多的干货. 我的学生经常对我说:"张老师,每次我遇到报错,有时还是会百度,但是最烦的是不知道百度哪篇帖子说的是正确的".其实这些呢,都是因为自己还没有对MySQL数据库核心知识的不熟悉,和对技术掌握的不牢固.平时下得功夫还是不到

mysql复制(高可用架构方案的基础)

mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以在全部改变中根据业务需求选择部分库和部分表的复制复制的场景: 1.数据库容灾 2.需求:创建一个从数据服务器,做数据的测试和分析 3.负载均衡 4.复制时高可用架构方案的基础 mysql高可用架构特点1.数据库故障的检测与排除2.主从数据库的切换3.数据的备份和保护 mysql高可用架构常用方案1.

基于keepalived搭建MySQL的高可用集群

http://www.cnblogs.com/ivictor/p/5522383.html 基于keepalived搭建MySQL的高可用集群 MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,MHA和PXC. 对于小公司,一般推荐使用keepalived+双主,简单. 下面来部署一下 配置环境: 角色