基于centos系统部署haproxy+MySQL PXC集群

一、PXC 介绍

1、基于Galere协议的高可用方案:pxc

Galera是Codership提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性。
基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC),目前PXC用的会比较多一些。
mariadb的集群原理跟PXC一样,maridb-cluster其实就是PXC,两者原理是一样的。

2、PXC 简介

pxc是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;

Percona XtraDB Cluster,与MGR的多主模式很相似,但是采用的协议与实现细节不同,PXC为Percona MySQL分支集群。

相比社区版本MySQL,集群性能更佳稳定,更为成熟,如果不想投入较多维护成本,可以采用该分支版本集群,缺点就是无法与官方发布统一,一些官方新特性无法使用。

PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(使用了Galera library,一个通用的用于事务型应用的同步、多主复制插件)。

注意一半以上的节点宕机时pxc集群就无法使用了。在这里插入图片描述

3、PXC特性

PXC集群中,存储引擎使用的是percona xtrabackup,集群架构采用的是Galera Cluster,一种多主结构的集群。所以要安装percona存储引擎与 Galera依赖。
一般来说,中小型规模的时候,采用这种架构是最省事的。两个节点可以采用简单的一主一从模式,或者双主模式,并且放置于同一个VLAN中,在master节点发生故障后,利用keepalived/heartbeat的高可用机制实现快速切换到slave节点。

pxc具备以下特性:

  • 完全兼容 MySQL。
  • 同步复制,事务要么在所有节点提交或不提交。
  • 多主复制,可以在任意节点进行写操作。
  • 在从服务器上并行应用事件,真正意义上的并行复制。
  • 节点自动配置,数据一致性,不再是异步复制。
  • 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
  • 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;

PXC最大的优势:强一致性、无同步延迟

4、PXC的优缺点

4.1、PXC的优点

1)服务高可用;
2)数据同步复制(并发复制),几乎无延迟;
3)多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让galera解决数据冲突;
4)新节点可以自动部署,部署操作简单;
5)数据严格一致性,尤其适合电商类应用;
6)完全兼容MySQL;

4.2、pxc缺点

虽然PXC有这么多好处,但也有些局限性:
1)只支持InnoDB引擎;当前版本(5.6.20)的复制只支持InnoDB引擎,其他存储引擎的更改不复制。然而,DDL(Data Definition Language) 语句在statement级别被复制,并且,对mysql.*表的更改会基于此被复制。例如CREATE USER…语句会被复制,但是 INSERT INTO mysql.user…语句则不会。
(也可以通过wsrep_replicate_myisam参数开启myisam引擎的复制,但这是一个实验性的参数)。
2)PXC集群一致性控制机制,事有可能被终止,原因如下:集群允许在两个节点上同时执行操作同一行的两个事务,但是只有一个能执行成功,另一个会被终止,集群会给被终止的
客户端返回死锁错误(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
3)写入效率取决于节点中最弱的一台,因为PXC集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。
4)所有表都要有主键;
5)不支持LOCK TABLE等显式锁操作;
6)锁冲突、死锁问题相对更多;
7)不支持XA;
8)集群吞吐量/性能取决于短板;
9)新加入节点采用SST时代价高;
10)存在写扩大问题;
11)如果并发事务量很大的话,建议采用InfiniBand网络,降低网络延迟;

事实上,采用PXC的主要目的是解决数据的一致性问题,高可用是顺带实现的。因为PXC存在写扩大以及短板效应,并发效率会有较大损失,类似semi sync replication机制。

5、 PXC与Replication的区别

如下:
在这里插入图片描述
即:
在这里插入图片描述
在这里插入图片描述

6、PXC 常用端口

3306:数据库对外服务的端口号。
4444:请求SST的端口。
4567:组成员之间进行沟通的一个端口号
4568:用于传输IST。
名词解释:

WS:write set写数据集,写/更新事务
IST:Incremental State Transfer 增量同步
SST:State Snapshot Transfe 全量同步。
SST支持的方法有:mysqldump,rsync ,xtrabackup 。
mysqldump,rsync同步需要READ LOCK, (SST applies FLUSH TABLES WITH READ LOCK command)
xtrabackup 在整个同步数据过程中不需要READ LOCK。
配置参数:wsrep_sst_method=xtrabackup-v2
UUID:节点状态改变及顺序的唯一标识
GTID:Global Transaction ID,由UUID和sequence number偏移量组成。wsrep api中定义的集群内部全局事务id,用于记录集群中发生状态改变的唯一标识以及队列中的偏移量。
WSRWP API:在DBMS库和wsrep provider之间提供接口

二、搭建PXC集群

环境说明:这里以一个综测环境来演示:
在这里插入图片描述

1、环境准备

1.1 、修改本地hosts

cat >> /etc/hosts <<EOF
1.142   pxc_node1
.1.143   pxc_node2
1.144   pxc_node3
EOF

1.2、禁用防火墙和selinux

systemctl stop firewalld && systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

1.3、配置阿里源

for i in /etc/yum.repos.d/*.repo;do cp $i ${i%.repo}_bak;done
rm -rf /etc/yum.repos.d/*.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf     
yum clean all  &&   yum makecache

2、三台服务器安装PXC(保证服务器没有装MySQL)

下载地址:https://www.percona.com/downloads/percona-release/
如果有外网环境直接yum就可以了,如果无外网环境,那么就需要到官网:
https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/
去把依赖包一个一个下载下来,再手动安装。

--依赖安装
yum -y groupinstall Base Compatibility libraries Debugging Tools Dial-up Networking suppport Hardware monitoring utilities Performance Tools Development tools
    
--组件安装
yum -y install https://downloads.percona.com/downloads/percona-release/percona-release-1.0-25/redhat/percona-release-1.0-25.noarch.rpm
yum -y update percona-release

--pxc安装
yum -y install Percona-XtraDB-Cluster-57

在这里插入图片描述

3、集群配置

3.1、在所有节点修改root密码并配置SST认证账号

systemctl start mysqld
grep 'password' /var/log/mysqld.log
mysql -uroot -p
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'xx234';
> GRANT ALL PRIVILEGES ON *.* TO root@'%' identified by 'x234';
> CREATE USER 'sst'@'localhost' IDENTIFIED BY 'xx4';
> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sst'@'localhost';
> FLUSH PRIVILEGES;
systemctl stop mysqld

3.2、修改所有节点的配置文件

# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
# 三个节点需分别修改server-id、wsrep_node_name、wsrep_node_address、wsrep_sst_auth
================================================================================================
[mysqld]
#PXC集群中MySQL实例的唯一ID,不能重复,必须是数字
server-id=1 
#当前节点的名称
wsrep_node_name=pxc_node1
#当前节点的IP
wsrep_node_address=xx.1.142
#PXC集群的名称
wsrep_cluster_name=pxc_cluster
#同步使用的帐户
wsrep_sst_auth= sst:xx1234
#启动时要连接的群集节点的地址
wsrep_cluster_address=gcomm://xx1.142,xx.143,xx6.1.144
# Path to Galera library
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
#同步方法(mysqldump、rsync、xtrabackup)
wsrep_sst_method=xtrabackup-v2
 #同步严厉模式
pxc_strict_mode=ENFORCING
#基于ROW复制(安全可靠)
binlog_format=ROW 
#默认引擎
default_storage_engine=InnoDB
#主键自增长不锁表
innodb_autoinc_lock_mode=2
# 用于并行应用Galera写集的从属线程数
wsrep_slave_threads= 8
#如果设置为ON(默认为OFF),则会记录群集中发生冲突的MDL以及InnoDB锁的详细信息
wsrep_log_conflicts = ON
================================================================================================

4、启动pxc并测试

4.1、启动第一个节点

停止mysql服务,选择一个node作为名义上的master,启动第一个节点以前,其节点的配置文件里面,不能配置其它节点的ip,即 wsrep_cluster_address=gcomm:// 这样就行了,否则会导致启动报错。待集群启动后,再修改它的配置文件,把其他节点的ip补充上去。
集群关闭之后,再启动,谁做第一个节点谁就执行/etc/init.d/mysqld bootstrap-pxc。
如果最后关闭的PXC节点是安全退出的,那么下次启动要最先启动这个节点,而且要以主节点启动 如果最后关闭的PXC节点不是安全退出的,那么要先修改/var/lib/mysql/grastate.dat 文件, 把其中的safe_to_bootstrap属性值设置为1, 再安装主节点启动。

除了名义上的master之外,其它的node节点只需要启动mysql即可。

systemctl start mysql@bootstrap.service

在这里插入图片描述

4.2、启动其他节点

systemctl start mysql

4.3、pxc集群测试

不能放excel表,只能用图代替了,测试过程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、PXC集群管理

5.1、日常维护

--查看节点数:
show global status like 'wsrep_cluster_size';  
--查看集群状态:
show global status like 'wsrep_local_state_comment';
--查看当前节点状态:
show global status like 'wsrep_cluster_status';
--通过查看4567 端口确认集群是否启动: 
netstat -plantu | grep mysqld 
--集群关闭:所有节点都用
/etc/init.d/mysql  stop
--节点重启
1)第一个节点用:
systemctl start mysql@bootstrap.service
2)其他节点用:
systemctl start mysql

在这里插入图片描述

5.2、wsrep相关参数检查

集群完整性检查:在这里插入图片描述
节点状态检查:在这里插入图片描述
复制健康检查:在这里插入图片描述
检测慢网络问题:在这里插入图片描述
冲突或死锁的数目:
在这里插入图片描述

三、搭建Haproxy+PXC集群

基于上面的pxc集群,这里主要介绍Haproxy和pxc集群的搭配使用。
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

配置文件参考:http://www.ttlsa.com/linux/haproxy-study-tutorial/
HaProxy的负载均衡算法现在具体有如下8种:

  1. roundrobin:简单的轮询
  2. static-rr:权重轮询
  3. leastconn:最少连接者优先
  4. source:根据请求源IP,这个跟Nginx的ip_hash机制类似
  5. ri:根据请求的URI
  6. rl_param:表示根据请求的URI参数‘balance url_param’requires an URL parameter name;
  7. hdr(name):根据HTTP请求头来锁定每一次HTTP请求
    8)rdp-cookie(name):根据cookie来锁定并哈希每一次TCP请求

涉及端口:
53306 :TCP/IP转发
4001 :监控界面控制

1、部署Haproxy

yum install -y haproxy

2、配置haproxy

Haproxy的配置文件在/etc/haproxy目录下的haproxy.cfg文件,主要说明一下后台监控界面配置和负载均衡相关配置

#vim /etc/haproxy/haproxy.cfg
==============================================================================================================================
global
#设置日志
    log 127.0.0.1   local0
    chroot /etc/haproxy
#用户与用户组
    user haproxy
    group haproxy
#定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
    maxconn 4096
# 以守护进程的方式运行
    daemon
defaults
log global
#日志中不记录空连接
option dontlognull
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
retries 3
option redispatch
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒
timeout connect 5000
# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒
timeout client 50000
# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒
timeout server 50000
#统计页面
listen  admin_stats
      bind 0.0.0.0:4001  #监控界面访问的ip和端口
      mode http
      stats realm  Global\ statistics   #统计报告格式
      stats auth    admin:admin      #登录账号信息
#采用http日志格式  
      option httplog
#统计页面自动刷新时间  
      stats refresh 30s
#统计页面url
      stats uri /admin_stats
#隐藏统计页面上HAProxy的版本信息
      stats hide-version
listen proxy-mysql
# 绑定haproxy_ip:53306端口访问mysql_pxc集群3306端口
      bind 0.0.0.0:53306
# 定义为tcp模式
      mode tcp
#采用http日志格式
      option tcplog
# 开启对后端服务器的健康检测
      option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
# 设置haproxy的调度算法
      balance roundrobin
#根据调度分配到真实的后台地址,参数解释:port 3306:检测端口3306, inter 5s:5秒检测一次,rise 2:检测成功2次表示服务器可用,fall 3:检测失败3次后表示服务器不可用
      server pxc_node1 xx.142:3306  check port 9200 inter 5s rise 2 fall 3
      server pxc_node2 xx.143:3306  check port 9200 inter 5s rise 2 fall 3
      server pxc_node3 xx.144:3306  check port 9200 inter 5s rise 2 fall 3
#设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒
      timeout server 20000
==============================================================================================================================

3、配置监听mysql pxc是否存活(需在pxc集群中每个节点执行)

3.1、脚本拷贝

确保每个节点都有如下脚本

--如果是yum安装则不需要(clustercheck和脚本都是默认值没有修改)
cp /usr/local/mysql/bin/clustercheck /usr/bin/
cp /usr/local/mysql/xinetd.d/mysqlchk /etc/xinetd.d/

3.2、创建mysql用户,用于mysql健康检查(在任一节点即可):

主要是因为已经建了PXC集群

GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
flush privileges;

3.3、三个节点更改/etc/services添加mysqlchk的服务端口号

echo 'mysqlchk 9200/tcp # mysqlchk' >> /etc/services

3.4、安装xinetd服务,通过守护进程来管理mysql健康状态检查脚本

yum install xinetd -y
systemctl restart xinetd.service
systemctl enable xinetd.service
systemctl status xinetd.service

在这里插入图片描述

3.5、在3个节点测试检测脚本

clustercheck

在这里插入图片描述

4、启动和停止haproxy

systemctl start haproxy #启动
systemctl stop haproxy  #关闭
systemctl restart haproxy  #重启

在这里插入图片描述

5、查看Haproxy管理界面

用浏览器打开 haproxy_ip:4001/admin_stats ,输入上边配置文件中配置的用户名密码(admin/admin)
在这里插入图片描述
后面就直接连VIP进行测试即可。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡定波007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值