本文的前提是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.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_service
bind 0.0.0.0:8096 #设置监听端口,即haproxy提供的web服务端口,和lvs的vip类似
log global #应用全局的日志设置
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www #通过http检测的方式进行服务的检测
balance roundrobin
server mycat_238 172.19.166.238:8066 check port 47700 inter 5s rise 2 fall 3
server mycat_239 172.19.166.239:8066 check port 47700 inter 5s rise 2 fall 3
timeout server 20000
listen allmycat_admin
bind 0.0.0.0:8097 #转发到mycat的9066端口,即mycat的管理控制台端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www #通过http检测的方式进行服务的检测
balance roundrobin
server mycat_238 172.19.166.238:9066 check port 47700 inter 5s rise 2 fall 3
server mycat_239 172.19.166.239:9066 check port 47700 inter 5s rise 2 fall 3
timeout 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
通过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 mycatstatus
service mycatstatus
{
flags = REUSE
socket_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/bash
mycat=`/mnt/benz4s/mycat/bin/mycat status |grep 'not running'| wc -l`
if [ "$mycat" = "0" ];
then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
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/services
mycatstatus 47700/tcp # mycatstatus
# service xinetd restart #重启xinetd服务
如何保证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 keepalived
vrrp_instance VI_1 {
state MASTER #172.19.166.239上改为 BACKUP
interface ens0 #对外提供服务的网络接口,ifconfig
virtual_router_id 100 #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组
priority 150 #数值愈大,优先级越高,172.19.166.239上改为比150小的正整数
advert_int 1 #同步通知间隔
authentication { #包含验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用的类型为 PASS,据说AH 使用时有问题
auth_type PASS
auth_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/bash
LOGFILE='/root/log/checkHaproxy.log'
date >> $LOGFILE
count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`
if [ $count = 0 ];
then
echo 'first check fail , restart haproxy !' >> $LOGFILE
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
else
exit 0
fi
sleep 3
count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`
if [ $count = 0 ];
then
echo 'second check fail , stop keepalive service !' >> $LOGFILE
service keepalived stop
else
echo 'second check success , start keepalive service !' >> $LOGFILE
keepalived=` ps aux | grep -v grep | grep /usr/sbin/keepalived | wc -l`
if [ $count = 0 ];
then
service keepalived start
fi
exit 0
fi
(2)执行 crontab -e 编辑定时任务 每一分钟检测haproxy服务存活,如果服务启动不了,停掉keepalived服务,VIP即转发至backup节点(172.19.166.239)的机器
* * * * * sh /usr/local/bin/checkhaproxy.sh