Keepalived-高可用集群

目录 1.高可用集群 1.1 集群类型 1.2 系统可用性 1.3 系统故障 1.4 高可用实现 1.5 VRRP:Virtual Router Redundancy Protocol 1.5.1 VRRP

目录

1.高可用集群

1.1 集群类型

1.2 系统可用性

1.3 系统故障

1.4 高可用实现

1.5 VRRP:Virtual Router Redundancy Protocol

1.5.1 VRRP相关术语

1.5.2 VRRP相关技术

2.Keepalived部署

2.1 keepalived简介

2.2 Keepalived架构

2.3 Keepalived 环境搭建

2.4 Keepalived 相关文件

2.5 KeepAlived 配置说明

2.5.1 配置文件组成部分

2.5.2 配置语法说明

2.5.2.1 全局配置

2.5.2.2 配置虚拟路由器

2.5.3 keepalived日志独立

2.5.4 实现独立子配置文件

3.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 虚拟服务器配置结构

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

3.6.1.3 虚拟服务器配置

3.6.1.4 应用层监测

3.6.1.5 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

3.7.3 实战案例:Keepalived+Haproxy实现高可用


1.高可用集群

1.1 集群类型

  • LB:Load Balance 负载均衡 LVS/HAProxy/nginx(http/upstream, stream/upstream)

  • HA:High Availability 高可用集群 数据库:Redis

  • SPoF: Single Point of Failure,解决单点故障 HPC:High Performance Computing 高性能集群

1.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.3 系统故障

  • 硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素

  • 软件故障:设计缺陷 bug

1.4 高可用实现

提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)

解决方案:建立冗余机制

  • active/passive 主/备

  • active/active 双主

  • active --> HEARTBEAT --> passive

  • active <--> HEARTBEAT <--> active

1.5 VRRP:Virtual Router Redundancy Protocol

虚拟路由冗余协议:解决静态网关单点风险

  • 物理层:路由器、三层交换机

  • 软件层:keepalived

1.5.1 VRRP相关术语

  • 虚拟路由器:Virtual Router

  • 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器

  • VIP:Virtual IP

  • VMAC:Virutal MAC (00-00-5e-00-01-VRID)

  • 物理路由器:

    • master:主设备

    • backup:备用设备

    • priority:优先级

1.5.2 VRRP相关技术

通告:心跳,优先级等;周期性

工作方式:抢占式、非抢占式

安全认证:

  • 无认证

  • 简单字符认证:预共享密钥

  • MD5

工作模式:

  • 主/备:单虚拟路由器

  • 主/主:主 ”1“/备 ”2“(虚拟路由器1),备 ”1“/主 ”2“(虚拟路由器2)

2.Keepalived部署

2.1 keepalived简介

vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务

官网:http://keepalived/

功能:

  • 基于vrrp协议完成地址流动

  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

  • 为ipvs集群的各RS做健康状态检测

  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

2.2 Keepalived架构

官方文档:

https://keepalived/doc/

http://keepalived/documentation.html

  • 用户空间核心组件:

    • vrrp stack:VIP消息通告

    • checkers:监测real server

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

    • SMTP:邮件组件

    • IPVS wrapper:生成IPVS规则

    • Netlink Reflector:网络接口

    • WatchDog:监控进程

  • 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

  • IO复用器:针对网络目的而优化的自己的线程抽象

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

    2.3 Keepalived 环境搭建

    (实验环境使用的虚拟机均为rhel 9,图片上的IP仅供参考)

    角色IP(NAT)
    KA1172.25.254.50/24
    KA2172.25.254.60/24
    RS1(真实服务器)172.25.254.10/24
    RS2(真实服务器)172.25.254.20/24
    • 各节点时间必须同步:ntp,chrony
    • 关闭防火墙及SELinux
    • 各节点之间可通过主机名互相通信(非必须)
    • 建议使用/etc/hosts文件实现(非必须)
    • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(非必须)

    (1)主机关闭防火墙及SELinux

    # 各个主机关闭selinux
    [root@KA1 ~]# grubby --update-kernel ALL --args selinux=0
    [root@KA2 ~]# grubby --update-kernel ALL --args selinux=0
    
    [root@RS1 ~]# grubby --update-kernel ALL --args selinux=0
    [root@RS2 ~]# grubby --update-kernel ALL --args selinux=0
    
    # 各个主机关闭防火墙
    [root@KA1 ~]# systemctl disable --now firewalld.service
    [root@KA2 ~]# systemctl disable --now firewalld.service
    
    [root@RS1 ~]# systemctl disable --now firewalld.service
    [root@RS2 ~]# systemctl disable --now firewalld.service

    (2)各KA之间开启时间同步

    KA1
    [root@KA1 ~]# vim /etc/chrony.conf
    
    
    **********上面内容省略**********
    # Allow NTP client access from local network.
    allow 0.0.0.0/0
    
    # Serve time even if not synchronized to a time source.
    local stratum 10
    **********下面内容省略**********
    
    
    [root@KA1 ~]# systemctl restart chronyd.service
    
    
    
    KA2
    [root@KA2 ~]# vim /etc/chrony.conf
    
    
    # Use public servers from the pool.ntp project.
    # Please consider joining the pool (https://www.pool.ntp/join.html).
    pool 172.25.254.50 iburst    # 将时间源指定到172.25.254.50上
    **********下面内容省略**********
    
    
    [root@KA2 ~]# systemctl restart chronyd.service

     KA1:

    KA2:

    查看同步结果:

    [root@KA2 ~]# chronyc sources -v

    (3)KA上安装Keepalived

    # 查看软件包
    dnf search keepalived
    
    [root@KA1 ~]# dnf install keepalived -y
    [root@KA2 ~]# dnf install keepalived -y
    
    # 安装好直接启动就行,后面的配置后面再做
    [root@KA1 ~]# systemctl enable --now keepalived.service
    [root@KA2 ~]# systemctl enable --now keepalived.service

    至此,我们的基础实验环境就搭建好了

    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

    2.5 KeepAlived 配置说明

    2.5.1 配置文件组成部分

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

    配置文件组成

    • GLOBAL CONFIGURATION
      Global definitions:定义邮件配置,route_idvrrp配置,多播地址等
    • VRRP CONFIGURATION
      VRRP instance(s):定义每个vrrp虚拟路由器
    • LVS CONFIGURATION
      Virtual server group(s)
      Virtual server(s):LVS集群的VSRS

    2.5.2 配置语法说明

    # 帮助文档
    man keepalived.conf
    2.5.2.1 全局配置

    参数说明

    ! Configuration File for keepalived
    
    global_defs {
        notification_email {
              guanai@test # keepalived发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
        }
        notification_email_from keepalived@KA1.guanai # 发邮件的地址
        smtp_server 127.0.0.1 # 邮件服务器地址
        smtp_connect_timeout 30 # 邮件服务器连接timeout
        router_id KA1.guanai # 每个keepalived主机唯一标识
                                 # 建议使用当前主机名,但多节点重名不影响
    
        vrrp_skip_check_adv_addr # 对所有通告报文都检查,会比较消耗性能
                                 # 启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
    
        vrrp_strict # 严格遵循vrrp协议
                    # 启用此项后以下状况将无法启动服务:
                    # 1.无VIP地址
                    # 2.配置了单播邻居
                    # 3.在VRRP版本2中有IPv6地址
                    # 建议不加此项配置
    
        vrrp_garp_interval 1 # 免费 ARP(Gratuitous ARP)报文时间间隔
                             # 免费 ARP用于通知网络中其他设备,某IP地址对应的 MAC 地址发生了变化
                             # 帮助网络设备更新 ARP 缓存,确保数据能正确转发到新的主节点
    
        vrrp_gna_interval 1  # 用于配置发送 Gratuitous NA(免费邻居通告)报文的时间间隔
                             # 通知网络中其他设备,某 IPv6 地址对应的链路层地址(MAC 地址)发生了变化
                             # 帮助网络设备更新邻居缓存(Neighbor Cache)
                             # 确保 IPv6 数据包能正确转发到新的主节点
    
        vrrp_mcast_group4 224.0.0.44 # 指定组播IP地址范围
    }

    配置

    [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         guanai@guanai    # 这个和下面那个邮件地址随便写,发送不到也不影响结果
       }
       notification_email_from loving_eyes
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id KA1
       vrrp_skip_check_adv_addr
       #vrrp_strict           # 该功能不建议开启,把它注释掉
                              # 并且开启后,KA设备是ping不通自己的VIP的
       vrrp_garp_interval 1   # 1表示一秒发送一次
       vrrp_gna_interval 1    # 1表示一秒发送一次
       vrrp_mcast_group4 224.0.0.44
    }

    2.5.2.2 配置虚拟路由器

    参数说明

    vrrp_instance VI_1 {
        state MASTER
        interface eth0 # 绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
    
        virtual_router_id 51 # 每个虚拟路由器惟一标识,范围: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
        }
        accept # 开启vip 对外响应ping包,注意此处功能需要关闭vrrp_strict
               # 默认使用nftab策略禁用ping包响应,nft list ruleset 显示策略中即可看到
    }

    配置

    将我们之前注释的虚拟路由(vrrp_instance)修改一下

    vrrp_instance WEBVIP {    # 指定我们的虚拟路由名称叫WEBVIP
        state MASTER          # 设定该设备为主设备(是否真的为主设备实际上看的是优先级)
        interface eth0
        virtual_router_id 51
        priority 100          # 优先级
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.100/24 dev eth0 label eth0:0 # 设定我们的VIP
        }
    }

    测试:

    # 检测主配置文件是否有问题
    [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    # 做完后重启一下服务
    [root@KA1 ~]# systemctl restart keepalived.service
    
    [root@KA1 ~]# ifconfig

    可以看到KA1现在在有VIP了 

    将在KA1的配置文件直接复制到KA2上,节省我们的配置时间:

    [root@KA1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.60:/etc/keepalived/keepalived.conf

    在KA2上修改3处即可:

    [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
    
    
    
    **********上面内容省略**********
    vrrp_instance WEBVIP {
        state BACKUP    # 设定该设备为从设备
        interface eth0
        virtual_router_id 51
        priority 80     # 因为是从设备,优先级修改成比主设备低
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.100/24 dev eth0 label eth0:0
        }
    }
    **********下面内容省略**********

    老样子,重启服务

    [root@KA2 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA2 ~]# systemctl restart keepalived.service
    
    [root@KA2 ~]# ifconfig

    因为VIP还在我们的KA1(主设备)上,所以看不到

    在KA2上查看一下组播的报文信息,发现KA1一直在向组播地址发送报文(因为VIP在KA1上,谁有VIP谁发报文):

    [root@KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.44

    此时关闭KA1的Keepalived,再次查看报文:

    [root@KA1 ~]# systemctl stop keepalived.service
    
    [root@KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.44

    在查看一下KA2的IP,此时VIP转移到KA2上面了:

    重新开启KA1上的Keepalived,发现VIP又回去了(因为KA1是主设备):

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

    此时关于Keepalived的

    2.5.3 keepalived日志独立

    将keepalived的日志独立出来,在实际工作中能方便我们对服务器进行维护

    (因为是实验,在一台KA上做就好,不用两台都做)

    [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

    2.5.4 实现独立子配置文件

    当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理

    将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件

    (依旧在一台KA上做就好,不用两台都做)

    (1)创建一个目录存放我们的独立子配置文件

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

    (2)修改keepalived的主配置文件

    [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
    
    # 添加这条配置
    include /etc/keepalived/conf.d/*.conf

    重启服务,查看效果

    [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA1 ~]# systemctl restart keepalived.service
    
    [root@KA1 ~]# ifconfig

    可以看到,配置依旧生效

    3.Keepalived 企业应用示例

    3.1 实现master/slave Keepalived 单主架构(主备模式)

    主备模式在 "2.5.2 配置语法说明" 已经配置完并且测试过了,这里不再重复实验

    3.2 抢占模式和非抢占模式

            默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,这样会使vipKA主机中来回漂移,造成网络抖动,

            建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色

            非抢占模块下,如果原主机down, VIP迁移至的新主机, 后续也发生down,仍会将VIP迁移回原主机

    (因为默认为抢占模式preempt,所以这里不做抢占模式的测试效果)

    3.2.1 非抢占模式 nopreempt

    注意:要设置非抢占模式,必须将各 keepalived 服务器 state 配置为 BACKUP,不然检测时会报警告

    # 因为我们做过独立子配置文件,所以注意路径
    [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
    
    nopreempt
    
    [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA1 ~]# systemctl restart keepalived.service

    [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
    
    nopreempt
    
    [root@KA2 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA2 ~]# systemctl restart keepalived.service

    测试:

    先查看当前VIP所在的主机

    将它的keepalived关闭,此时VIP传到了KA2上

    [root@KA1 ~]# systemctl stop keepalived.service
    
    [root@KA2 ~]# ifconfig

    再次将KA1的keepalived开启,可以看到,KA1依旧没有抢占KA2的VIP

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

    3.2.2 抢占延迟模式 preempt_delay

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

    这里为了实验效果,延迟抢占只设为10秒

    KA1
    [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
    
    preempt_delay 10 # 抢占延迟10s
    
    
    # 该配置与非抢占模式的配置会冲突,检测时会报警告,记得把nopreempt删掉或注释

    KA2
    [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
    
    preempt_delay 10

    测试:

    先查看当前VIP所在的主机

    将它的keepalived关闭,等待VIP传到KA2上

    [root@KA1 ~]# systemctl stop keepalived.service
    
    [root@KA2 ~]# ifconfig

    我们复制一个KA1的标签,方便更好的观察效果

     在新开的标签里输入这条命令,一直监控着ifconfig的状态

    [root@KA1 ~]# watch -n 1 ifconfig

    在原来的KA1标签里重新启动keepalived

    返回新开的KA1标签,等待10秒,VIP就会自动回来

    3.3 VIP单播配置

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

    两台KA做完如下配置后先不重启服务,方便观看效果

    KA1
    [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
    
    unicast_src_ip 172.25.254.50 # 本机IP
    unicast_peer {
        172.25.254.60        # 指向对方主机IP
    }

    [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
    
    unicast_src_ip 172.25.254.60
    unicast_peer {
        172.25.254.50
    }

    先查看此时的报文信息:可以看到,还是KA1(VIP所在主机)发送给组播地址的

    KA2也是同样的结果:

    两边重启服务,看看效果

    [root@KA1 ~]# systemctl restart keepalived.service
    [root@KA2 ~]# systemctl restart keepalived.service
    
    
                                                   源地址               目的地址
    [root@KA1 ~]# tcpdump -i eth0 -nn src host 172.25.254.50 and dst 172.25.254.60
    
    [root@KA2 ~]# tcpdump -i eth0 -nn src host 172.25.254.60 and dst 172.25.254.50

    KA2这边看看,因为VIP在KA1上,所以KA2不会发送报文给KA1,因此看不到报文

    此时关闭KA1的keepalived,等VIP转到KA2上,再次查看同样的内容

    此时到KA2给KA1发送报文了(测完记得把KA1的keepalived重新打开

    [root@KA1 ~]# systemctl stop keepalived.service
    
    [root@KA2 ~]# tcpdump -i eth0 -nn src host 172.25.254.60 and dst 172.25.254.50

    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>

    在一台KA上做就好,一样有效果(偷懒 bushi)

    (1)安装邮件发送工具

    [root@KA1 ~]# dnf install s-nail sendmail -y

    (2)对邮件内容进行配置

    vim /etc/mail.rc
    
    set smtp=smtp.163
    set smtp-auth=login
    set smtp-auth-user=15677091134@163
    set smtp-auth-password=ZL58T33yqCHTTCMU
    set from=15677091134@163
    set ssl-verify=ignore

    这个认证不要乱填,去自己邮箱那里搞

     

    先对要使用的邮箱做一点设置(作者这里使用网易的163邮箱),点击圈出来的选项

    把这个选项点开启

    点继续开启

    然后认证就生成出来了(第一次做可能需要手机号码验证)

    将它复制进去

    测试一下邮件功能(发个邮件给自己的邮箱)

    [root@KA1 ~]# echo hello | mailx -s test 你们自己的邮箱

    可以看到,发过来了(网不好的话可能会有点慢)

    然后我们写个脚本,当VIP发生转移时,给我们的邮箱发送邮件

    [root@KA1 ~]# vim /etc/keepalived/mail.sh
    
    #!/bin/bash
    mail_dest='你们自己的邮箱'
    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

    (3)修改keepalived主配置文件

    # 在全局配置里加
    [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
    
    enable_script_security #开启keepalived执行脚本功能
    script_user root #指定脚本执行用户身份

    别忘了独立子配置文件

    [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
    
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"

    重启服务,停止/开启keepalived,查看效果

    [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA1 ~]# systemctl restart keepalived.service
    
    [root@KA1 ~]# systemctl stop keepalived.service
    
    [root@KA1 ~]# systemctl start keepalived.service
    

     可以看到邮件发过来了

    做完记得把自己邮箱的这个关了,还有keepalived中那些关于邮箱的配置也删掉或注释

    3.5 实现 master/master Keepalived 双主架构(主/主模式)

            master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。

    master/master 的双主架构:

            即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率

    (1)KA1配置

    KA1
    [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
    
    vrrp_instance WEBVIP {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.100/24 dev eth0 label eth0:0
        }
        unicast_src_ip 172.25.254.50
        unicast_peer {
            172.25.254.60
        }
    }
    
    vrrp_instance DBVIP {
        state BACKUP
        interface eth0
        virtual_router_id 52
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.200/24 dev eth0 label eth0:1
        }
        unicast_src_ip 172.25.254.50
        unicast_peer {
            172.25.254.60
        }
    }

    (2)KA2配置

    KA2
    [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
    
    vrrp_instance WEBVIP {
        state BACKUP
        interface eth0
        virtual_router_id 51
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.100/24 dev eth0 label eth0:0
        }
        unicast_src_ip 172.25.254.60
        unicast_peer {
            172.25.254.50
        }
    }
    
    vrrp_instance DBVIP {
        state MASTER
        interface eth0
        virtual_router_id 52
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            172.25.254.200/24 dev eth0 label eth0:1
        }
        unicast_src_ip 172.25.254.60
        unicast_peer {
            172.25.254.50
        }
    }

    重启服务,查看效果

    [root@KA1 ~]# systemctl restart keepalived.service
    [root@KA2 ~]# systemctl restart keepalived.service

    此时将KA1的keepalived关闭,查看KA2的VIP

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

    此时将KA1的keepalived打开,VIP又回来了

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

    3.6 实现IPVS的高可用性

    3.6.1 IPVS相关配置

    3.6.1.1 虚拟服务器配置结构
    virtual_server IP port {
        ...
      real_server {
      ...
      }
      real_server {
      ...
      }
      ...
    }
    3.6.1.2 virtual server (虚拟服务器)的定义格式
    virtual_server IP port      # 定义虚拟主机IP地址及其端口
    virtual_server fwmark int   # pvs的防火墙打标,实现基于防火墙的负载均衡集群
    virtual_server group string # 使用虚拟服务器组
    3.6.1.3 虚拟服务器配置
    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.4 应用层监测

    应用层检测: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.5 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 模式

    (1)在RS1、RS2中设定VIP和环回的应答禁止

    RS1、RS2上都要做
    
    # 临时添加环回地址,重启系统后失效
    ip addr add dev lo 172.25.254.100/32
    
    # 开启环回的应答禁止
    echo "net.ipv4.conf.all.arp_ignore=1" >> /etc/sysctl.conf
    echo "net.ipv4.conf.all.arp_announce=2" >> /etc/sysctl.conf
    echo "net.ipv4.conf.lo.arp_ignore=1" >> /etc/sysctl.conf
    echo "net.ipv4.conf.lo.arp_announce=2" >> /etc/sysctl.conf
    
    # 启用配置
    sysctl -p

    (2)KA1、KA2上安装ipvsadm

    [root@KA1 ~]# dnf install ipvsadm -y
    [root@KA2 ~]# dnf install ipvsadm -y

    (3)将我们之前注释的 "virtual_server" 修改一下

    # KA2做同样的操作,目录什么的都一样,直接复制粘贴就好
    
    [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
    
    virtual_server 172.25.254.100 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        protocol TCP
    
        real_server 172.25.254.10 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
                  status_code 200
                }
                connect_timeout 2
                retry 3
                delay_before_retry 3
            }
        }
    
        real_server 172.25.254.20 80 {
            weight 1
            TCP_CHECK {
                connect_timeout 2
                retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }

    重启完服务后,可以看到,ipvsadm策略自动写上去了

    (4)本地终端访问测试

    for i in {1..10};do curl 172.25.254.100;done

    此时关闭RS1的nginx,访问测试,可以看到访问的都是RS2

    打开RS1的nginx,再次测试,流量正常

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

    keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

    参考配置文件:/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck

    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
        }
    }

    3.7.3 实战案例:Keepalived+Haproxy实现高可用

    将我们之前做LVS-DR时配置的 "virtual_server" 全部删掉或注释,保持一个纯净的环境

    清完,然后我们重启一下服务

    [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA1 ~]# systemctl restart keepalived.service
    
    [root@KA2 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA2 ~]# systemctl restart keepalived.service

    这样我们Ipvsadm的相关配置一并被清除,不会影响我们后续的配置

    (1)KA1、KA2安装Haproxy

    [root@KA1 ~]# dnf install haproxy -y
    [root@KA2 ~]# dnf install haproxy -y

    (2)编辑Haproxy的主配置文件

    KA1、KA2上都要做
    [root@KA1 ~]# vim /etc/haproxy/haproxy.cfg
    
    listen webcluster
        bind     *:80
        mode     http
        balance  roundrobin
        server web1 172.25.254.10:80 check inter 3 fall 2 rise 3
        server web2 172.25.254.20:80 check inter 3 fall 2 rise 3

    (3)在两个ka1ka2两个节点启用内核参数

            不加的话没有VIP的一端服务起不来

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

    (4)开启Haproxy服务,并查看端口

    可以看到都是开的

    systemctl enable --now haproxy.service
    netstat -antlulpe | grep haproxy

    但此时有个问题,如果拥有VIP的主机的Haproxy下线,VIP不会漂移,访问会中断

    问题重现:

    拥有VIP的主机还在时,能正常访问

    拥有VIP的主机的Haproxy下线,访问失败,VIP没有漂移

    解决方案:

            思路:当Haporxy的进程挂了之后,拥有VIP的主机的虚拟路由优先级减少,这样就会使VIP移动到优先级更高的主机,保证服务的正常进行(注意,Keepalived不能配置非抢占模式)

    (1)在KA1、KA2编写脚本

    [root@KA1 ~]# mkdir /etc/keepalived/scripts/
    [root@KA1 ~]# vim /etc/keepalived/scripts/haproxy.sh
    
    #!/bin/bash
    killall -0 haproxy &> /dev/null
    
    [root@KA1 ~]# chmod +x /etc/keepalived/scripts/haproxy.sh

    (2)编辑Keepalived的配置文件

    KA1

    [root@KA1 ~]# vim /etc/keepalived/keepalived.conf
    
       enable_script_security
       script_user root
    
    
    vrrp_script check_haproxy {
        script "/etc/keepalived/scripts/haproxy.sh"
        interval 1
        weight -30
        fall 2
        rise 2
        timeout 2
    }

    [root@KA1 ~]# vim /etc/keepalived/conf.d/webvip.conf
    
    track_script {
            check_haproxy
        }

    KA2

    [root@KA2 ~]# vim /etc/keepalived/keepalived.conf
    
    
       enable_script_security
       script_user root
    
    
    vrrp_script check_haproxy {
        script "/etc/keepalived/scripts/haproxy.sh"
        interval 1
        weight -30
        fall 2
        rise 2
        timeout 2
    }
    
    
    track_script {
            check_haproxy
        }

    重启服务,测试

    [root@KA1 ~]# keepalived -t -f /etc/keepalived/keepalived.conf
    [root@KA1 ~]# systemctl restart keepalived.service

    (1)Keepalived正常,Haproxy正常,访问没有问题:

    Keepalived正常,Haproxy挂了,访问没有问题:

    Keepalived挂了,Haproxy正常,访问依旧没有问题:

    先将KA1的Haproxy开回来

    关闭KA2的Keepalived

    发布者:admin,转转请注明出处:http://www.yc00.com/web/1754208169a5131479.html

    相关推荐

    发表回复

    评论列表(0条)

    • 暂无评论

    联系我们

    400-800-8888

    在线咨询: QQ交谈

    邮件:admin@example.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注微信