搭建分布式数据库负载均衡运行环境的一些配置记录(4)keepalived

Keepalived

关于 Keepalived 的详细介绍可以参考:Keepalived Introduction

Keepalived 是一个用于负载均衡和高可用的路由软件。

其负载均衡(Load balancing)的特性依赖于 Linux 虚拟服务器(LVS)的 IPVS 内核模块,提供了 Layer 4 负载均衡器(TCP 层级,Layer 7 是 HTTP 层级,即计算机网络中的OSI 七层网络模型与 TCP/IP 四层网络模型)。

Keepalived 实现了虚拟冗余路由协议(VRRP, Virtual Redundancy Routing Protoco),VRRP 是路由故障切换(failover)的基础。

简单来说,Keepalived 主要提供两种功能:

  • 依赖 IPVS 实现服务器的健康检查;
  • 实现 VRRPv2 协议来处理路由的故障切换。

我们接下来会用个简单的配置来描述后者的工作原理:

在 haproxy-master 机器上:

vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # verify haproxy's pid existance
    interval 2                   # check every 2 seconds
    weight -2                    # if check failed, priority will minus 2
}

vrrp_instance VI_1 {
    state MASTER                 # Start-up default state
    interface ens18              # Binding interface
    virtual_router_id 51         # VRRP VRID(0-255), for distinguish vrrp's multicast
    priority 105                 # VRRP PRIO
    virtual_ipaddress {          # VIP, virtual ip
        192.168.0.146
    }
    track_script {               # Scripts state we monitor
        chk_haproxy              
    }
}

在 haproxy-backup 机器上:

vrrp_script chk_haproxy {
   script "killall -0 haproxy"
    interval 2
    weight -2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens18
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        192.168.0.146
    }
    track_script {             
        chk_haproxy              
    }
}

我们为两台机器(master、backup)安装了 Keepalived 服务并设定了上述配置。

可以发现,我们绑定了一个虚拟 IP (VIP, virtual ip): 192.168.0.146,在 haproxy-master + haproxy-backup 上用 Keepalived 组成了一个集群。在集群初始化的时候,haproxy-master 机器的 <state> 被初始化为 MASTER。

间隔 2 seconds(<interval>) 会定时执行 <script>脚本 ,每个<vrrp_instance> 会记录脚本的 exit code。

关于<weight> 参数的使用:

  • 检测失败,并且 weight 为正值:无操作
  • 检测失败,并且 weight 为负值:priority = priority - abs(weight)
  • 检测成功,并且 weight 为正值:priority = priority + weight
  • 检测成功,并且 weight 为负值:无操作

weight 默认值为 0,对此如果感到迷惑可以参考:HAProxy github code

故障切换工作流程:

  • 当前的 MASTER 节点<script> 脚本检测失败后,如果“当前 MASTER 节点的 priority” < “当前 BACKUP 节点的 priority” 时,会发生路由故障切换。
  • 当前的 MASTER 节点脚本检测成功,无论 priority 是大是小,不会做故障切换。

其中有几处地方需要注意:

  1. 一个 Keepalived 服务中可以有个 0 个或者多个 vrrp_instance
  2. 可以有多个绑定同一个 VIP 的 Keepalived 服务(一主多备),本小节中只是写了两个
  3. 注意 <virtual_router_id>,同一组 VIP 绑定的多个 Keepalived 服务的 <virtual_router_id> 必须相同;多组 VIP 各自绑定的 Keepalived 服务一定与另外组不相同。否则前者会出现丢失节点,后者在初始化的时候会出错。

vi keepalived.conf



  2 ! Configuration File for keepalived
  3 
  4 global_defs {
  5    notification_email {
  6      acassen@firewall.loc
  7      failover@firewall.loc
  8      sysadmin@firewall.loc
  9    }
 10    notification_email_from Alexandre.Cassen@firewall.loc
 11    smtp_connect_timeout 30
 12    router_id LVS_DEVEL
 13 }
 14 vrrp_script chk_tomcat
 15 {
 16      script "/etc/keepalived/check_haproxy.sh"
 17    ##  script "/etc/keepalived/mysql.sh"
 18      script "/etc/keepalived/tomcat_check.sh"
 19      script "/etc/keepalived/check_port.sh 8066"
 20      interval 5
 21      weight -5
 22 }
 23 vrrp_instance VI_1 {
 24     state BACKUP
 25     interface ens33
 26     virtual_router_id 56
 27     priority 99
 28     unicast_src_ip  173.16.80.76         ##source ip
 29     unicast_peer {
 30                     173.16.80.70              ##dest ip
 31     }
 32     advert_int 1
 33     authentication {
 34         auth_type PASS
 35         auth_pass 1111
 36     }
 37     virtual_ipaddress {
 38        173.16.80.200
 39     }
 40     track_script {
 41          chk_tomcat
 42     }
 43 

 44 }



vi check_haproxy.sh

  1 #!/bin/bash
  2 A=`ps -C haproxy --no-header |wc -l`
  3 if [ $A -eq 0 ];then
  4 /etc/init.d/haproxyd restart
  5 echo "Start haproxy" &> /dev/null
  6 sleep 3
  7 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
  8 /etc/init.d/keepalived stop
  9 echo "Stop keepalived" &> /dev/null
 10 fi
 11 fi

 12 


vi check_port.sh


#!/bin/bash
CHK_PORT=$1
echo $CHK_PORT
if [ "$CHK_PORT" != "" ];then


        PORT_PROCESS=`lsof -i:$CHK_PORT|wc -l`
        if [ $PORT_PROCESS -eq 0 ];then
        echo "Port $CHK_PORT Is Not Used,End."


        sleep 2
                PORT_PROCESS=`lsof -i:$CHK_PORT|wc -l`
                if [ $PORT_PROCESS -eq 0 ];then
                systemctl stop keepalived
                fi
        fi
else
        echo "Check Port Cant Be Empty!"
fi



vi tomcat_check.sh

  1 #!/bin/bash   
  2 netstat -ant|grep 8090
  3 ALIVE=$?
  4 LOGFILE="/etc/keepalived/keepalived-check.log"
  5 echo "[CHECK]" >> $LOGFILE
  6 date >> $LOGFILE
  7 if [ $ALIVE -eq 0 ]; then :
  8    echo "8090 is ok" >> $LOGFILE 2>&1
  9    exit 0
 10 else
 11    echo "8090 is down" >> $LOGFILE 2>&1
 12    exit 1

 13 fi


脚本编写完 chmod 777 check_port.sh 赋予权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值