haroxy官方定义如下:
HAProxy是一种免费的、非常快速和可靠的解决方案,它提供了高可用性、负载平衡和对TCP和基于http的应用程序的代理。它特别适用于非常高的流量网站,并且拥有相当多的世界上最受欢迎的网站。多年来,它已经成为事实上的标准的opensource负载平衡器,现在已经与大多数主流的Linux发行版一起发布,并且经常在云平台上默认部署
实际上mycat本身也可以直接搭配keepalived来做高可用,如果不搭配haproxy,那么永远只有一台mycat是可用状态,其他的只是做灾备用。haproxy主要作用是mycat的负载均衡以及高可用。
PS:haproxy官网默认的下载地址http://www.haproxy.org/download打不开,网上各种搜到的也不行;于是自己试了加了认证https://www.haproxy.org/download成功打开。
option httpchk
option httpchk< url >
option httpchk< method > < url >
option httpchk< method > < url > < version >
service mycat_status{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server =/usr/local/bin/mycat_status
log_on_failure += USERID
disable = no
}
#!/bin/bash
mycat=`/usr/local/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
option mysql-check user username
这里的username对应的是mysql真实存在的一个用户,必须是无密码的。
可以看出还有针对其他类型的健康检查,比如pgsql。
! Configuration File for keepalived
############################ 全局配置 ############################
global_defs {
notification_email {
[email protected] # 发生诸如切换操作时邮件告警地址,可以定义多个,每行一个。这个功能有点鸡肋,keepalived死掉也没法发了,可以用在vrrp_script定义的脚本里面触发发邮件的功能。
}
notification_email_from [email protected] # 邮件发送源地址
smtp_server 127.0.0.1 # SMTP Server地址
smtp_connect_timeout 30 # SMTP Server的超时时间
router_id keepalived_1 # 标识机器名
}
############################ VRRP配置 ############################
# 定义检测 haproxy 状态的脚本
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" # 检测 haproxy 状态的脚本路径
interval 10 # 检测时间间隔
weight 2 # 权重
}
# 定义虚拟路由, K_1为虚拟路由的标示符,自己定义名称
vrrp_instance K_1 {
state MASTER # 指定当前主机的的角色,MASTER表示是主,BACKUP表示备用;个人测试此参数没有实际功能,只作标识用
interface eth0 # 实际监控的网卡
virtual_router_id 1 # 相同的 VRID 为一个组,他将决定多播的 MAC 地址
priority 100 # 设置本节点优先级,范围[0-254],高的为MASTER,如果优先级一样,则IP地址大的是MASTER
nopreempt # 主要作用于master服务死掉又恢复时不抢占VIP
advert_int 1 # 组播信息发送间隔,默认1s,两个节点设置必须一样
# 验证方式与验证密码,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
# 上面定义的vrrp_script脚本加入到vrrp_instance选项中来
track_script {
chk_haproxy
}
# 虚拟 IP 池,即外部访问的地址,两个节点设置必须一样,可以定义多个,每行一个
virtual_ipaddress {
192.168.1.208
}
}
vrrp_script { # VRRP script declaration
script # script to run periodically
interval # run the script this every seconds
weight # adjust priority by this weight
fall # required number of failures for OK switch
rise # required number of successes for OK switch
}
The script will be executed periodically, every seconds. Its exit code will be recorded for all VRRP instances which will want to monitor it. Note that the script will only be executed if at least one VRRP instance monitors it with a non-zero weight. Thus, any number of scripts may be declared without taking the system down. If unspecified, the weight equals 2, which means that a success will add +2 to the priority of all VRRP instances which monitor it. On the opposite, a negative weight will be subtracted from the initial priority in case of failure.
#!/bin/bash
log_file="/usr/local/keepalived/haproxy_check.log"
date=`date '+%F_%H_%M'`
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
killall keepalived#记录切换日志echo "date" >> $ log_file
echo "haproxy is stopped, killall keepalived!" >> $ log_file
echo " " >> $ log_file
fi
(一)必须先启动MASTER再启动BACKUP,因为MASTER设置了nopreempt。
(二)MASTER死掉重启时,先启动haproxy在启动keepalived
#!/bin/bash
log_file="/usr/local/keepalived/haproxy_check.log"
date=`date '+%F_%H_%M'`
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "date" >> $ log_fileecho "haproxy is stopped, vip shift!" >> $ log_file
echo " " >> $ log_file
exit 1
else
exit 0
fi
(一)当weight>0(可用weight =20、priorit=90搭配weight =40、priorit=80去测)
执行结果为0(即haproxy可用),组传播的优先级值=priority+ weight
执行结果为1(即haproxy不可用),组传播的优先级值= priority
(二)当weight<0(可用weight =-20、priorit=70搭配weight= -40、priorit=80去测)
执行结果为0(即haproxy可用),组传播的优先级值= priority
执行结果为1(即haproxy不可用),组传播的优先级值= priority+weight
(一)不能设置nopreempt;打个比方,主机M的haproxy不可用,使得VIP飘到B,此后M恢复了,接着B不可用,但由于M设置了nopreempt,VIP无法漂移到M,然后……就没有然后了……
(二)组传播的优先级值以配置好的priority及weight去计算,不会不断的提高或者降低
(三)组传播的优先级值保持的范围在[1,254],不会有优先级小于等于0或者优先级大于等于255的情况出现
(四)官方文档有句If unspecified, the weight equals 2说的是默认权重是2,但本人用了各种方式去测试结果表明:在没设置weight或者weight=0的情况下,无论主备机的priorit设置值相差多少,只要其中一台机器的执行结果为1(即haproxy不可用),就会发生VIP漂移。