一文带你解决 Keepalived 所有疑问

1. VRRP协议

虚拟路由冗余协议:VRRP(Virtual Router Redundancy Protocol),解决静态网关单点风险
其特点和优势如下:

  • 高可用性
    • 确保网络在主网关失效的情况下,能够迅速切换到备份网关,最大程度减少网络中断时间,提高业务的连续性
  • 负载分担
    • 支持将流量在多个网关之间进行分担,提高网络资源的利用率
  • 简单配置
    • 配置相对简单,降低了网络管理的复杂性和成本
  • 透明性
    • 对于终端用户和上层协议来说,网关的切换是透明的,无需用户干预或修改配置

1.1 相关术语

  • 虚拟路由器(Virtual Router)
  • 虚拟路由器标识:唯一标识虚拟路由器VRID(0-255)
  • VIP:Virtual IP
  • VMAC
  • 物理路由器
    • 主设备(MASTER)
    • 备用设备(BACKUP)
    • 优先级(priority)

1.2 相关技术

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

2. Keepalived

2.1 Keepalived 介绍

Keepalived 是一个用于实现服务器高可用的开源软件

它的主要功能包括:

  • 实现虚拟 IP(VIP)的漂移

    • 当主服务器出现故障时,自动将 VIP 切换到备份服务器,确保服务的连续性
  • 监控服务器状态

    • 通过各种方式(如 TCP 连接、HTTP 请求等)监测后端服务器的运行状况
  • 与其他高可用技术集成

    • 例如与 LVS(Linux Virtual Server)、Haproxy等结合,提供更强大的负载均衡和高可用解决方案

在这里插入图片描述

  • IO复用器(I/O Multiplexer)

    • 针对网络目的而优化的自己的线程抽象
  • 内存管理(Memory Management)

    • 为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
  • 控制组件(Control components)

    • 提供Keepalived.conf的解析器,完成Keepalived配置
  • 用户空间核心组件(Core components of user space)

    • WatchDog:监控进程
    • System call:实现 VRRP 协议状态转换时调用脚本的功能
    • SMTP:邮件组件
    • Checkers:监测后端服务器
    • VRRP Stack:VIP消息通告
    • IPVS wrapper:生成IPVS规则
    • Netlink Reflector:网络接口

2.2 Keepalived 相关文件

路径说明
keepalived软件包名
/usr/sbin/keepalived主程序文件
/etc/keepalived/keepalived.conf主配置文件
/usr/share/doc/keepalived/配置文件示例
/lib/systemd/system/keepalived.serviceUnit File
/etc/sysconfig/keepalivedUnit File的环境配置文件
  • RHEL7中的可能出现的BUG
    • systemctl restart keepalived # 新配置可能无法生效
    • systemctl stop keepalived # 无法停止进程,需要kill停止

2.3 Keepalived 主配置文件说明

/etc/keepalived/keepalived.conf 主配置文件

2.3.1 组成
  • 全局配置(GLOBAL CONFIGURATION)

    • global_defs
      • 邮件配置(notification_email、notification_email_from)
      • router_id
      • VRRP配置(vrrp_skip_check_adv_addr、vrrp_strict、 vrrp_garp_interval、 vrrp_gna_interval)
      • 多播地址(vrrp_mcast_group)
  • VRRP配置(VRRP CONFIGURATION)

    • vrrp_instance xxx:定义每一个VRRP虚拟路由器
  • LVS配置(LVS CONFIGURATION)

    • virtual_server:定义LVS中的RS(真实服务器)和VS(虚拟服务器)
    • Virtual server group(s)
2.3.2 全局配置
global_defs {
   notification_email {	# Keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个(需要配置SMTP服务器)
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc	# 发邮件的地址
   smtp_server 192.168.200.1	# 邮件服务器IP地址
   smtp_connect_timeout 30	# 邮件服务器连接超时时间
   router_id LVS_DEVEL	# 每个Keepalive主机唯一标识,建议使用当前主机名,多节点重名不影响
   vrrp_skip_check_adv_addr	# 对每个通告报文都进行检查;如果收到的通告报文和上一个通告报文是同一个路由器,则跳过检查,默认为全检查;启用后对性能消耗较大
   vrrp_strict	# 严格遵守VRRP协议;启用时,以下配置将无法正常使用(无VIP地址、配置单播邻居、在VRRP版本2中配置有IPV6地址);不建议启用此配置
   vrrp_garp_interval 0	# 报文发送延迟,0表示不延迟
   vrrp_gna_interval 0	# 消息发送延迟
   vrrp_mcast_group 224.0.0.18	# 指定组播IP地址范围;默认组播地址 224.0.0.18 ;若需要更改,则要手动配置
}
2.3.3 VRRP配置
vrrp_instance VI_1 {
    state MASTER	# Keepalive主机状态;MASTER:主服务器,BACKUP:备用服务器;仅对下方的VIP生效
    interface eth0	# 绑定当前虚拟路由器使用的物理接口;可以和VIP不在同一个网卡上
    virtual_router_id 51	# 每个虚拟路由器唯一标识(0-255);每个虚拟路由器标识必须唯一,否则服务无法启动;同属于一个虚拟路由器(VIP)的多个Keepalive节点必须相同;必须要确认在同一网络中,标识是唯一的
    priority 100	# 当前物理节点在虚拟路由器上的优先级(1-254)
    advert_int 1	# VRRP通告的时间间隔,默认1s
    authentication {	# 认证机制
        auth_type PASS	# PASS为简单密码(建议使用);AH为IPSEC认证(不推荐)
        auth_pass 1111	# 预共享密钥,仅前八位有效;同一个虚拟路由器的多个Keepalive节点需要保持一致
    }
    virtual_ipaddress {	# 虚拟IP,可以按行区分写多个
        192.168.200.16
        192.168.200.17
        192.168.200.18
        <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>	# 格式
        # <IPADDR>:VIP	<MASK>:子网掩码(/24格式);不进行指定时,默认/32
        # brd <IPADDR>:VIP进行广播的地址
        # dev <STRING>:VIP绑定的网络设备;不指定时,默认eth0
        # scope <SCOPE>:网络的作用范围(global、link)
        # label <LABEL>:为网络接口设置的标签;标识和区分不同的网络接口配置
    }
}

2.4 初试 Keepalived 技术

2.4.1 配置环境
必做非必做
关闭防火墙、SELinux各节点之间可以通过主机名互相通信
各个节点时间同步(保证虚拟机时间同步即可)使用/etc/hosts文件实现
各节点之间的Root用户可以基于密钥认证的SSH服务完成互相通信

在这里插入图片描述

  • Keepalived主机:将简称为KA1或KA2
  • Real servers后端服务器:将简称为RS1或RS2

KA1和KA2之间进行通告,确保保证状态正常,故障时迅速切换身份,保证业务的正常运行

KA1或KA2将客户端访问VIP的流量,分配给后端服务器RS1和RS2,再根据使用的技术决定RS如何处理流量

2.4.2 配置

基于Red Hat Linux Server 7.9 进行配置

KA1

[root@ka1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.10
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATRWAY1=172.25.254.2

yum install keepalived -y
vim /etc/keepalived/keepalived.conf	# 在自带的VI_1基础上配置
################################################# 18
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	# 添加标记,与eth0,进行区分
    }
}
################################################# 33
systemctl enable --now keepalived.service

KA2

[root@ka2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.20
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATEWAY1=172.25.254.2

yum install keepalived -y
vim /etc/keepalived/keepalived.conf	# 在自带的VI_1基础上配置
################################################# 18
vrrp_instance VI_1 {
    state BACKUP	# 备用服务器
    interface eth0
    virtual_router_id 100	# 同属于一个虚拟路由器(VIP)的多个Keepalive节点保持相同
    priority 80	# 优先级低于主服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
################################################# 33
systemctl enable --now keepalived.service

RS1

[root@rs1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.110
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATRWAY1=172.25.254.2

yum install httpd -y
echo 172.25.254.110 > /var/www/html/index.html
systemctl enable --now httpd

RS2

[root@rs2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR1=172.25.254.120
PREFIX=24
NETMASK1=255.255.255.0
DNS1=114.114.114.114
GATEWAY1=172.25.254.2

yum install httpd -y
echo 172.25.254.120 > /var/www/html/index.html
systemctl enable --now httpd

测试

此时VIP处于KA1上

在这里插入图片描述

[root@ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18	# 监控 224.0.0.18 广播地址
[root@rs1 ~]# ssh root@172.25.254.10
[root@ka1 ~]# systemctl stop keepalived.service	# 通过SSH停止KA1的keepalived服务
[root@ka1 ~]# systemctl restart keepalived.service	# 重启KA1的keepalived服务,此时VIP应在KA1身上

在这里插入图片描述

当KA1故障后,KA2迅速接过VIP,维持服务正常进行

在这里插入图片描述

配置时可能出现的问题:

  • 两个节点都有VIP
    • 可能由防火墙没关闭导致
  • 无法使用VRRP协议
    • 可能由SELinux没关闭导致

2.5 启用 Keepalived 日志功能

将Keepalived 日志分离出来,方便查看、排错、优化等

2.5.1 配置
# 可以两个节点的日志都进行分离
vim /etc/sysconfig/keepalived
# -D:详细记录日志	-S:设置本地系统日志级别(0-7)
KEEPALIVED_OPTIONS="-D -S 6"

vim /etc/rsyslog.conf	
# 74
local6.*                                                /var/log/keepalived.log

systemctl restart rsyslog.service
systemctl restart keepalived.service

可以观察到有日志生成

在这里插入图片描述

2.6 实现 Keepalived 独立子配置文件

在实际生产中,不同的集群的配置是单独放在子配置文件中的

过多不同集群的配置,集中在主配置文件中,显得十分杂乱,不易于管理

2.6.1 配置

KA

vim /etc/keepalived/keepalived.conf
include /etc/keepalived/conf.d/*.conf	# 关键命令	后跟子配置文件的路径

mkdir -p /etc/keepalived/conf.d	# 创建子配置文件目录
vim /etc/keepalived/conf.d/VI_1.conf	# 将 vrrp_instance VI_1 配置 转移
#################################################
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
    }
}
#################################################
systemctl restart keepalived.service

测试

KA1停止服务后,VIP消失

在这里插入图片描述

观察KA2,发现VIP漂移

在这里插入图片描述

重新开启KA1的服务,发现VIP回归,说明子配置文件生效

在这里插入图片描述

验证后完,请将删掉子配置目录及配置命令,保证后续实战内容的纯净实验环境

3. Keepalived 企业应用

3.1 实现Keepalived 单主架构

即 初试 Keepalived 技术的配置

3.2 抢占模式 与 非抢占模式

  • 抢占模式——preempt
  • 非抢占模式——nopreempt
    • 延迟抢占模式——(Preempt_Delay)

Keepalived 默认 抢占模式,即当高优先级的主机恢复在线后,会抢占低先级的主机的VIP

这样会使 VIP 在 Keepalived 主机中来回漂移,造成网络抖动

非抢占模式 :即高优先级主机恢复后,不会抢占低优先级主机的VIP

非抢占模式下,如果高优先级原主机宕机,VIP漂移到低优先级主机,若低优先级主机也宕机时,仍会将VIP迁移回高优先级主机(此时已经恢复服务),假如Keepalived 主机均宕机,则VIP 消失

  • 配置要点
    • 各个节点必须互为BACKUP

KA1

vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP	# 互为BACKUP
    nopreempt	# 关键配置命令
    interface eth0
    ...

KA2

vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP	# 互为BACKUP
    nopreempt
    interface eth0
    ...

测试

当前VIP在KA1上

在这里插入图片描述

[root@ka2 ~]# systemctl restart keepalived.service	# KA2先重启服务
[root@ka1 ~]# systemctl restart keepalived.service	# KA1后重启服务
# 由于KA1在重启服务过程中,关闭服务,KA2认为KA1故障,将VIP抢过来

可以发现VIP已经漂移到KA2上,即使KA1已经重启完服务,VIP也不会被抢过去

在这里插入图片描述

3.2.1 延迟抢占模式(Preempt_Delay)

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是等待一段时间(默认300s)再抢回 VIP

preempt_delay	# 指定抢占延迟时间为 xxx s,默认延迟300s
  • 各节点互为BACKUP,且不能启用 vrrp_strict 参数
  • 配置前提:已配置非抢占模式
配置

KA1

vim /etc/keepalived/keepalived.conf
global_defs {
   ....
   vrrp_skip_check_adv_addr
   # vrrp_strict	# 不启用此参数
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt	# 配置前提
    preempt_dalay 10s	# 关键配置命令
    interface eth0
    ...

KA2

vim /etc/keepalived/keepalived.conf
global_defs {
   ....
   vrrp_skip_check_adv_addr
   # vrrp_strict	# 不启用此参数
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    preempt_dalay 10s
    interface eth0
    ...

测试

重启服务后,VIP在KA1上

在这里插入图片描述

[root@ka1 ~]# systemctl stop keepalived.service	# 关闭服务后,VIP在KA2上

在这里插入图片描述

[root@kaserver1 ~]# systemctl restart keepalived.service	# 重启服务后,在KA2上一直刷新,一段时间后,KA2上的VIP消失

在这里插入图片描述

3.3 VIP单播配置

默认Keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量

  • 进行单播时,不能启用 vrrp_strict 参数
3.3.1 配置

KA1

vim /etc/keepalived/keepalived.conf
global_defs {
   ....
   vrrp_skip_check_adv_addr
   # vrrp_strict	# 不启用此参数
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    ....
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    inicast_src_ip 172.25.254.10	# 源IP
    unicast_peer {
    172.25.254.20	# 对端IP,多个 keepalived 主机,分多行书写
    }
}
systemctl restart keepalived.service

KA2

vim /etc/keepalived/keepalived.conf
global_defs {
   ....
   vrrp_skip_check_adv_addr
   # vrrp_strict	# 不启用此参数
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    ....
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    inicast_src_ip 172.25.254.20	# 源IP
    unicast_peer {
    172.25.254.10	# 对端IP,多个 keepalived 主机,分多行书写
    }
}
systemctl restart keepalived.service

测试

未修改前,KA1发送组播信息

在这里插入图片描述

KA1不发送组播信息,采用单播方式发送给对端172.25.254.20

在这里插入图片描述

[root@ka1 ~]# systemctl stop keepalived.service	# 暂停keepalived 服务

KA2同样如此

在这里插入图片描述

3.4 Keepalived 通知脚本配置

3.4.1 授权邮件发送

由QQ邮箱的 账号与安全 中的安全设置 生成授权码

在这里插入图片描述

[root@ka1 ~]# yum install mailx -y
[root@ka1 ~]# vim /etc/mail.rc	# 配置邮箱信息,在最后添加
set from=xxxxxx@qq.com	# 你的邮箱地址
set smtp=smtp.qq.com
set smtp-auth-user=xxxxxx@qq.com	# 你的邮箱地址
set smtp-auth-password=dleajewhexxxacha	# 邮箱的授权码
set smtp-auth=login
set ssl-verify=ignore
 
[root@ka1 ~]# echo test message | mail -s test xxxxxx@qq.com	# 发送测试邮件,有可能会在邮箱的垃圾箱中
# 假如不能 ping www.baidu.com 则邮件发送是失败的,即便能在垃圾箱中收到(请检查网关信息等)
3.4.2 邮件通知 Keepalived 状态变化
通知脚本类型

<QUOTED-STRING> 表示被引号括起来的字符串,这样能更精确地指定字符串的内容,特别是包含特殊字符时

  • 当前节点成为主节点时触发
    • 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>
3.4.3 Keepalived 脚本配置
[root@ka1 ~]# vim /etc/keepalived/mail.sh	# 编写邮件通知脚本
#!/bin/bash
mail_dst="xxxxxx@qq.com"	# 邮件接收的邮箱地址
send_message()
{
        mail_sub="$HOSTNAME to be $1 vip move"	# 邮件标题
        mail_msg="`date +%F\ %T`: vrrp move $HOMENAME change $1"	# 邮件内容
        echo $mail_msg | mail -s "$mail_sub" $mail_dst	# 发送邮件
}

case $1 in
        master)
        send_message master	
        ;;
        backup)
        send_message master
        ;;
        fault)
        send_message fault
        ;;
        *)
        ;;
esac

chmod +x /etc/keepalived/mail.sh	# 给脚本增加执行权限
/etc/keepalived/mail.sh master	# 测试脚本是否可用,注意接收邮件

vim /etc/keepalived/keepalived.conf	# 修改配置文件
vrrp_instance VI_1 {
    ...
    inicast_src_ip 172.25.254.10
    unicast_peer {
    172.25.254.20
    }
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"
}

systemctl restart keepalived.service	# 重启服务,并观察是否收到邮件

在这里插入图片描述

3.5 实现Keepalived 双主架构

传统 Master/Slave 的单主架构,同一时间只有一个Keepalived 主机对外提供服务,Master 主机繁忙,而Slave 主机在偷闲摸鱼 ,利用率低下

故此,采用Master/Master的双主架构,解决Slave 主机摸鱼问题

原理:将两个或两个以上VIP分别运行在不同的Keepalived 主机,以实现主机并行提供Web访问的目的,提高服务器资源利用率

3.5.1 配置

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 80	# 多个Keepalive 节点,唯一标识必须相同
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2	# VIP 200 标签eth0:2 与VIP 100 相区分
    }
}
#################################################
systemctl restart keepalived.service

KA2

vim /etc/keepalived/keepalived.conf
#################################################
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    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 MASTER
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
    }
}
#################################################
systemctl restart keepalived.service

测试

KA1 和 KA2 均有对应VIP

在这里插入图片描述

在这里插入图片描述

KA1 \ KA2 主机停止服务后,VIP 100 \ 200 正常漂移

在这里插入图片描述

在这里插入图片描述

3.6 实现 IPVS 高可用架构

3.6.1 虚拟服务器(IPVS)定义格式
参数说明
virtual_server IP port定义VIP 和 端口
virtual_server fwmark intIPVS的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string使用虚拟服务器组
3.6.2 虚拟服务器(IPVS)配置
virtual_server IP port {	# VIP和端口
    delay_loop <INT>	# 检查RS的时间间隔
    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.3 应用层监测
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.4 TCP监测
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.5 单主的 LVS-DR 模式
配置

KA

yum install ipvsadm -y
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
    }
}
virtual_server 172.25.254.100 80 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    protocol TCP

    real_server 172.25.254.110 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 2
            }
        }
    real_server 172.25.254.120 80 {
        weight 1
        HTTP_GET {
                url {
                path /
                status_code 200
            }
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 2
            }
        }
}
systemctl restart keepalived.service

ipvsadm -Ln	# 多出来的策略是keepalived 配置文件中的
# 出现以下内容,则keepalived配置正确,否则检查keepalived的缩进是否正确;SELinux、防火墙是否关闭
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr
  -> 172.25.254.110:80            Route   1      0          0
  -> 172.25.254.120:80            Route   1      0          0

KA2的 virtual_server 172.25.254.100 80 {…} 与KA1配置一样,仅需要注意KA2是BACKUP身份

RS

vim /etc/sysctl.d/arp.conf	# RS均关闭ARP应答功能
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
sysctl --system	# 查看ARP信息,注意查看倒数5行

vim /etc/sysconfig/network-scripts/ifcfg-lo	# RS均配置VIP
DEVICE=lo
IPADDR1=127.0.0.1
NETMASK1=255.0.0.0
IPADDR2=172.25.254.100	# VIP
NETMASK2=255.255.255.255	# 掩码:32
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
# 同一集群的RS配置相同
systemctl restart network

测试

两个后端服务器均配置上VIP 100

在这里插入图片描述

在这里插入图片描述

两个Keepalived 主机均存在LVS 策略

在这里插入图片描述

在这里插入图片描述

流量均能正常访问

在这里插入图片描述

停止KA1 服务,VIP 100 漂移到KA2 上,访问没有被中断,断开瞬间有些卡顿,这与配置的参数有关

在这里插入图片描述

3.7 实现HAProxy 高可用架构

3.7.1 VRRP Script 配置

分两个步骤实现

  • 定义脚本

Vrrp_Script:自定义资源监控脚本,通常用于监控指定应用的状态

一旦发现应用的状态异常,则对MASTER节点的优先级 减至低于 BACKUP节点,从而实现 VIP 切换到BACKUP 节点

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
}
定义VRRP script
vrrp_script <SCRIPT_NAME> {	# 定义一个检测脚本,在global_defs 之外配置
	script <STRING>|<QUOTED-STRING>	# shell命令或脚本路径
	interval <INTEGER>	# 执行间隔时间,单位为秒,默认1秒
	timeout <INTEGER>	# 超时时间
	weight <INTEGER:-254..254>	# 默认为0,如果设置负数,此值与节点优先级相加,减低节点优先级(fall);如果设置正数,两值相加,增加节点优先级(rise)

	fall <INTEGER>	# 执行脚本连续几次都失败,则转换为失败,建议设为2以上
	rise <INTEGER>	# 执行脚本连续几次都成功,把服务器从失败标记为成功
	user USERNAME [GROUPNAME]	# 执行监测脚本的用户或组
	init_fail	# 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
调用VRRP script
vrrp_script <SCRIPT_NAME> {
	...	# 脚本定义内容,必须放在调用脚本前面
	...	# VRRP定义内容
	track_script {
		<SCRIPT_NAME>	# 调用时,不需要加.sh
	}
}
3.7.2 利用脚本实现主从角色切换

配置

[root@ka1 ~]# vim /mnt/test.sh
#!/bin/bash
[-f "/mnt/lee" ]	# 复制时,可能变成中文的感叹号
chmod +x /mnt/test.sh

vim /etc/keepalived/keepalived.conf
#################################################
vrrp_script check_test {
    script "/mnt/check_test.sh"
    interval 1
    weight -30
    fall 2
    fise 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_test
    }
}
#################################################

touch /mnt/haha
tail -f /var/log/messages

测试

当存在/mnt/haha文件,脚本运行,返回非0值,执行脚本语句,降低当前keepalived 主机的优先级,VIP漂移

在这里插入图片描述

在这里插入图片描述

3.7.3 HAProxy 与 Keepalived 实现高可用

为防止 当前持有VIP的Keepalived 主机的HAProxy 服务挂掉后

不能及时将VIP漂移到其他正常运行HAProxy 服务的Keepalived 主机(假如Keepalived 服务挂掉,VIP会自然漂移到其他Keepalived 主机上)

原理:利用脚本检测HAProxy 服务的状态,当HAProxy 服务挂掉后,使得当前Keepalived 主机的优先级发生改变而使VIP漂移

配置
yum install psmisc -y	# 安装killall命令
mkdir -p /etc/keepalived/scripts
vim /etc/keepalived/scripts/haproxy.sh	# 编写脚本检测haproxy 服务的状态
#!/bin/bash
/usr/bin/killall -0 haproxy
chmod +x /etc/keepalived/scripts/haproxy.sh	# 赋予脚本执行权限

vim /etc/keepalived/keepalived.conf
#################################################
vrrp_script check_haproxy {
    script "/etc/keepalived/scripts/haproxy.sh"
    interval 1
    weight -30	# 表示原先的优先级需要减去的数值,最终结果要比其他keepalived 主机低,否则VIP不转移
    fall 2
    fise 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	# 脚本的名称
    }
}
#################################################

echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf	# 开启内核参数
cat /etc/sysctl.conf	# 查看一下内容是否被追加
yum install haproxy.x86_64 -y	# 安装haproxy
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
listen webserver
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.110:80 check
    server web2 172.25.254.120:80 check

systemctl restart keepalived.service
systemctl restart haproxy.service
yum remove ipvsadm -y	# LVS会影响结果

KA2

vim /etc/keepalived/keepalived.conf
#################################################
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
#################################################

echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf	# 开启内核参数
cat /etc/sysctl.conf	# 查看一下内容是否被追加
yum install haproxy.x86_64 -y	# 安装haproxy
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
listen webserver
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.110:80 check
    server web2 172.25.254.120:80 check

systemctl restart keepalived.service
systemctl restart haproxy.service
yum remove ipvsadm -y	# LVS会影响结果

RS

vim /etc/sysctl.d/arp.conf	# RS均开启ARP应答功能
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
sysctl --system	# 查看ARP信息,注意查看倒数5行

vim /etc/sysconfig/network-scripts/ifcfg-lo	# RS均不配置VIP
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
# 同一集群RS均要开启ARP应答功能 和 不配置VIP
  • 停止haproxy服务后,VIP未发生改变,可能keepalived 和 脚本的配置有问题
  • 停止keepalived服务后,VIP正常飘移,但不能访问后端服务器,可能haproxy 配置有问题

测试

用户正常访问

在这里插入图片描述

在用户访问过程中,停止KA1的haproxy服务,发现不影响用户的访问,且VIP处于KA2上

在这里插入图片描述

在这里插入图片描述

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值