1 HAProxy单点故障
在上一篇文章里,我们在一台机器上安装了HAProxy,实现了MyCat服务的集群。但是这样的架构中,只有一个HAProxy服务,一旦这个服务发生了宕机,集群将不可用,这就是所谓的单点故障。那么怎么进一步提高HAProxy的高可用,从而解决单点故障的问题呢?
通过Keepalived可以实现。
2 解决方案
在多个节点上安装HAProxy,并在每个HAProxy节点上安装Keepalived服务
- 对外
通过Keepalived服务,创建一个虚拟的IP地址,上游服务可以访问这个虚拟地址,实现与下层HAProxy及MyCat的访问。
- 对内
Keepalived服务监测自己所在节点的HAProxy服务的状态——即健康监测,当发现本地节点服务不可用时,将把本地IP地址与虚拟IP的映射关系上去掉,从而确保出现故障的服务,不会被上游服务访问到。
3 实现
3.1 安装HAProxy
之前仅在一个服务器上安装了HAProxy,现在开始在第二台服务器上也安装HAProxy。
安装方法参照上一篇内容。
yum install -y haproxy
修改配置文件内容
vi /etc/haproxy/haproxy.cfg
启动haproxy服务
haproxy -f /etc/haproxy/haproxy.cfg
查看WEB页面
安装完成。
3.2 安装keepalived
在两台机器上,同时执行安装指令
yum install -y keepalived
3.3 查看keepalived配置
安装完成后,查看安装后keepalived的配置文件
rpm -ql keepalived
3.4 设置主节点
3.4.1 设置主节点配置
global_defs {
router_id 173.3_ID
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"
interval 5
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_haproxy
}
virtual_ipaddress {
192.168.137.16
}
}
在主节点中输入如上配置内容,相关说明如下,需要根据自己本机配置情况,适当修改。
其中:
- global_defs 设置全局参数,这里可以配置smtp发送邮件的相关参数,当服务出现问题时,会发送邮件
- router_id 节点标识,每个节点不能相同
- vrrp_script 设置健康检查脚本的位置及检查间隔
- weight 节点权重增加的幅度
- vrrp_instance 定义的虚拟路由,其权重值默认为下方设置的priority;当执行健康检查后,结果为0,该路由被选择的权重将增加,增加幅度为weight中设定的数值
- state 主设备为MASTER,其他设置为BACKUP
- interface 绑定虚拟IP的网卡
- virtual_router_id 虚拟路由的ID号,同一个集群中取值应相同
- priority 节点优先级,master设备的值应高于backup设备的值
- advert_int 组播信息发送间隔时间,同一个集群中取值应相同
- nopreempt 主设备必须使用
- authentication 设置验证信息,同一个集群中取值应相同
- track_script 检查服务是否存活的脚本
- virtual_ipaddress 设置虚拟出的IP地址池,可以是多个
3.4.2 启动主节点服务
设置完成后,启动主节点keepalived服务
service keepalived start
查看网卡配置
ip addr
设置的虚拟IP已经生效。
3.4.3 浏览器访问虚拟IP
在浏览器中输入虚拟IP的URL信息,与直接使用HAProxy效果相同。
3.5 设置从节点
3.5.1 设置从节点配置
相比主节点配置文件,有以下不同:
- state 设置为BACKUP
- priority 比主节点数值小
- nopreempt 不需要配置
global_defs {
router_id 173.4_ID
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"
interval 5
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_haproxy
}
virtual_ipaddress {
192.168.137.16
}
}
3.5.2 启动从节点服务
设置完成后,启动从节点keepalived服务
service keepalived start
查看IP情况,可以看到从节点IP中没有虚拟IP相关信息
ip addr
因为keepalived所有节点,对于虚拟IP是一个抢占的关系,当有节点抢占后,其它节点只能等待。当抢占到虚拟IP的节点出现故障后,其他节点将开始重新抢占。
3.5.3 停止主节点keepalived服务
在主节点停止服务
service keepalived stop
此时再在主节点执行 ip addr,发现虚拟IP已经释放
在从节点中执行 ip addr,虚拟IP已经被抢占成功
3.6 配置健康检查
3.6.1 创建脚本文件
在主从节点上,分别创建在3.4.1 和 3.5.1 配置信息中的健康检查脚本,用于检测当前节点上HAProxy的运行状态,如果服务挂掉,将会进行自动重启。
vi /etc/keepalived/haproxy_check.sh
输入如下内容并保存
#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D"
STOP_HAPROXY="rm -f haproxy.pid"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
$STOP_HAPROXY
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
$STOP_HAPROXY
killall keepalived
fi
fi
检测 haproxy 服务是否存在,如果不存在,则执行服务HAProxy启动操作,等待3秒后,如果HAProxy服务还是没能起来,则停止keepalived服务。
注意:
- 脚本中的等待时间,应该小于 keepalived.conf 文件中的 vrrp_script chk_haproxy 下 interval 的时间。
- 当我们通过 kill -9 方式停止 haproxy 服务时,或者 haproxy 服务虽然停止,但是其 haproxy.pid 文件仍然存在,导致脚本启动服务失败,因此在启动服务前,需要首先删掉该文件。
此时,虚拟IP将被从节点获取,从而继续对外提供服务。
保存后,修改脚本属性为可执行
chmod 755 haproxy_check.sh
3.6.2 脚本生效
要使用脚本生效,需要重新启动 keepalived 服务。服务启动时,应使用指定配置文件的方式启动,且配置文件应使用绝对路径。
keepalived -f /etc/keepalived/keepalived.conf
3.6.3 查看 keepalived 日志
默认情况下,日志在 /var/log 目录下,打印在 messages 文件中。
3.6.4 验证健康检查
停止haproxy服务,验证服务能否自行启动
kill -9 服务的pid号