KEEPALIVED

高可用集群教程:KEEPALIVED

一. 高可用集群概述

1.1 集群类型
  1. LB(Load Balance)负载均衡

    • LVS/HAProxy/nginx:用于HTTP和流处理的上游配置。
  2. HA(High Availability)高可用集群

    • 数据库、Redis:保证数据库和Redis的高可用性。
    • SPoF(Single Point of Failure):解决单点故障的问题。
  3. HPC(High Performance Computing)高性能集群

    • 提供高性能计算能力。
1.2 系统可用性
  • SLA(Service-Level Agreement)服务等级协议
    • 服务提供商和客户之间关于服务质量、水平和性能的协议。
    • 系统可用性公式:A = MTBF / (MTBF + MTTR)
      • MTBF(Mean Time Between Failures):平均故障间隔时间
      • MTTR(Mean Time To Repair):平均修复时间
    • 可用性指标:99.9%, 99.99%, 99.999%, 99.9999%
1.3 系统故障
  • 硬件故障:设计缺陷、损耗、非人为不可抗拒因素。
  • 软件故障:设计缺陷、bug。
1.4 实现高可用
  • 提升系统高可用性的解决方案:降低MTTR。
  • 冗余机制
    • active/passive:主/备
    • active/active:双主
    • HEARTBEAT:心跳检测机制
      • active → HEARTBEAT → passive
      • active ↔ HEARTBEAT ↔ active
1.5 VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议
  • 目的:解决静态网关单点风险
  • 层级
    • 物理层:路由器、三层交换机
    • 软件层:keepalived
  • 可用性:99.95% -> 一个月停机时间约21.6分钟
1.5.1 VRRP 相关术语
  • 虚拟路由器:Virtual Router
  • 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
  • VIP:Virtual IP
  • VMAC:Virtual MAC(00-00-5e-00-01-VRID)
  • 物理路由器
    • master:主设备
    • backup:备用设备
    • priority:优先级
1.5.2 VRRP 相关技术
  • 通告:心跳、优先级等;周期性
  • 工作方式:抢占式,非抢占式
  • 安全认证
    • 无认证
    • 简单字符认证:预共享密钥
    • MD5
  • 工作模式
    • 主/备:单虚拟路由器
    • 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

二. Keepalived 部署

2.1 Keepalived 简介
  • vrrp 协议的软件实现,原生设计目的为了高可用ipvs服务。
  • 官网http://keepalived.org/
  • 功能
    • 基于vrrp协议完成地址流动
    • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
    • 为ipvs集群的各RS做健康状态检测
    • 基于脚本调用接口完成脚本中定义的功能,进而支持nginx、haproxy等服务。
2.2 Keepalived 架构
  • 官方文档
  • 用户空间核心组件
    • vrrp stack:VIP消息通告
    • checkers:监测real server
    • system call:实现vrrp协议状态转换时调用脚本的功能
    • SMTP:邮件组件
    • IPVS wrapper:生成IPVS规则
    • Netlink Reflector:网络接口
    • WatchDog:监控进程
    • 控制组件:提供keepalived.conf的解析器,完成Keepalived配置
    • IO复用器:针对网络目的而优化的线程抽象
    • 内存管理组件:为某些通用的内存管理功能(如分配、重新分配、发布等)提供访问权限。
2.3 Keepalived 环境准备
  • 各节点时间必须同步:ntp, chrony
  • 关闭防火墙及SELinux
  • 各节点之间可通过主机名互相通信:非必须
  • 建议使用/etc/hosts文件实现:非必须
  • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
2.4 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
  • 注意事项:RHEL7中可能会遇到一些bug
2.5 Keepalived 安装
[root@ka1 ~]# yum install keepalived -y
[root@ka2 ~]# yum install keepalived -y
2.6 KeepAlived 配置说明
2.6.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

三. 实例部署

以下是Keepalived的配置步骤,以便设置高可用性环境:

实验1 keepalived-实验环境配置

1. 配置虚拟机的网络接口

两个真实服务器 realserver1realserver2,IP地址分别是 172.25.254.110172.25.254.120

[root@localhost ~]# vmset.sh eth0 172.25.254.110 realserver1.timinglee.org
[root@localhost ~]# vmset.sh eth0 172.25.254.120 realserver2.timinglee.org
2. 安装HTTP服务

在两个真实服务器上安装HTTP服务:

[root@realserver1 ~]# yum install httpd -y
[root@realserver2 ~]# yum install httpd -y
3. 配置HTTP服务

realserver1realserver2 上创建测试页面:

[root@realserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@realserver2 ~]# echo 172.25.254.120 > /var/www/html/index.html

启动并启用HTTP服务:

[root@realserver1 ~]# systemctl enable --now httpd
[root@realserver2 ~]# systemctl enable --now httpd
4. 测试HTTP服务

在任意一台机器上测试HTTP服务:

[root@ka1 ~]# curl 172.25.254.110
172.25.254.110

[root@ka1 ~]# curl 172.25.254.120
172.25.254.120

实验2 配置 Keepalived 虚拟路由通讯

1. 安装 Keepalived

在两台服务器上安装 Keepalived:

[root@ka1 ~]# yum install keepalived -y
[root@ka2 ~]# yum install keepalived -y
2. 配置 Keepalived

在两台服务器上编辑 Keepalived 配置文件 /etc/keepalived/keepalived.conf

在 ka1 上的配置:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf

配置内容如下:

global_defs {
   notification_email {
        947798764@qq.com
   }
   notification_email_from keepalived@timinglee.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id kal.timinglee.org
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    preempt_delay 20
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
在 ka2 上的配置:

ka1 的配置文件复制到 ka2 上,并进行编辑:

[root@ka1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf

ka2 上编辑配置文件:

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

修改 priority 为 80:

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

3. 启动 Keepalived

在两台服务器上启用并启动 Keepalived 服务:

[root@ka1 ~]# systemctl enable --now keepalived.service
[root@ka2 ~]# systemctl enable --now keepalived.service
4.测试 验证配置

使用 tcpdump 检查 VRRP 报文:

[root@ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:05:14.142823 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:15.144164 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:16.145465 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:17.146616 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:18.147011 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:19.148189 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:20.149642 IP 172.25.25
h
5. 验证 VIP

检查虚拟 IP 地址是否正确配置:

[root@ka1 ~]# ifconfig

确保 eth0:1 接口配置了虚拟 IP 172.25.254.100

6. 测试切换

停止 ka1 上的 Keepalived 服务,查看 ka2 是否接管虚拟 IP:

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

ka2 上检查是否接管虚拟 IP:

[root@ka2 ~]# ifconfig
7. 重新启动 Keepalived

ka1 上重新启动 Keepalived 服务,确保其重新接管虚拟 IP:

[root@ka1 ~]# systemctl start keepalived.service
8. 验证 IP 通讯

ka1ka2 上分别 ping 虚拟 IP 地址:

[root@ka1 ~]# ping 172.25.254.100
[root@ka2 ~]# ping 172.25.254.100          

实验三 Keepalived日志功能

  1. 编辑 Keepalived 配置文件以启用调试模式

    编辑 /etc/sysconfig/keepalived 文件,添加 -D 选项以启用调试模式,并设置日志级别:

    [root@ka1 ~]# vim /etc/sysconfig/keepalived
    

    在文件中设置如下内容:

    KEEPALIVED_OPTIONS="-D -S 8"
    
    • -D 选项启用调试模式。
    • -S 8 选项设置日志级别。
  2. 重新启动 Keepalived 服务

    应用配置更改:

    [root@ka1 ~]# systemctl restart keepalived.service
    
  3. 配置 rsyslog 以将 Keepalived 日志分离到特定文件

    编辑 rsyslog 配置文件 /etc/rsyslog.conf,将 Keepalived 日志分离到专用的日志文件:

    [root@ka1 ~]# vim /etc/rsyslog.conf
    

    添加以下行以将 Keepalived 日志输出到 /var/log/keepalived.log 文件:

    local7.*                                                /var/log/boot.log
    local8.*                                                /var/log/keepalived.log
    
    • local7.* 用于保存引导消息到 /var/log/boot.log
    • local8.* 用于将 Keepalived 日志记录到 /var/log/keepalived.log
  4. 重新启动 rsyslog 服务

    应用 rsyslog 配置更改:

    [root@ka1 ~]# systemctl restart rsyslog.service
    
  5. 再次重新启动 Keepalived 服务

    确保所有服务都重新启动,以应用新的日志设置:

    [root@ka1 ~]# systemctl restart keepalived.service
    
  6. 验证日志文件

    检查 Keepalived 日志文件 /var/log/keepalived.log 以确认日志记录是否正常:

    [root@ka1 ~]# ll /var/log/keepalived.log     
    

Keepalived 的日志被正确记录,并且能够独立于其他日志文件进行监控和分析。

实验 四Keepalived 独立子配置文件

将 Keepalived 配置拆分为主配置文件和独立的子配置文件可以使配置更加清晰和易于管理。

1. 编辑主配置文件

主配置文件 keepalived.conf 设置了包含子配置文件的指令。编辑 /etc/keepalived/keepalived.conf 文件,添加以下内容:

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

内容如下:

include "/etc/keepalived/conf.d/*.conf"

这样,Keepalived 会包含 /etc/keepalived/conf.d/ 目录下的所有 .conf 文件作为子配置文件。

2. 创建子配置文件

接下来,创建独立的子配置文件 /etc/keepalived/conf.d/172.25.254.100.conf

[root@ka1 ~]# mkdir -p /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
    preempt_delay 20s
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
3. 重新启动 Keepalived 服务

重新启动 Keepalived 服务以应用新配置:

[root@ka1 ~]# systemctl restart keepalived.service
4. 验证配置

使用 ifconfig 命令检查虚拟 IP 地址是否配置正确:

[root@ka1 ~]# ifconfig

输出中应显示 eth0:1 接口和虚拟 IP 地址 172.25.254.100。输出如下:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 172.25.254.10  netmask 255.255.255.0  broadcast 172.25.254.255
    inet6 fe80::20c:29ff:fec3:197  prefixlen 64  scopeid 0x20<link>
    ether 00:0c:29:c3:01:97  txqueuelen 1000  (Ethernet)
    RX packets 24419  bytes 1865001 (1.7 MiB)    
    RX errors 0  dropped 0  overruns 0  frame 0    
    TX packets 17346  bytes 1484975 (1.4 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:c3:01:97  txqueuelen 1000  (Ethernet)





实验五 keepalived-非抢占模式和延迟抢占

在 Keepalived 中,抢占模式(preempt)可以配置为启用或禁用,以控制主节点是否在恢复后重新成为主节点。非抢占模式(nopreempt)意味着即使当前主节点恢复,它也不会重新成为主节点,除非当前主节点主动将其角色交给它。

1. 配置文件

以下是配置文件 /etc/keepalived/keepalived.conf 的设置示例:

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    
    virtual_router_id 100
    priority 100
    
    # 延迟抢占
    preempt_delay 20s
    # 禁用抢占
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
}
2. 配置步骤
  1. ka1ka2 上配置 Keepalived

    在两个节点上配置相同的 Keepalived 文件。

    # 在 ka1 和 ka2 上编辑配置文件
    [root@ka1 ~]# vim /etc/keepalived/keepalived.conf
    

    添加如下配置:

    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        
        virtual_router_id 100
        priority 100
        
        # 延迟抢占
        preempt_delay 20s
        # 禁用抢占
        nopreempt
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    }
    
  2. 重启 Keepalived 服务

    ka1ka2 上分别重启 Keepalived 服务以应用新的配置:

    [root@ka1 ~]# systemctl restart keepalived.service
    [root@ka2 ~]# systemctl restart keepalived.service
    
  3. 检查网络接口

    确认虚拟 IP 地址是否出现在指定的接口上。通过 ifconfig 命令检查网络接口配置:

    [root@ka2 ~]# ifconfig
    

    结果应显示虚拟 IP 地址 172.25.254.100 配置在 eth0:1 上:

    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:02:1d:df  txqueuelen 1000  (Ethernet)
    
3. 验证和测试
  1. 模拟主节点故障

    假设 ka1 是主节点,关闭 ka1 上的 Keepalived 服务:

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

    ka2 上检查虚拟 IP 地址是否接管:

    [root@ka2 ~]# ifconfig
    

    结果显示 172.25.254.100 仍然配置在 ka2 上的 eth0:1 接口上。

  2. 重新启动 ka1 上的 Keepalived 服务

    启动 ka1 上的 Keepalived 服务:

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

    由于非抢占模式的配置,ka1 不会重新抢占虚拟 IP 地址,除非 ka2 的 Keepalived 服务关闭或失败,才会将虚拟 IP 地址切换回 ka1

实验六 Keepalived 抢占延迟模式配置

在 Keepalived 中,preempt_delay 选项用于配置主节点恢复后延迟抢占的时间。通过设置此选项,可以在主节点恢复后,保持备份节点在一段时间内为主,以避免频繁的切换。

1. 配置文件

编辑 keepalived 配置文件 /etc/keepalived/keepalived.conf,去除 nopreempt,并设置 preempt_delay

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

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    
    virtual_router_id 100
    priority 100

    # 配置抢占延迟
    preempt_delay 5s
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
}

preempt_delay 设置为 5s,这意味着当主节点恢复后,它将等待 5 秒钟才会抢占虚拟 IP 地址。

2. 重启服务

ka1ka2 上重启 Keepalived 服务以应用新的配置:

[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
3. 模拟主节点故障

停止 ka1 上的 Keepalived 服务,模拟主节点故障:

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

ka2 上检查虚拟 IP 地址是否接管:

[root@ka2 ~]# ifconfig
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:c3:01:97  txqueuelen 1000  (Ethernet)

4. 验证虚拟 IP 配置

ka1 上,检查虚拟 IP 地址是否仍然配置在 eth0:1 接口上:

[root@ka1 ~]# ifconfig

如果一切配置正确,ka2 应该接管虚拟 IP 172.25.254.100。在 ka1 恢复后,由于配置了 preempt_delay 5ska1 在恢复后会等待 5 秒才会重新抢占虚拟 IP 地址。这有助于避免频繁的切换。

  • preempt_delay 设置了主节点恢复后延迟抢占的时间。
  • nopreempt 被去除,允许主节点在恢复后进行抢占。
  • 配置 preempt_delay 后,主节点在恢复后会等待指定的时间(如 5 秒)才会重新抢占虚拟 IP 地址。

实验七 Keepalived 单播模式配置

Keepalived 默认使用组播来发送 VRRP 广告,但是在某些网络环境下,组播可能不被支持或希望使用单播来减少网络流量。这时可以通过配置单播模式来解决。

配置步骤

  1. 编辑 Keepalived 配置文件

    ka1ka2 上分别编辑 Keepalived 配置文件 /etc/keepalived/keepalived.conf

    在 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
        }
        unicast_src_ip 172.25.254.10
        unicast_peer {
            172.25.254.20
        }
    }
    

    在 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
        }
        unicast_src_ip 172.25.254.20
        unicast_peer {
            172.25.254.10
        }
    }
    
  2. 重启 Keepalived 服务

    ka1ka2 上分别重启 Keepalived 服务以应用新的配置:

    [root@ka1 ~]# systemctl restart keepalived.service
    [root@ka2 ~]# systemctl restart keepalived.service
    
  3. 验证配置

    使用 tcpdump 工具在 ka1ka2 上抓包,确认 VRRP 广告是通过单播发送的。

    在 ka1 上运行

    [root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    01:44:31.139294 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
    01:44:32.139587 IP 172.25.254.10
    

    在 ka2 上运行

    [root@ka2 ~]# tcpdump -i eth0 -nn src host 172.25.254.20 and dst 172.25.254.10
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    ^Z
    
注意事项
  • 注释 vrrp_strict:如果配置文件中启用了 vrrp_strict,需要将其注释掉或移除,因为该选项在单播模式下可能会导致问题。

通过以上配置,可以将 Keepalived 的 VRRP 广告从组播模式切换到单播模式,从而适应特定网络环境的需求。

实验8 配置 Keepalived 邮件通知

为确保在 Keepalived 发生主备切换或故障时可以收到邮件通知,需要进行以下配置:

1. 安装 mailx

ka1ka2 上安装 mailx

[root@ka1 ~]# yum install mailx -y
[root@ka2 ~]# yum install mailx -y
2. 配置邮件发送设置

编辑 /etc/mail.rc 文件,配置邮箱信息:

[root@ka1 ~]# vim /etc/mail.rc
[root@ka2 ~]# vim /etc/mail.rc

添加以下内容:

set from=947798764@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=947798764@qq.com
set smtp-auth-password=osxvybhawggjbbfi
set smtp-auth=login
set ssl-verify=ignore

测试邮件发送功能:

[root@ka1 ~]# echo "test message" | mail -s "test" 947798764@qq.com
[root@ka2 ~]# echo "test message" | mail -s "test" 947798764@qq.com
3. 编写通知脚本

ka1ka2 上创建并编辑 /etc/keepalived/mail.sh 脚本:

[root@ka1 ~]# vim /etc/keepalived/mail.sh
[root@ka2 ~]# vim /etc/keepalived/mail.sh

在这里插入图片描述

添加以下内容:

#!/bin/bash

mail_dst="947798764@qq.com"

send_message() {
    mail_sub="$HOSTNAME to be $1 vip move"
    mail_msg="`date +%F\ %T`: vrrp move $HOSTNAME change $1"
    echo $mail_msg | mail -s "$mail_sub" $mail_dst
}

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

给脚本添加执行权限:

[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka2 ~]# chmod +x /etc/keepalived/mail.sh
4. 修改 Keepalived 配置文件

ka1ka2 上编辑 /etc/keepalived/keepalived.conf 文件:

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
[root@ka2 ~]# vim /etc/keepalived/keepalived.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
    }
    unicast_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"
}

注意ka2 的配置中 unicast_src_ipunicast_peer 的 IP 地址需要对应修改:

    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
5. 重启 Keepalived 服务

ka1ka2 上分别重启 Keepalived 服务:

[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
6. 测试邮件通知功能

手动触发通知脚本进行测试:

[root@ka2 ~]# /etc/keepalived/mail.sh fault

在这里插入图片描述

测试主备切换通知:

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

在这里插入图片描述

通过以上步骤,可以在 Keepalived 发生主备切换或故障时,接收到相应的邮件通知,从而及时了解集群状态。

实验九 配置 Keepalived 双主模式

在双主模式下,每个节点会同时担任不同虚拟 IP 的 MASTER 和 BACKUP 角色。这种配置可以提高高可用性和负载均衡。

1. 配置 ka1 的 Keepalived

编辑 ka1keepalived.conf 文件:

[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
    }
    unicast_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"
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 200
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
    }
    unicast_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"
}
2. 配置 ka2 的 Keepalived

编辑 ka2keepalived.conf 文件:

[root@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
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"
}

vrrp_instance VI_2 {
    state MASTER
    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
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"
}
3. 重启 Keepalived 服务

ka1ka2 上分别重启 Keepalived 服务:

[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
4. 测试配置

ka1ka2 上检查网络接口配置:

[root@ka1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.254.10  netmask 255.255.255.0  broadcast 172.25.254.255
        inet6 fe80::20c:29ff:fec3:197  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c3:01:97  txqueuelen 1000  (Ethernet)
        RX packets 2733  bytes 206335 (201.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3152  bytes 253723 (247.7 KiB)
        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:c3:01:97  txqueuelen 1000  (Ethernet)

[root@ka2 ~]# 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:fe02:1ddf  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:02:1d:df  txqueuelen 1000  (Ethernet)
        RX packets 2467  bytes 183336 (179.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2983  bytes 230760 (225.3 KiB)
        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:02:1d:df  txqueuelen 1000  (Ethernet)

你应该能够看到以下输出:

  • ka1eth0:1 接口拥有 172.25.254.100 的 IP 地址。
  • ka2eth0:2 接口拥有 172.25.254.200 的 IP 地址。

验证主备切换:

  • 停止 ka1 上的 Keepalived 服务,看是否 172.25.254.100 的 IP 地址会转移到 ka2 上。
  • 停止 ka2 上的 Keepalived 服务,看是否 172.25.254.200 的 IP 地址会转移到 ka1 上。
[root@ka1 ~]# systemctl stop keepalived.service
[root@ka2 ~]# systemctl stop keepalived.service

这样,双主模式的 Keepalived 配置就完成了,你应该能够在 ka1ka2 之间实现虚拟 IP 的高可用性和负载均衡。

实验十 keepalived-ipvs 配置

配置真实服务器的回环接口

首先,在真实服务器上配置回环接口的 IP 地址:

[root@realserver1 ~]# ip addr add 172.25.254.100/32 dev lo

然后,编辑 ifcfg-lo 配置文件:

[root@realserver1 ~]# cd /etc/sysconfig/network-scripts/
[root@realserver1 network-scripts]# vim ifcfg-lo

ifcfg-lo 文件中添加以下内容:

DEVICE=lo   
IPADDR0=127.0.0.1
NETMASK0=255.0.0.0
IPADDR1=172.25.254.100
NETMASK1=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

重载网络连接并重启网络服务:

[root@realserver1 network-scripts]# nmcli connection reload 
[root@realserver1 network-scripts]# systemctl restart network

配置路由转发

在真实服务器上配置 ARP 相关参数:

[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf

arp.conf 文件中添加以下内容:

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

应用配置并复制到其他服务器:

[root@realserver2 ~]# sysctl --system
[root@realserver2 ~]# scp /etc/sysctl.d/arp.conf root@172.25.254.110:/etc/sysctl.d/arp.conf
[root@realserver1 ~]# sysctl --system

安装和配置 Keepalived

安装 ipvsadm

[root@ka1 ~]# yum install ipvsadm -y

编辑 keepalived 配置文件:

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

keepalived.conf 文件中添加以下内容:

#include "/etc/keepalived/conf.d/*.conf"
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 172.25.254.110 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.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

重启 keepalived 服务:

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

对另一台服务器重复安装和配置步骤:

[root@ka2 ~]# yum install ipvsadm -y
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf

virtual_server 172.25.254.10 80 {
    delay_loop 6
    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 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

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

测试配置

使用 ipvsadm 查看虚拟服务器配置:

[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.110:80            Route   1      0          0         
  -> 172.25.254.120:80            Route   1      0          0

测试负载均衡功能:

C:\Users\94779>curl 172.25.254.100
RS1 - 172.25.254.110

C:\Users\94779>curl 172.25.254.100
RS1 - 172.25.254.120

实验11 实战案例:利用脚本实现主从角色切换

通过以下步骤,我们可以使用Keepalived和自定义脚本实现主从角色切换,并动态调整虚拟IP的主备状态。

步骤1:编写检测脚本

在主服务器 ka1 上创建检测脚本 test.sh

[root@ka1 ~]# vim /etc/keepalived/test.sh

脚本内容如下:

#!/bin/bash
[ ! -f /mnt/lee ]

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

[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
步骤2:测试脚本

测试脚本是否能正常工作:

[root@ka1 keepalived]# sh /etc/keepalived/test.sh
[root@ka1 keepalived]# echo $?
0

当文件 /mnt/lee 不存在时,脚本返回 0。

创建文件 /mnt/lee,再测试一次:

[root@ka1 keepalived]# touch /mnt/lee
[root@ka1 keepalived]# sh /etc/keepalived/test.sh
[root@ka1 keepalived]# echo $?
1

当文件 /mnt/lee 存在时,脚本返回 1。

步骤3:配置Keepalived

编辑Keepalived配置文件:

[root@ka1 keepalived]# vim /etc/keepalived/keepalived.conf

在配置文件中加入检测脚本配置:

vrrp_script check_file {
    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 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        172.25.254.10
    }
    track_script {
        check_file
    }
}
步骤4:重启Keepalived服务

重启Keepalived服务以应用配置:

[root@ka1 keepalived]# systemctl restart keepalived.service
步骤5:验证配置

删除文件 /mnt/lee 并重启Keepalived服务,检查虚拟IP配置:

[root@ka1 keepalived]# rm -rf /mnt/lee
[root@ka1 keepalived]# systemctl restart keepalived.service
[root@ka1 keepalived]# ifconfig

输出应显示 eth0:1 接口和虚拟IP 172.25.254.10

创建文件 /mnt/lee 再次检查:

[root@ka1 keepalived]# touch /mnt/lee
[root@ka1 keepalived]# ifconfig

此时应不再显示 eth0:1 接口,说明主从角色切换成功,虚拟IP已转移到备服务器。

步骤6:验证主从切换

执行以下命令以查看IPVSADM状态:

[root@ka1 keepalived]# ipvsadm -Ln

实验12 实现 HAProxy 高可用

实现一个高可用的负载均衡系统,使用 KeepalivedHAProxy。用于确保在某个节点出现故障时,系统仍能正常运行。下

1. 配置 Web 服务器

在 realserver1 上:
  1. 修改 IP 地址:

    nmcli connection modify eth0 ipv4.address 172.25.254.110/24
    nmcli connection up eth0
    
  2. 安装和启动 HTTP 服务:

    yum install -y httpd
    systemctl restart httpd
    
  3. 重定向 Web 服务内容:

    echo realserver1 -172.25.254.110 > /var/www/html/index.html
    
  4. 重启 HTTP 服务:

    systemctl restart httpd
    
在 realserver2 上:
  1. 修改 IP 地址:

    nmcli connection modify eth0 ipv4.address 172.25.254.120/24
    nmcli connection up eth0
    
  2. 安装和启动 HTTP 服务:

    yum install -y httpd
    systemctl restart httpd
    
  3. 重定向 Web 服务内容:

    echo realserver2 -172.25.254.120 > /var/www/html/index.html
    
  4. 重启 HTTP 服务:

    systemctl restart httpd
    

2. 配置 Keepalived 和 HAProxy

在 ka1 上:
  1. 安装 Keepalived:

    yum install -y keepalived
    
  2. 启动 Keepalived:

    systemctl restart keepalived.service
    
  3. 修改配置文件:

    编辑 /etc/sysctl.conf 文件,添加:

    net.ipv4.ip_nonlocal_bind=1
    

    使配置生效:

    sysctl -p
    
  4. 编写判断 HAProxy 是否运行的脚本:

    编辑 /etc/keepalived/test.sh 文件:

    #!/bin/bash
    killall -0 haproxy
    
  5. 添加脚本执行权限:

    chmod +x /etc/keepalived/test.sh
    
  6. 配置 Keepalived 主配置文件:

    编辑 /etc/keepalived/keepalived.conf 文件:

    global_defs {
       notification_email {
          11111111@qq.com
       }
       notification_email_from keepalived@lm.org
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id ka1.lm.org
       vrrp_skip_check_adv_addr
       vrrp_garp_interval 0
       vrrp_gna_interval 0
       vrrp_mcast_group4 224.0.0.18
    }
    
    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
        }
        unicast_src_ip 172.25.254.10
        unicast_peer {
            172.25.254.20
        }
        track_script {
            check_haproxy
        }
    }
    
  7. 重启 Keepalived 服务:

    systemctl restart keepalived
    
  8. 安装 HAProxy:

    yum install -y haproxy
    
  9. 配置 HAProxy 主配置文件:

    编辑 /etc/haproxy/haproxy.cfg 文件,添加:

    listen webcluster
        bind 172.25.254.100:80
        mode http
        balance roundrobin
        server web1 172.25.254.110:80 check inter 2 fall 3 rise 5
        server web2 172.25.254.120:80 check inter 2 fall 3 rise 5
    
  10. 重启 HAProxy 服务:

    systemctl restart haproxy
    
在 ka2 上:
  1. 安装 Keepalived:

    yum install -y keepalived
    
  2. 启动 Keepalived:

    systemctl restart keepalived.service
    
  3. 修改配置文件:

    编辑 /etc/sysctl.conf 文件,添加:

    net.ipv4.ip_nonlocal_bind=1
    

    使配置生效:

    sysctl -p
    
  4. 编写判断 HAProxy 是否运行的脚本:

    编辑 /etc/keepalived/test.sh 文件:

    #!/bin/bash
    killall -0 haproxy
    
  5. 添加脚本执行权限:

    chmod +x /etc/keepalived/test.sh
    
  6. 配置 Keepalived 主配置文件:

    编辑 /etc/keepalived/keepalived.conf 文件:

    global_defs {
       notification_email {
          13579@qq.com
       }
       notification_email_from keepalived@lm.org
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id ka2.lm.org
       vrrp_skip_check_adv_addr
       vrrp_garp_interval 0
       vrrp_gna_interval 0
       vrrp_mcast_group4 224.0.0.18
    }
    
    vrrp_script check_haproxy {
        script "/etc/keepalived/test.sh"
        interval 1
        weight -30
        fall 2
        rise 2
        timeout 2
    }
    
    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
        }
        unicast_src_ip 172.25.254.20
        unicast_peer {
            172.25.254.10
        }
        track_script {
            check_haproxy
        }
    }
    
  7. 重启 Keepalived 服务:

    systemctl restart keepalived
    
  8. 安装 HAProxy:

    yum install -y haproxy
    
  9. 配置 HAProxy 主配置文件:

    编辑 /etc/haproxy/haproxy.cfg 文件,添加:

    listen webcluster
        bind 172.25.254.100:80
        mode http
        balance roundrobin
        server web1 172.25.254.110:80 check inter 2 fall 3 rise 5
        server web2 172.25.254.120:80 check inter 2 fall 3 rise 5
    
  10. 重启 HAProxy 服务:

    systemctl restart haproxy
    

测试

  1. 在 ka1 上停止 HAProxy 服务,检查 VIP 的漂移情况:

    systemctl stop haproxy
    
  2. 在 ka1 和 ka2 上查看 ifconfig,确认 VIP 是否漂移到 ka2 上。

  3. 重新启动 ka1 上的 HAProxy 服务,确保它重新接管 VIP:

    systemctl restart haproxy
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值