您的位置:首页 > 运维架构 > 网站架构

MyCat高可用负载均衡集群的实现(HAProxy + Keepalived + MyCat)

2019-07-15 23:54 981 查看

一、依赖博客文章

https://my.oschina.net/u/3155476/blog/3070789

https://my.oschina.net/u/3155476/blog/3070799

https://my.oschina.net/u/3155476/blog/3071307

https://my.oschina.net/u/3155476/blog/3074563

 

本节课程要解决的问题:

 

 

二、软件版本

操作系统:CentOS-6.6-x86_64

JDK版本:jdk1.7.0_72

Keepalived版本:keepalived-1.2.18.tar.gz

HAProxy版本:haproxy-1.5.16.tar.gz

MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz

MySQL版本:mysql-5.6.26.tar.gz

 

三、部署环境规划

名称

IP

主机名

配置

HAProxy主机1

VIP:192.168.1.190

192.168.1.191

edu-haproxy-01 (默认Master)

2核、2G

HAProxy主机2

192.168.1.192

edu-haproxy-02 (默认Backup)

2核、2G

MyCat主机1

192.168.1.203

edu-mycat-01

4核、4G

MyCat主机2

192.168.1.204

edu-mycat-02

4核、4G

MySQL主节点

192.168.1.205

edu-mysql-01

4核、4G

MySQL从节点

192.168.1.206

edu-mysql-02

4核、4G

 

四、MyCat高可用负载均衡集群部署架构图如下:

图解说明:

(1) HAProxy实现了MyCat多节点的集群高可用和负载均衡,而HAProxy自身的高可用则可以通过Keepalived来实现。因此,HAProxy主机上要同时安装HAProxy和Keepalived,Keepalived负责为该服务器抢占vip(虚拟ip,图中的192.168.1.190),抢占到vip后,对该主机的访问可以通过原来的ip(192.168.1.191)访问,也可以直接通过vip(192.168.1.190)访问。

(2) Keepalived抢占vip有优先级,在keepalived.conf配置中的priority属性决定。但是一般哪台主机上的Keepalived服务先启动就会抢占到vip,即使是slave,只要先启动也能抢到(要注意避免Keepalived的资源抢占问题)。

(3) HAProxy负责将对vip的请求分发到MyCat集群节点上,起到负载均衡的作用。同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat上。

(4) 如果Keepalived+HAProxy高可用集群中的一台服务器宕机,集群中另外一台服务器上的Keepalived会立刻抢占vip并接管服务,此时抢占了vip的HAProxy节点可以继续提供服务。

(5) 如果一台MyCat服务器宕机,HAPorxy转发请求时不会转发到宕机的MyCat上,所以MyCat依然可用。

综上:MyCat的高可用及负载均衡由HAProxy来实现,而HAProxy的高可用,由Keepalived来实现。

 

五、HAProxy节点2的部署

HAProxy主机2(edu-haproxy-02,192.168.1.192)请参考上一节课程《高可用架构篇--第16节--MyCat集群部署(HAProxy+MyCat)》对进行对等部署和做相应配置。

注意配置文件的调整:

多节点部署时haproxy.cfg 配置文件中的node 、 description配置的值要做相应调整。

HAProxy节点1的状态信息页:http://192.168.1.191:48800/admin-status

HAProxy节点2的状态信息页:http://192.168.1.192:48800/admin-status

 

六、Keepalived介绍  (官网:http://www.haproxy.org/  

Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障的发生,通过配合Haproxy可以实现web前端服务的高可用。

Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生。MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该虚拟IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。

 

七、Keepalived的安装(192.168.1.191、192.168.1.192)

Keepalived ( http://www.keepalived.org/download.html

1、上传或下载keepalived(keepalived-1.2.18.tar.gz)到 /usr/local/src 目录

 

2、解压安装

安装keepalived需要用到openssl

# yum install gcc gcc-c++ openssl openssl-devel

# cd /usr/local/src

# tar -zxvf keepalived-1.2.18.tar.gz

# cd keepalived-1.2.18

# ./configure --prefix=/usr/local/keepalived

# make && make install

 

3、将keepalived安装成Linux系统服务:

因为没有使用keepalived的默认路径安装(默认是/usr/local),安装完成之后,需要做一些工作

 

复制默认配置文件到默认路径

# mkdir /etc/keepalived

# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

 

复制keepalived服务脚本到默认的地址

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

 

设置keepalived服务开机启动

# chkconfig keepalived on

4、修改Keepalived配置文件

(1) MASTER节点配置文件(192.168.1.191)

# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   ## keepalived自带的邮件提醒需要开启sendmail服务。建议用独立的监控或第三方SMTP

   router_id edu-haproxy-01  ## 标识本节点的字条串,通常为hostname

}

## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。

## 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。

## 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。

## 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

vrrp_script chk_haproxy {

    script "/etc/keepalived/haproxy_check.sh"  ## 检测haproxy状态的脚本路径

    interval 2  ## 检测时间间隔

    weight 2  ## 如果条件成立,权重+2

}

## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称

vrrp_instance VI_1 {

state BACKUP  ## 默认主设备(priority值大的)和备用设备(priority值小的)都设置为BACKUP,

## 由priority来控制同时启动情况下的默认主备,否则先启动的为主设备

    interface eth1  ## 绑定虚拟IP的网络接口,与本机IP地址所在的网络接口相同,我的是eth1

    virtual_router_id 91  ## 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,

                   ## 相同的VRID为一个组,他将决定多播的MAC地址

    priority 120  ## 节点优先级,值范围0-254,MASTER要比BACKUP高

nopreempt  ## 主设备(priority值大的)配置一定要加上nopreempt,否则非抢占也不起作用

    advert_int 1  ## 组播信息发送间隔,两个节点设置必须一样,默认1s

 

    ## 设置验证信息,两个节点必须一致

    authentication {

        auth_type PASS

        auth_pass 1111  ## 真实生产,按需求对应该过来

    }

    ## 将track_script块加入instance 配置块

    track_script {

        chk_haproxy  ## 检查HAProxy服务是否存活

    }

    

    ## 虚拟IP池, 两个节点设置必须一样

    virtual_ipaddress {

        192.168.1.190  ## 虚拟ip,可以定义多个,每行一个

    }

}

 

(2)BACKUP节点配置文件(192.168.1.192):

# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id edu-haproxy-02

}

 

vrrp_script chk_haproxy {

    script "/etc/keepalived/haproxy_check.sh"

    interval 2

    weight 2

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth1

    virtual_router_id 91

    priority 110

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        chk_haproxy

    }

    virtual_ipaddress {

        192.168.1.190

    }

}

特别注意:如果非抢占模式不生效,在Keepalived的故障节点恢复后会再次导抢占vip,从而因vip切换而闪断带来的风险(视频解说)。按以上配置,配置了Keepalived非抢占模式,配置及注意点如下:

(1) 主设备、从设备中的 state 都设置为 BACKUP

(2) 主设备、从设备中都不要配置 mcast_src_ip (本机IP地址)

(3) 默认主设备(priority值大的Keepalived节点)配置一定要加上 nopreempt,否则非抢占不起作用

(4) 防火墙配置允许组播(主、备两台设备上都需要配置,keepalived使用224.0.0.18作为Master和Backup健康检查的通信IP)

# iptables -I INPUT -i eth1 -d 224.0.0.0/8 -p vrrp -j ACCEPT

# iptables -I OUTPUT -o eth1 -d 224.0.0.0/8 -p vrrp -j ACCEPT

(eth1为主机的网卡设备名称,生产环境服务器可以用独立网卡来处理组播和心跳检测等)

# service iptables save

重启防火墙: 

# service iptables restart

    

5、编写Haproxy状态检测脚本 /etc/keepalived/haproxy_check.sh (已在keepalived.conf中配置)

脚本要求:如果haproxy停止运行,尝试启动,如果无法启动则杀死本机的keepalived进程,keepalied将虚拟ip绑定到BACKUP机器上。内容如下:

# mkdir -p /usr/local/keepalived/log

# vi /etc/keepalived/haproxy_check.sh

#!/bin/bash

START_HAPROXY="/etc/rc.d/init.d/haproxy start"

STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"

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

    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

        killall keepalived

    fi

fi

 

保存后,给脚本赋执行权限:

# chmod +x /etc/keepalived/haproxy_check.sh

 

6、启动Keepalived

# service keepalived start

Starting keepalived: [  OK  ]

 

Keepalived服务管理命令:

停止:service keepalived stop

启动:service keepalived start

重启:service keepalived restart

查看状态:service keepalived status

 

八、Keepalived + Haproxy的高可用测试

1、关闭192.168.1.191中的Haproxy,Keepalived会将它重新启动

# service haproxy stop

 

2、关闭192.168.1.191中的Keepalived,VIP(192.168.1.190)会被192.168.1.192抢占

# service keepalived stop

Keepalived停止后,192.168.1.191节点的网络接口中的VIP(192.168.1.190)将消失

查看此时VIP对应的MAC,Windows下使用CMD命令查看:

说明此时VIP已经漂移到物理主机192.168.1.192上了

再通过VIP来访问Haproxy集群,访问到的也是192.168.1.192

http://192.168.1.190:48800/admin-status

 

3、重新启动192.168.1.191中的Keepalived,vip(192.168.1.190)保留在192.168.1.192主机上,不会出现191启动抢占vip的情况。

# service keepalived start

 

4、模拟抢占了vip的节点(192.168.1.192)中的HAProxy故障或启动失败。

方式:把192节点中的haproxy.cfg文件重命名为haproxy.cfg_bak,并把haproxy服务进行kill掉,此时keepalived会尝试去启动haproxy,会由于找不到配置文件而启动失败,此时就会进行haproxy_check.sh脚本中的killall keepalived命令,结束keepalived进行。随后就是192.168.1.191节点重新抢占vip

http://192.168.1.190:48800/admin-status

http://192.168.1.191:48800/admin-status

 

九、通过vip访问数据库、验证vip切换后的数据库访问

 

附上配置文件以及脚本

master节点上的keepalived.conf

###################################################################################################
! Configuration File for keepalived

global_defs {
## keepalived自带的邮件提醒需要开启sendmail服务。建议用独立的监控或第三方SMTP
router_id edu-haproxy-01  ## 标识本节点的字条串,通常为hostname
}

## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
## 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
## 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"  ## 检测haproxy状态的脚本路径
interval 2  ## 检测时间间隔
weight 2  ## 如果条件成立,权重+2
}

## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP  ## 默认主设备(priority值大的)和备用设备(priority值小的)都设置为BACKUP,
##由priority来控制同时启动情况下的默认主备,否则先启动的为主设备
interface eth1  ## 绑定虚拟IP的网络接口,与本机IP地址所在的网络接口相同,我的是eth1
virtual_router_id 91  ## 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,
## 相同的VRID为一个组,他将决定多播的MAC地址
priority 120  ## 节点优先级,值范围0-254,MASTER要比BACKUP高
nopreempt  ## 主设备(priority值大的)配置一定要加上nopreempt,否则非抢占也不起作用
advert_int 1  ## 组播信息发送间隔,两个节点设置必须一样,默认1s

## 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111  ## 真实生产,按需求对应该过来
}

## 将track_script块加入instance 配置块
track_script {
chk_haproxy  ## 检查HAProxy服务是否存活
}

## 虚拟IP池, 两个节点设置必须一样
virtual_ipaddress {
192.168.1.190  ## 虚拟ip,可以定义多个,每行一个
}
}

master节点上的haproxy_check.sh(LOG_FILE的路径log以及日志文件要自行创建)

#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
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
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
killall keepalived
fi
fi

 

 

 backup节点上的keepalived.conf

###################################################################################################
! Configuration File for keepalived

global_defs {
router_id edu-haproxy-02
}

vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh"
interval 2
weight 2
}

vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 91
priority 110
advert_int 1

authentication {
auth_type PASS
auth_pass 1111
}

track_script {
chk_haproxy
}

virtual_ipaddress {
192.168.1.190
}
}

backup上的haproxy_check.sh(LOG_FILE的路径log以及日志文件要自行创建)

#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
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
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
killall keepalived
fi
fi

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HAproxy Keepalived MyCAT