全网超详细攻略——高可用集群KEEPALIVED详解

目录

一、Keepalived概述

1.1 什么是Keepalived ?

1.2 Keepalived架构

1.3 Keepalived工作原理

1.3.1 VRRP 相关术语

1.3.2 VRRP 相关技术

1.4 Keepalived工作区域

1.5 高可用集群

1.5.1 集群类型

1.5.2 系统可用性

1.5.3 实现高可用

二、Keepalived部署

2.1 Keepalived 环境准备

2.2 Keepalived 相关文件

2.3 Keepalived 安装

2.4 KeepAlived 配置说明

2.4.1 配置文件组成部分

2.4.2 配置语法说明

2.4.2.1 全局配置

2.4.2.2 配置虚拟路由器

2.4.2.3 启用keepalived日志功能

2.4.2.4 实现独立子配置文件

三、Keepalived 企业应用示例

3.1 实现master/slave的 Keepalived 单主架构

3.2 抢占模式和非抢占模式

3.2.1 非抢占模式 nopreempt

3.2.2 抢占延迟模式 preempt_delay

3.3 VIP单播配置

3.4 Keepalived 通知脚本配置

3.5 实现 master/master 的 Keepalived 双主架构

3.6 实现IPVS的高可用性

3.6.1 IPVS相关配置

3.6.1.1 virtual server (虚拟服务器)的定义格式

3.6.1.2 虚拟服务器配置

3.6.1.3 应用层监测

3.6.1.4 TCP监测

3.6.2 实战案例

实现单主的 LVS-DR 模式

3.7 实现其它应用的高可用性 VRRP Script

3.7.1 VRRP Script 配置

3.7.1.1 定义 VRRP script

3.7.1.2 调用 VRRP script

实现HAProxy高可用


一、Keepalived概述

1.1 什么是Keepalived ?

 Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。它可以自动检测集群中服务器的健康状况,比如主从模式时,当主服务器发生故障时,Keepalived会根据服务器的VRRP优先级来选举一个从服务器成为主服务器,实现主从的无缝切换,保证持续的提供服务,并且Keepalived也会及时的通过邮件通知到相关负责人进行维护出现问题的服务器。               Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。      
        Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。(因此Keepalived在给Nginx,Haproxy做高可用的时候,仅仅 只是用了keepalived的VRRP协议。)

1.2 Keepalived架构

  • 用户空间核心组件:

        vrrp stack:VIP消息通告

        checkers:监测real server

        system call:实现 vrrp 协议状态转换时调用脚本的功能

        SMTP:邮件组件

        IPVS wrapper:生成IPVS规则

        Netlink Reflector:网络接口

        WatchDog:监控进程

  • 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
  • IO复用器:针对网络目的而优化的自己的线程抽象
  • 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

1.3 Keepalived工作原理

         Keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,解决静态网关单点风险 ,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

物理层:路由器、三层交换机
软件层:keepalived

1.3.1 VRRP 相关术语

  • 虚拟路由器:Virtual Router
  • 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
  • VIPVirtual IP
  • VMACVirutal MAC (00-00-5e-00-01-VRID)
  • 物理路由器:
        master:主设备
        backup:备用设备
        priority:优先级

1.3.2 VRRP 相关技术

通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式
  • 安全认证:
  • 无认证
  • 简单字符认证:预共享密钥
  • MD5
工作模式:
  • /备:单虚拟路由器
  • /主:主/备(虚拟路由器1),备/主(虚拟路由器2

1.4 Keepalived工作区域

         Layer3,4,&5工作在IP/TCP协议栈的网络层,传输层,及应用层。

网络层:Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层:Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层:,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。

1.5 高可用集群

1.5.1 集群类型

  • LBLoad Balance 负载均衡
        LVS/HAProxy/nginx( http/upstream, stream/upstream
  • HAHigh Availability 高可用集群
        数据库、Redis
  • SPoF: Single Point of Failure,解决单点故障
        HPC: High Performance Computing 高性能集群

1.5.2 系统可用性

SLA Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约)
A = MTBF / (MTBF+MTTR
99.95%:(60*24*30)*(1-0.9995)=21.6 分钟 # 一般按一个月停机时间统计
指标 : 99.9%, 99.99%, 99.999%,99.9999%

1.5.3 实现高可用

提升系统高用性的解决方案:降低 MTTR- Mean Time To Repair( 平均故障时间 )
解决方案:建立冗余机制
active/passive /
active/active 双主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active

二、Keepalived部署

2.1 Keepalived 环境准备

  • 各节点时间必须同步:ntp, chrony
  • 关闭防火墙及SELinux
  • 各节点之间可通过主机名互相通信:非必须
  • 建议使用/etc/hosts文件实现:非必须
  • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须

2.2 Keepalived 相关文件

  • 软件包名:keepalived
  • 主程序文件:/usr/sbin/keepalived
  • 主配置文件:/etc/keepalived/keepalived.conf
  • 配置文件示例:/usr/share/doc/keepalived/
  • Unit File/lib/systemd/system/keepalived.service
  • Unit File的环境配置文件:/etc/sysconfig/keepalived

2.3 Keepalived 安装

[root@ka1 ~]# yum install keepalived -y
[root@ka1 ~]# systemctl start keepalived.service 
[root@ka1 ~]# ps axf | grep keepalived
  3488 pts/1    S+     0:00          \_ grep --color=auto keepalived
  3472 ?        Ss     0:00 /usr/sbin/keepalived -D
  3473 ?        S      0:00  \_ /usr/sbin/keepalived -D
  3474 ?        S      0:00  \_ /usr/sbin/keepalived -D

2.4 KeepAlived 配置说明

2.4.1 配置文件组成部分

配置文件: /etc/keepalived/keepalived.conf
配置文件组成
        GLOBAL CONFIGURATION
        Global definitions: 定义邮件配置, route_id vrrp 配置,多播地址等
        VRRP CONFIGURATION
        VRRP instance(s): 定义每个vrrp 虚拟路由器
        LVS CONFIGURATION
        Virtual server group(s)
        Virtual server(s): LVS集群的 VS RS

2.4.2 配置语法说明

2.4.2.1 全局配置
! Configuration File for keepalived
global_defs {
notification_email {
1718181506@qq.com     #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
}
notification_email_from keepalived@KA1.leoliu.org     #发邮件的地址
smtp_server 127.0.0.1     #邮件服务器地址
smtp_connect_timeout 30     #邮件服务器连接timeout
router_id KA1.leoliu.org     #每个keepalived主机唯一标识
                             #建议使用当前主机名,但多节点重名不影响
vrrp_skip_check_adv_addr     #对所有通告报文都检查,会比较消耗性能
                             #启用此配置后,如果收到的通告报文和上一个报文是同一 #个路由器,则跳过检查,默认值为全检查
vrrp_strict                  #严格遵循vrrp协议
                             #启用此项后以下状况将无法启动服务:
                             #1.无VIP地址
                             #2.配置了单播邻居
                             #3.在VRRP版本2中有IPv6地址
                             #建议不加此项配置

vrrp_garp_interval 0         #报文发送延迟,0表示不延迟
vrrp_gna_interval 0          #消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}
2.4.2.2 配置虚拟路由器
vrrp_instance VI_1 {
    state MASTER
    interface eth0              #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
    virtual_router_id 100        #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一
                            #否则服务无法启动
                            #同属一个虚拟路由器的多个keepalived节点必须相同
                            #务必要确认在同一网络中此值必须唯一

    priority 100                #当前物理节点在此虚拟路由器的优先级,范围:1-254
                            #值越大优先级越高,每个keepalived主机节点此值不同

    advert_int 1                #vrrp通告的时间间隔,默认1s
    authentication {            #认证机制
    auth_type AH|PASS           #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
    uth_pass 1111               #预共享密钥,仅前8位有效
                            #同一个虚拟路由器的多个keepalived节点必须一样
    }
    virtual_ipaddress {        #虚拟IP,生产环境可能指定上百个IP地址
        <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
        172.25.254.100              #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32
        172.25.254.101/24 dev eth1
        172.25.254.102/24 dev eth2 label eth2:1
    }
}
2.4.2.3 启用keepalived日志功能
[root@ka1 ~]# vim /etc/sysconfig/keepalived 
KEEPALIVED_OPTIONS="-D -S 6"

[root@ka1 ~]#vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log

[root@ka1 ~]# systemctl restart keepalived.service 
[root@ka1 ~]# systemctl restart rsyslog.service 
[root@ka1 ~]# tail -f /var/log/keepalived.log
tail: 无法打开"/var/log/keepalived.log" 读取数据: 没有那个文件或目录
tail: 没有剩余文件
[root@ka1 ~]# systemctl restart keepalived.service 
[root@ka1 ~]# tail -f /var/log/keepalived.log
Aug 15 23:13:10 ka1 Keepalived_healthcheckers[4758]: Activating healthchecker for service [10.10.10.3]:1358
Aug 15 23:13:10 ka1 Keepalived_healthcheckers[4758]: Activating healthchecker for service [10.10.10.3]:1358
Aug 15 23:13:10 ka1 Keepalived_vrrp[4759]: (VI_1): Cannot start in MASTER state if not address owner
Aug 15 23:13:10 ka1 Keepalived_vrrp[4759]: VRRP_Instance(VI_1) removing protocol VIPs.
Aug 15 23:13:10 ka1 Keepalived_vrrp[4759]: VRRP_Instance(VI_1) removing protocol iptable drop rule
Aug 15 23:13:10 ka1 Keepalived_vrrp[4759]: Using LinkWatch kernel netlink reflector...

2.4.2.4 实现独立子配置文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {
   notification_email {
     1718181506@qq.com
   }
   notification_email_from keepalived@KA1.leoliu.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id KA1.leoliu.org
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18
}
include /etc/keepalived/conf.d/*.conf   #相关子配置文件

#vrrp_instance VI_1 {
#    state MASTER
#    interface eth0
#    virtual_router_id 100
#    priority 100
#    advert_int 1
#    authentication {
#        auth_type PASS
#        auth_pass 1111
#    }
#    virtual_ipaddress {
#        172.25.254.100/24 dev eth0 label eth0:1
#    }
#}

[root@ka1 ~]# mkdir /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}

[root@ka1 ~]# systemctl restart keepalived.service

三、Keepalived 企业应用示例

3.1 实现master/slave的 Keepalived 单主架构

ka1配置:

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
[root@ka1 ~]# systemctl restart keepalived.service 

ka2配置:

[root@ka2 ~]# vim /etc/keepalived/keepalived.conf 
[root@ka2 ~]# systemctl restart keepalived.service

测试:

抓包观察:

当ka1的keepalived关闭时,vip会跑到ka2

当ka1重新开启keepalived时,vip会回到到ka1

3.2 抢占模式和非抢占模式

3.2.1 非抢占模式 nopreempt

默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色, 这样会使vip KA 主机中来回漂移,造成网络抖动,建议设置为非抢占模式nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色 ,非抢占模块下, 如果原主机 down , VIP 迁移至的新主机 , 后续也发生 down , 仍会将 VIP 迁移回原主机
注意:要关闭 VIP 抢占,必须将各 keepalived 服务器 state 配置为 BACKUP

ka1配置:

ka2配置:

3.2.2 抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回 VIP
preempt_delay # # 指定抢占延迟时间为 #s ,默认延迟 300s
注意:需要各 keepalived 服务器 state BACKUP, 并且不要启用 vrrp_strict

ka1:

ka2:

3.3 VIP单播配置

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
注意:启用 vrrp_strict 时,不能启用单播

ka1配置:

ka2配置:

重启keepalived.service , 抓包查看单播效果

有vip的keepalived主机才看得到抓包效果,ka1关闭keepalived服务,ka2才可查看抓包

[root@ka1 ~]# systemctl stop keepalived.service 

3.4 Keepalived 通知脚本配置

keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户 keepalived_script 身份执行脚本
如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份

通知脚本类型

  • 当前节点成为主节点时触发的脚本:notify_master <STRING>|<QUOTED-STRING>
  • 当前节点转为备节点时触发的脚本:notify_backup <STRING>|<QUOTED-STRING>
  • 当前节点转为失败状态时触发的脚本 notify_fault <STRING>|<QUOTED-STRING>
  • 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知:notify <STRING>|<QUOTED-STRING>
  • 当停止VRRP时触发的脚本 notify_stop <STRING>|<QUOTED-STRING>

#ka1配置
#qq邮箱配置
[root@ka1 ~]# vim /etc/mail.rc 
最后添加:
set from=1718181506@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=1718181506@qq.com
set smtp-auth-password=ranpqjqqyqcyfaeh
set smtp-auth=login
set ssl-verify=ignore

[root@ka1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='1718181506@qq.com'
mail_send()
{
        mail_subj="$HOSTNAME to be $1 vip 转移"
        mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
        echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
        master)
        mail_send master
        ;;
        backup)
        mail_send backup
        ;;
        fault)
        mail_send fault
        ;;
        *)
        ;;
esac

[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh 
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"
}
[root@ka1 ~]# systemctl restart keepalived.service 

#ka2做同样的操作

模拟ka1故障:

[root@ka1 ~]# systemctl stop keepalived.service

可以看见邮件发出消息,vip转到ka2上了

3.5 实现 master/master 的 Keepalived 双主架构

master/slave 的单主架构,同一时间只有一个 Keepalived 对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master 的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上 VIP 分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高服务器资源利用率
#ka1配置
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100       #主
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 200        #备
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
    }
}

#ka2配置
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100       #备
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       172.25.254.100/24 dev eth0 label eth0:1
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 200           #主
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       172.25.254.200/24 dev eth0 label eth0:2
    }
}

#查看vip
[root@ka1 ~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.20  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::20c:29ff:fed6:2241  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d6:22:41  txqueuelen 1000  (Ethernet)
        RX packets 23763  bytes 4231004 (4.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 33175  bytes 2655260 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.100  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:d6:22:41  txqueuelen 1000  (Ethernet)

[root@ka2 ~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.30  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::20c:29ff:fe3f:6504  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3f:65:04  txqueuelen 1000  (Ethernet)
        RX packets 26184  bytes 5594161 (5.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19282  bytes 1515181 (1.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.200  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:3f:65:04  txqueuelen 1000  (Ethernet)

3.6 实现IPVS的高可用性

3.6.1 IPVS相关配置

3.6.1.1 virtual server (虚拟服务器)的定义格式
virtual_server IP port # 定义虚拟主机 IP 地址及其端口
virtual_server fwmark int #ipvs 的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string # 使用虚拟服务器组
3.6.1.2 虚拟服务器配置
virtual_server IP port {                         #VIP和PORT
delay_loop <INT>                                 #检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh                 #定义调度方法
lb_kind NAT|DR|TUN                         #集群的类型,注意要大写
persistence_timeout <INT>                 #持久连接时长
protocol TCP|UDP|SCTP                 #指定服务协议, 一般为 TCP
sorry_server <IPADDR> <PORT>         #所有 RS 故障时,备用服务器地址
real_server <IPADDR> <PORT> {         #RS的 IP PORT
weight <INT>                                                 #RS权重
notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本
notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状态检测方法
 }
}
# 注意 : 括号必须分行写 , 两个括号写在同一行 , : }} 会出错
3.6.1.3 应用层监测

应用层检测:HTTP_GET|SSL_GET

HTTP_GET|SSL_GET {
url {
path <URL_PATH>                 #定义要监控的URL
status_code <INT>                 #判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout <INTEGER> # 客户端请求的超时时长 , 相当于 haproxy timeout server
nb_get_retry <INT>                 #重试次数
delay_before_retry <INT>         #重试之前的延迟时长
connect_ip <IP ADDRESS>         #向当前 RS 哪个 IP 地址发起健康状态检测请求
connect_port <PORT>                 #向当前RS 的哪个 PORT 发起健康状态检测请求
bindto <IP ADDRESS>                 #向当前RS 发出健康状态检测请求时使用的源地址
bind_port <PORT>                         #向当前RS发出健康状态检测请求时使用的源端口
}
3.6.1.4 TCP监测

传输层检测:TCP_CHECK

TCP_CHECK {
connect_ip <IP ADDRESS>          #向当前 RS 的哪个 IP 地址发起健康状态检测请求
connect_port <PORT>                 #向当前RS 的哪个 PORT 发起健康状态检测请求
bindto <IP ADDRESS>                 #发出健康状态检测请求时使用的源地址
bind_port <PORT>                         #发出健康状态检测请求时使用的源端口
connect_timeout <INTEGER>         #客户端请求的超时时长
                                                        #等于haproxy的timeout server
}

3.6.2 实战案例

实现单主的 LVS-DR 模式
准备 web 服务器并使用脚本绑定 VIP web 服务器 lo 网卡
#准备两台后端webserver主机
#webserver1
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo webserver1 - 172.25.254.40 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd

[root@webserver1 ~]# ip addr add 172.25.254.100/32 dev lo
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 

#webserver2
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2 - 172.25.254.50 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd

[root@webserver2 ~]# ip addr add 172.25.254.100/32 dev lo
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 

#测试
[root@client ~]# curl 172.25.254.40
webserver1 - 172.25.254.40
[root@client ~]# curl 172.25.254.50
webserver2 - 172.25.254.50
keepalived配置
#ka1
[root@ka1 ~]# yum install ipvsadm -y
........
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP

    real_server 172.25.254.40 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
    real_server 172.25.254.50 80 {
        weight 1 
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}
[root@ka1 ~]# systemctl restart keepalived.service 
#查看lvs策略
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr
  -> 172.25.254.40:80             Route   1      0          0         
  -> 172.25.254.50:80             Route   1      0          0         
TCP  10.10.10.2:1358 rr persistent 50
  -> 192.168.200.2:1358           Masq    1      0          0         
  -> 192.168.200.3:1358           Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50
  -> 192.168.200.4:1358           Masq    1      0          0         
  -> 192.168.200.5:1358           Masq    1      0          0   

#ka2
[root@ka2 ~]# yum install ipvsadm -y
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf 
#与ka1基本一样
........
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    protocol TCP
    
    real_server 172.25.254.40 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
    real_server 172.25.254.50 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}
[root@ka2 ~]# systemctl restart keepalived.service 
访问测试结果
[root@client ~]# for i in {1..6};do curl 172.25.254.100;done
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40

#第一台webserver1故障,自动切换至webserver2
[root@webserver1 ~]# systemctl stop httpd     #当webserver1故障

[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr
  -> 172.25.254.50:80             Route   1      0          3         
TCP  10.10.10.2:1358 rr persistent 50
  -> 192.168.200.200:1358         Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50

[root@client ~]# for i in {1..6};do curl 172.25.254.100;done
webserver2 - 172.25.254.50
webserver2 - 172.25.254.50
webserver2 - 172.25.254.50
webserver2 - 172.25.254.50
webserver2 - 172.25.254.50
webserver2 - 172.25.254.50

#ka1故障,自动切换至ka2
[root@ka1 ~]# systemctl stop keepalived.service
[root@ka2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr
  -> 172.25.254.50:80             Route   1      0          0         
TCP  10.10.10.2:1358 rr persistent 50
  -> 192.168.200.200:1358         Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50

3.7 实现其它应用的高可用性 VRRP Script

3.7.1 VRRP Script 配置

分两步实现:
  • 定义脚本
        vrrp_script:自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。
        通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER 节点的权重减至低于SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #此脚本返回值为非 0 时,会触发下面 OPTIONS 执行
OPTIONS
}
  • 调用脚本
track_script:调用vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的vrrp_script
track_script {
   SCRIPT_NAME_1
   SCRIPT_NAME_2
}
3.7.1.1 定义 VRRP script
vrrp_script <SCRIPT_NAME> {                        #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING>         #shell命令或脚本路径
interval <INTEGER>                                         #间隔时间,单位为秒,默认1秒
timeout <INTEGER>                                         #超时时间
weight <INTEGER:-254..254>                         #默认为0,如果设置此值为负数,
                                                                          #当上面脚本返回值为非0时
                                                 #会将此值与本节点权重相加可以降低本节点权重即表示fall.
                                                                       #如果是正数,当脚本返回值为0,
                                                                  #会将此值与本节点权重相加可以提高本节点权重
                                                                        #即表示 rise.通常使用负值
fall <INTEGER>                             #执行脚本连续几次都失败,则转换为失败,建议设为2 以上
rise <INTEGER>                         #执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME]         #执行监测脚本的用户或组
init_fail                                    #设置默认标记为失败状态,监测成功之后再转换为成功状态
}
3.7.1.2 调用 VRRP script
vrrp_instance test {
... ...
        track_script {
                check_down
        }
}
实现HAProxy高可用
#先把keepalived主配置文件中的lvs配置注释掉
#virtual_server 172.25.254.100 80 {
#    delay_loop 6    
#    lb_algo wrr
#    lb_kind DR
#    protocol TCP
#
#    real_server 172.25.254.40 80 {
#        weight 1
#        HTTP_GET {
#            url {
#              path /
#              status_code 200
#           }
#            connect_timeout 3
#            nb_get_retry 2
#            delay_before_retry 2
#        }
#    }
#    real_server 172.25.254.50 80 {
#        weight 1
#        HTTP_GET {
#            url {
#              path /
#              status_code 200
#           }
#            connect_timeout 3
#            nb_get_retry 2
#            delay_before_retry 2
#        }
#    }
#}
#在两个ka1和ka2先实现haproxy的配置
[root@ka1 ~]# yum install haproxy -y
[root@ka2 ~]# yum install haproxy -y

[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg 
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg 
#添加
listen webserver
    bind 172.25.254.100:80
    server web1 172.25.254.40:80 check
    server web2 172.25.254.50:80 check

[root@ka1 ~]# systemctl restart haproxy.service
[root@ka2 ~]# systemctl restart haproxy.service

#在两个ka1和ka2两个节点启用内核参数
[root@ka1 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf 
[root@ka1 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

[root@ka2 ~]# echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf 
[root@ka2 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

#在ka1和ka2中编写检测脚本
[root@ka1 ~]# vim /etc/keepalived/test.sh   #ka2也一样
#!/bin/bash
killall -0 haproxy

[root@ka1 ~]# chmod +x /etc/keepalived/test.sh 
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf    #ka2一样配置
vrrp_script check_haproxy {
    script "/etc/keepalived/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    track_script {
        check_haproxy
    }
}
[root@ka1 ~]# systemctl restart keepalived.service 

#测试
[root@client ~]# for i in {1..6};do curl 172.25.254.100;done
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50

#当ka1的haproxy故障时,也可以访问
[root@ka1 ~]# systemctl stop haproxy.service
[root@client ~]# for i in {1..6};do curl 172.25.254.100;done
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
webserver1 - 172.25.254.40
webserver2 - 172.25.254.50
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值