本文的前提是Mycat已经安装并配置完毕,Mycat已实现对MySQL的读写分离、主从切换,其对应服务器IP分布为172.19.166.238和172.19.166.239。在此基础上,本文继续讲解Keepalived+Haproxy+Mycat的高可用方案,利用Haproxy实现Mycat集群负载均衡,Keepalived保证Haproxy高可用。
Haproxy作为专门的负载均衡软件,可以工作在四层和七层,相比Nginx而言,HAProxy负载均衡策略更多,负载均衡速度更出色。
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量。四层负载均衡主要是通过分析IP层及TCP/UDP层的流量实现的基于IP+端口的负载均衡。七层负载均衡位于OSI的最高层,主要考虑应用层的特征,可根据七层的URL、浏览器类别等来决定怎么进行负载均衡。
1、Haproxy安装配置
1.1、解压安装haproxy
解压haproxy-1.8.12.tar.gz
# cd /mnt/benz4s# tar -zxvf haproxy-1.8.12.tar.gz
编译安装,安装目录安装在/usr/local/haproxy下
# cd haproxy-1.8.12# make TARGET=linux26 PREFIX=/usr/local/haproxy ARCH=x86_64 # make install PREFIX=/usr/local/haproxy
参数说明
TARGET=linux26 #内核版本,使用uname -r查看内核,linux2.6以上的版本,TARGET=linux26;
ARCH=x86_64 #系统位数;
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径;
1.2、配置haproxy
创建配置文件(更详细配置文件参数附录部分)
# vim /usr/local/haproxy/haproxy.cfg......listen allmycat_servicebind 0.0.0.0:8096 #设置监听端口,即haproxy提供的web服务端口,和lvs的vip类似log global #应用全局的日志设置mode tcpoption tcplogoption httpchk OPTIONS * HTTP/1.1Host: www #通过http检测的方式进行服务的检测balance roundrobinserver mycat_238 172.19.166.238:8066 check port 47700 inter 5s rise 2 fall 3server mycat_239 172.19.166.239:8066 check port 47700 inter 5s rise 2 fall 3timeout server 20000 listen allmycat_adminbind 0.0.0.0:8097 #转发到mycat的9066端口,即mycat的管理控制台端口mode tcpoption tcplogoption httpchk OPTIONS * HTTP/1.1Host: www #通过http检测的方式进行服务的检测balance roundrobinserver mycat_238 172.19.166.238:9066 check port 47700 inter 5s rise 2 fall 3server mycat_239 172.19.166.239:9066 check port 47700 inter 5s rise 2 fall 3timeout server 20000......
1.3、配置haproxy日志输出
Haproxy采用rsyslog的方式进行日志配置,通过rpm -qa|grep rsyslog 命令判断有没有安装,如果没有安装通过yum自行安装即可。
找到rsyslog的配置文件
# find / -name 'rsyslog.conf'/usr/lib/dracut/modules.d/98syslog/rsyslog.conf/etc/rsyslog.conf# vim /etc/rsyslog.conf 将下面两行注释放开#$ModLoad imudp #$UDPServerRun 514找到Save boot messages also to boot.log并在这一行下面加入local2.* /var/log/haproxy.log重启rsyslog# service rsyslog restart
1.4、启动关闭haproxy
启动haproxy
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
关闭haproxy
# pkill haproxy 或 killall haproxy
2、xinetd安装配置
通过xinetd提供的http服务mycatstatus来让Haproxy进行Mycat服务检测,即检测Mycat存活状态。Haproxy通过调用该http服务获取Mycat运行状态。
2.1、安装xinetd
在Mycat服务器上安装xinetd,安装命令yum install xinetd*
2.2、服务配置
从xinetd的配置文件/etc/xinetd.conf 找到 includedir /etc/xinetd.d,进入该目录cd /etc/xinetd.d创建服务脚本。
# cd /etc/xinetd.d# vim mycatstatusservice mycatstatus{flags = REUSEsocket_type = stream # socket连接方式port = 47700 # 服务监听的端口wait = no # 是否并发user = root # 以什么用户进行启动server =/usr/local/bin/mycatstatus # 被托管服务的启动脚本log_on_failure += USERID # 设置失败时,UID添加到系统登记表log_type = FILE /var/log/telnet.log #自定义日志文件路径 disable = no #是否禁用托管服务,no表示开启托管服务}
xinetd服务mycat_status的监听端口为47700,执行脚本为/usr/local/bin/mycatstatus,当xinetd启动时,默认对外提供了一个mycatstatus服务。
2.3、创建托管服务启动脚本
# cd /usr/local/bin# vim /usr/local/bin/mycatstatus#!/bin/bashmycat=`/mnt/benz4s/mycat/bin/mycat status |grep 'not running'| wc -l`if [ "$mycat" = "0" ];then/bin/echo -e "HTTP/1.1 200 OK"else/bin/echo -e "HTTP/1.1 503 Service Unavailable"fi# chmod +x /usr/local/bin/mycatstatus #赋予执行权限# sh /usr/local/bin/mycatstatus #验证脚本的正确性
该脚本检测Mycat服务是否存活,当Mycat正在运行时,向前端返回HTTP/1.1 200 OK,表明Mycat运行正常,否则返回HTTP/1.1 503 Service Unavailable,Mycat服务异常。
2.4、添加mycatstatus服务
# vim /etc/servicesmycatstatus 47700/tcp # mycatstatus# service xinetd restart #重启xinetd服务
3、Keepalived+Haproxy的高可用方案
如何保证Haproxy提供稳定服务,不出现单点故障情况,这里采用Keepalived+Haproxy的高可用方案。Keepalived基于VRRP协议实现,VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,VRRP通过将一组路由器组成一个虚拟路由器(生成一个虚拟IP即VIP),这组路由器称之为备份组,一般会从备份组中选举一个节点作为master路由器,其余为backup路由器。VRRP的工作过程如下:
(1)备份组在启用时会选举优先级高的路由节点作为主路由,优先级低的作为备用路由;
(2)主路由会发送VRRP通告报文给备用节点,报告自己是活着的,备份路由器会开启定时器接收通告报文。VRRP发送通告报文一般是通过组播模式进行;
(3)关于主备节点的切换有两种模式:抢占模式下,主备通过比对权重确定路由组内的主备角色;非抢占模式,指定你是什么就是什么,即便备用节点的权重比主节点高。
3.1、Keepalived安装配置
# yum install keepalived# find / -name 'keepalived.conf'/etc/keepalived/keepalived.conf# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedvrrp_instance VI_1 {state MASTER #172.19.166.239上改为 BACKUPinterface ens0 #对外提供服务的网络接口,ifconfigvirtual_router_id 100 #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组priority 150 #数值愈大,优先级越高,172.19.166.239上改为比150小的正整数advert_int 1 #同步通知间隔authentication { #包含验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用的类型为 PASS,据说AH 使用时有问题auth_type PASSauth_pass 1111}virtual_ipaddress { #vip 地址 ens0 通过ifconfig获取172.19.166.100 dev ens0 scope global}}启动keepalived# service keepalived start
3.2、crontab定时任务
通过上面的配置,我们可以将前端请求172.19.166.100转到优先级高的物理机172.19.166.238。但此时还没有监听haproxy的服务实现VIP虚拟IP漂移,即监听haproxy服务来进行vip的降级。本文将采用一种定时任务(linux自带的crontab)的方式来实现VIP降级操作。
(1)创建checkhaproxy.sh 并编辑内容
# vim /usr/local/bin/checkhaproxy.sh#!/bin/bashLOGFILE='/root/log/checkHaproxy.log'date >> $LOGFILEcount=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`if [ $count = 0 ];thenecho 'first check fail , restart haproxy !' >> $LOGFILE/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfgelseexit 0fi sleep 3 count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`if [ $count = 0 ];thenecho 'second check fail , stop keepalive service !' >> $LOGFILEservice keepalived stopelseecho 'second check success , start keepalive service !' >> $LOGFILEkeepalived=` ps aux | grep -v grep | grep /usr/sbin/keepalived | wc -l`if [ $count = 0 ];thenservice keepalived startfiexit 0fi
(2)执行 crontab -e 编辑定时任务 每一分钟检测haproxy服务存活,如果服务启动不了,停掉keepalived服务,VIP即转发至backup节点(172.19.166.239)的机器
* * * * * sh /usr/local/bin/checkhaproxy.sh
附件
1、Haproxy配置文件(/usr/local/haproxy/haproxy.cfg)
globallog 127.0.0.1 local0 info #[err warning info debug]定义haproxy 日志级别pidfile /var/run/haproxy.pid #haproxy的进程PID文件maxconn 4000daemon #后台方式运行defaultslog global #应用全局的日志设置mode tcp #默认的模式mode{tcp|http|health }option dontlognull #不记录健康检查日志信息retries 3 #两次连接失败就认为是服务器不可用,也可以通过后面设置option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器maxconn 2000 #默认的最大连接数timeout connect 5000ms #连接超时timeout client 30000ms #客户端超时timeout server 30000ms #服务器超时 #haproxy带有监控功能,而且配置简单,直接在主配置文件中加入一下配置即可listen admin_statusbind 0.0.0.0:1080stats uri /admin #haproxy自带的管理页面通过http://ip:port/admin访问stats auth admin:admin #管理页面的用户名和密码stats hide-version #隐藏监控页面的HAproxy版本信息mode httpoption httplog listen allmycat_servicebind 0.0.0.0:8096 #设置监听端口,即haproxy提供的web服务端口,和lvs的vip类似log global #应用全局的日志设置mode tcpoption tcplogoption httpchk OPTIONS * HTTP/1.1Host: www #通过http检测的方式进行服务的检测balance roundrobinserver mycat_238 172.19.166.238:8066 check port 47700 inter 5s rise 2 fall 3server mycat_239 172.19.166.239:8066 check port 47700 inter 5s rise 2 fall 3timeout server 20000 listen allmycat_adminbind 0.0.0.0:8097 #转发到mycat的9066端口,即mycat的管理控制台端口mode tcpoption tcplogoption httpchk OPTIONS * HTTP/1.1Host: www #通过http检测的方式进行服务的检测balance roundrobin#定义后端server[ms1.srv1],请求定向到该server时会在响应中写入cookie值[ms1.srv1]#针对此server的maxconn设置为300#应用默认健康检查策略,健康检查间隔和超时时间为2000ms,两次成功视为节点UP,三次失败视为节点DOWN,这里haproxy的check借用了超级守护进程xinetd,下节有较详细的说明。server mycat_238 172.19.166.238:9066 check port 47700 inter 5s rise 2 fall 3server mycat_239 172.19.166.239:9066 check port 47700 inter 5s rise 2 fall 3timeout server 20000
global配置段,用于设定全局配置参数; defaults配置段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定