1 HAProxy单点故障

在上一篇文章里,我们在一台机器上安装了HAProxy,实现了MyCat服务的集群。但是这样的架构中,只有一个HAProxy服务,一旦这个服务发生了宕机,集群将不可用,这就是所谓的单点故障。那么怎么进一步提高HAProxy的高可用,从而解决单点故障的问题呢?

通过Keepalived可以实现。

2 解决方案

在多个节点上安装HAProxy,并在每个HAProxy节点上安装Keepalived服务

  • 对外

通过Keepalived服务,创建一个虚拟的IP地址,上游服务可以访问这个虚拟地址,实现与下层HAProxy及MyCat的访问。


  • 对内

Keepalived服务监测自己所在节点的HAProxy服务的状态——即健康监测,当发现本地节点服务不可用时,将把本地IP地址与虚拟IP的映射关系上去掉,从而确保出现故障的服务,不会被上游服务访问到。


MyCat19——搭建MyCat高可用集群_单点故障


3 实现

3.1 安装HAProxy

之前仅在一个服务器上安装了HAProxy,现在开始在第二台服务器上也安装HAProxy。

安装方法参照上一篇内容。

yum install -y haproxy

修改配置文件内容

vi /etc/haproxy/haproxy.cfg

启动haproxy服务

haproxy -f /etc/haproxy/haproxy.cfg

查看WEB页面

MyCat19——搭建MyCat高可用集群_IP_02

安装完成。

3.2 安装keepalived

在两台机器上,同时执行安装指令

yum install -y keepalived

3.3 查看keepalived配置

安装完成后,查看安装后keepalived的配置文件

rpm -ql keepalived

MyCat19——搭建MyCat高可用集群_IP_03

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

MyCat19——搭建MyCat高可用集群_IP_04

设置的虚拟IP已经生效。

3.4.3 浏览器访问虚拟IP

在浏览器中输入虚拟IP的URL信息,与直接使用HAProxy效果相同。

MyCat19——搭建MyCat高可用集群_单点故障_05

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

MyCat19——搭建MyCat高可用集群_IP_06

因为keepalived所有节点,对于虚拟IP是一个抢占的关系,当有节点抢占后,其它节点只能等待。当抢占到虚拟IP的节点出现故障后,其他节点将开始重新抢占。

3.5.3 停止主节点keepalived服务

在主节点停止服务

service keepalived stop

此时再在主节点执行 ip addr,发现虚拟IP已经释放

MyCat19——搭建MyCat高可用集群_单点故障_07

在从节点中执行 ip addr,虚拟IP已经被抢占成功

MyCat19——搭建MyCat高可用集群_IP_08

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号

MyCat19——搭建MyCat高可用集群_单点故障_09