高可用集群KEEPALIVED

发布于:2025-07-26 ⋅ 阅读:(16) ⋅ 点赞:(0)

系统高可用

集群类型

   LB:Load Balance 负载均衡    

   LVS/HAProxy/nginx(http/upstream, stream/upstream)

   HA:High Availability 高可用集群

   数据库、Redis

   SPoF: Single Point of Failure,解决单点故障

   HPC:High Performance Computing 高性能集群

系统可用性

   SLA:Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约)

   A = MTBF / (MTBF+MTTR)

   指标 :99.9%, 99.99%, 99.999%,99.9999%

系统故障

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

   软件故障:设计缺陷 bug

实现高可用

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

解决方案:建立冗余机制

   active/passive 主/备

   active/active 双主

   active --> HEARTBEAT --> passive

   active <--> HEARTBEAT <--> active

VRRP:Virtual Router Redundancy Protocol

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

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

   软件层:keepalived

相关术语

   虚拟路由器:Virtual Router

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

   VIP:Virtual IP

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

   物理路由器:

      master:主设备

      backup:备用设备

      priority:优先级

VRRP技术

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

工作方式:抢占式,非抢占式  【强占是激活就接受负载权限,非抢占是另一个挂掉在负载】

安全认证: 无认证 ,   简单字符认证:预共享密钥 ,   MD5

工作模式: 主/备:单虚拟路由器 ,主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

Keepalived部署

keepalived 简介

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

官网:http://keepalived.org/

功能:

  基于vrrp协议完成地址流动

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

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

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

Keepalived 架构

用户空间核心组件:

   vrrp stack:VIP消息通告    checkers:监测real server

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

    IPVS wrapper:生成IPVS规则    Netlink Reflector:网络接口    WatchDog:监控进程

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

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

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

Keepalived 环境准备

   各节点时间必须同步:ntp, chrony

   关闭防火墙及SELinux

   各节点之间可通过主机名互相通信:非必须

   建议使用/etc/hosts文件实现:非必须

   各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须

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

Keepalived 安装

所有KA]# dnf install keepalived -y

# systemctl start keepalived

# ps axf | grep keepalived

# vim /etc/chrony.conf

# systemctl enable --now chronyd

# systemctl restart chronyd.service

# chronyc sources -v     【查看同步信息】

KeepAlived 配置说明

配置文件:/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

全局配置

global_defs {

   notification_email {

   timinglee@timinglee.org            #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个

   }

   notification_email_from timinglee@timinglee.org   #发邮件的地址

   smtp_server 127.0.0.0                        #邮件服务器地址

   smtp_connect_timeout 30                     #邮件服务器连接timeout

   router_id LVS_DEVEL                       #每个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 地址)发生了变化

         #帮助网络设备更新邻居缓存(NeighborCache)

         #确保 IPv6 数据包能正确转发到新的主节点

   vrrp_mcast_group4 224.0.0.44                    #指定组播IP地址范围:

}

虚拟路由配置信息

vrrp_instance WEBVIP {

    state MASTER                   # 设置为主虚拟路由,BACKUP是备用路由

    interface eth0       #绑定为当前使用的物理接口,如:eth0,可以和VIP不在一个网卡

    virtual_router_id 51                   #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一 ,否则服务无法启动

                                #同属一个虚拟路由器的多个keepalived节点必须相同

                                #务必要确认在同一网络中此值必须唯一

    priority 100               #当前物理节点在此虚拟路由器的优先级,范围:1-254

                            #值越大优先级越高,每个keepalived主机节点此值不同

    advert_int 1                   #vrrp通告的时间间隔,默认1s

    authentication {                 #认证机制

        auth_type PASS            #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)

        auth_pass 1111              #预共享密钥,仅前8位有效

                                  #同一个虚拟路由器的多个keepalived节点必须一样

    }

    virtual_ipaddress {              #用来确定vip目标IP地址

        172.25.254.100/24 dev eth0 label eth0:0    #指定VIP的地址

                                    # dev eth0 作用:将 VIP 绑定到物理网卡 eth0 上。

                  # label eth0:0 作用:为 VIP 分配一个别名(eth0:0),方便识别和管理。

}

    accept                 #开启vip 对外响应ping包,注意此处功能需要关闭vrrp_strict

               #默认使用nftab策略禁用ping包响应,nft list ruleset 显示策略中即可看到

}

# keepalived -t -f /etc/keepalived/keepalived.conf     【检测配置文件语法】

配置虚拟路由器

KA1 ~]# vim /etc/keepalived/keepalived.conf     【编译主配置文件】

global_defs {

   notification_email {

   timinglee@timinglee.org

   }

   notification_email_from timinglee@timinglee.org

   smtp_server 127.0.0.0

   smtp_connect_timeout 30

   router_id LVS_DEVEL

   vrrp_skip_check_adv_addr

   #vrrp_strict                 #格式化设置不遵循vrrp协议

   vrrp_garp_interval 1

   vrrp_gna_interval 1

   vrrp_mcast_group4 224.0.0.44      #指定组播IP地址,表示运行活着

}

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 {              #用来确定vip目标IP地址

        172.25.254.100/24 dev eth0 label eth0:0

    }

}

#下面用 "# " 格式化#

KA2 ~]# vim /etc/keepalived/keepalived.conf

所有KA ~]# keepalived -t -f /etc/keepalived/keepalived.conf   【检查配置】

# systemctl enable --now keepalived.service     【编译好再启动,负责可能会出问题】

# systemctl restart keepalived.service         【重启】

KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.44     【ping表示运行活着没有dump

KA1 ~]# systemctl stop keepalived.service

启用keepalived日志功能

# vim /etc/sysconfig/keepalived        【配置日志级别文件】

KEEPALIVED_OPTIONS="-D -S 6"      #日志级别为0-7

#vim /etc/rsyslog.conf        【配置6级日志放入的文件】

# systemctl restart keepalived.service     【重启】

# systemctl restart rsyslog.service

# tail -f /var/log/keepalived.log        【检测】

创建子配置文件

KA1 ~]# mkdir -p /etc/keepalived/conf.d          【创建子配置文件目录】

# vim /etc/keepalived/conf.d/router.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 {              #用来确定vip目标IP地址

        172.25.254.100/24 dev eth0 label eth0:0

    }

}

# vim /etc/keepalived/keepalived.conf         【主配置文件剩余内容】

global_defs {

   notification_email {

   timinglee@timinglee.org

   }

   notification_email_from timinglee@timinglee.org

   smtp_server 127.0.0.0

   smtp_connect_timeout 30

   router_id LVS_DEVEL

   vrrp_skip_check_adv_addr

   #vrrp_strict                 #格式化设置不遵循vrrp协议

   vrrp_garp_interval 1

   vrrp_gna_interval 1

   vrrp_mcast_group4 224.0.0.44

}

nclude /etc/keepalived/conf.d/*.conf      在 } 后面,不在内部

抢占模式和非抢占模式

非抢占模式 nopreempt

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,

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

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

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

注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP

# vim /etc/keepalived/keepalived.conf

# systemctl restart keepalived.service

KA1 ~]# ifconfig           【查看抢占】

# systemctl stop keepalived.service

KA2 ~]# ifconfig                  【如果KA1重启后会直接抢占回来】

抢占延迟模式 preempt_delay

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

# vim /etc/keepalived/keepalived.conf

KA1 ~]# ifconfig           【查看抢占】

# systemctl stop keepalived.service

KA2 ~]# ifconfig          【10秒后抢占】

VIP单播配置

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

KA1 ~]# vim /etc/keepalived/keepalived.conf

KA2 ~]# vim /etc/keepalived/keepalived.conf

    unicast_src_ip 172.25.254.60

    unicast_peer {

        172.25.254.50

    }

# systemctl restart keepalived.service

KA1 ~]# tcpdump -i eth0 -nn src host 172.25.254.50 and dst 172.25.254.60    【单播60】

# ifconfig 

# systemctl stop keepalived.service    【关闭服务后 60 才可以单播 50 】

Keepalived 通知脚本配置

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户

默认以用户keepalived_script身份执行脚本

如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份

global_defs {   

    script_user <USER>

通知脚本类型

当前节点成为主节点时触发的脚本

     notify_master "/mnt/test.sh master"

当前节点转为备节点时触发的脚本

     notify_backup "/mnt/test.sh backup"

当前节点转为“失败状态时触发的脚本

     notify_fault "/mnt/test.sh fault"

脚本的调用方法

在 vrrp_instance VI_1 语句块的末尾加下面行

邮件配置

安装邮件发送工具

所有KA]# dnf install mailx -y

# dnf install s-nail sendmail -y

# systemctl enable --now sendmail.service

# vim /etc/mail.rc

   set smtp=smtp.163.com     #选择使用163或qq.com

   set smtp-auth=login         #指定 SMTP 服务器的认证方式

   set smtp-auth-user=timinglee_zln@163.com     #发送邮件时用于 SMTP 认证的 用户名

   set smtp-auth-password=TAb9vYbWevbPtN4m     #获取到的授权码

   set from=timinglee_zln@163.com            #设置邮件的发件人地址

   set ssl-verify=ignore           #控制是否验证邮件服务器的 SSL/TLS 证书

发送测试邮件

# echo hello | mailx -s test timinglee_zln@163.com     【发送测试邮件】

实现 Keepalived 状态切换的通知脚本

# vim /etc/keepalived/mail.sh

#!/bin/bash

mail_dest='xxx@qq.com'   # 定义收件人邮箱地址

mail_send(){             # 定义邮件发送函数

         #设置邮件主题:包含主机名和状态变化信息

    mail_subj="$HOSTNAME to be $1 vip 转移"        # $1 (master/backup/fault)

    mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"    # 设置邮件正文内容

echo "$mail_mess" | mail -s "$mail_subj" $mail_dest        

            # 发送邮件:  -s 指定主题   最后参数是收件人地址

}

case $1 in      # 根据脚本的第一个参数执行不同操作

    master)

    mail_send master    # 当参数是 master 时,发送状态变为 master 的通知邮件

    ;;

    backup)

    mail_send backup    # 当参数是 backup 时,发送状态变为 backup 的通知邮件

    ;;

    fault)

    mail_send fault     # 当参数是 fault 时,发送状态变为 fault 的通知邮件

    ;;

    *)

    exit 1

    ;;

esac

# chmod +x /etc/keepalived/mail.sh      【设置运行权限】

# vim /etc/keepalived/keepalived.conf      【配置主配置文件】

# bash /etc/keepalived/mail.sh master     【检测运行,邮箱会收到邮件】

# systemctl restart keepalived.service     【更改主配置文件,重启会发邮件说明更改】

实现 master/master 的 Keepalived 双主架构

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

master/master 的双主架构:

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

Ka1主机配置

# vim /etc/keepalived/keepalived.conf

vrrp_instance WEBVIP {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    unicast_src_ip 172.25.254.50       #只有一个虚拟路由设置单播

    unicast_peer {

        172.25.254.60

    }

    virtual_ipaddress {           

        172.25.254.100/24 dev eth0 label eth0:0

    }

}

vrrp_instance DBVIP {      #设置双网卡

    state BACKUP

    interface eth0

    virtual_router_id 52      #设置新ip

    priority 80          #设置权重

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    unicast_src_ip 172.25.254.50

    unicast_peer {

        172.25.254.60

    }

    virtual_ipaddress {        

        172.25.254.200/24 dev eth0 label eth0:1      #新 VIP 分配新别名(eth0:1)

    }

}

ka2主机配置

vrrp_instance WEBVIP {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 80

    preempt_delay 10

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}

    unicast_src_ip 172.25.254.60

    unicast_peer {

        172.25.254.50

    }

    virtual_ipaddress {   

        172.25.254.100/24 dev eth0 label eth0:0

    }

}

vrrp_instance DBVIP {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 100

    preempt_delay 10

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}

    unicast_src_ip 172.25.254.60

    unicast_peer {

        172.25.254.50

    }

    virtual_ipaddress {          

        172.25.254.200/24 dev eth0 label eth0:1

    }

}

# systemctl restart keepalived.service

KA2 ~]# ifconfig

KA1 ~]# ifconfig

# systemctl stop keepalived.service         【有一个挂掉另一个主机会顶替工作】

IPVS的高可用性

虚拟服务器配置结构

virtual_server 172.25.254.100 80 {

    real_server 172.25.254.10 80 {

    real_server 172.25.254.20 80 {

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

virtual_server 172.25.254.100 80 {

virtual_server IP port           #定义虚拟主机IP地址及其端口

virtual_server fwmark int       #ipvs的防火墙打标,实现基于防火墙的负载均衡集群

virtual_server group string      #使用虚拟服务器组

虚拟服务器配置

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> {         #RSIPPORT

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

                #定义当前主机健康状态检测方法

        }

}

#注意:括号必须分行写,两个括号写在同一行,: }} 会出错

应用层监测

检测:HTTP_GET|SSL_GET

HTTP_GET|SSL_GET {

    url {

        path <URL_PATH>         #定义要监控的URL

        status_code <INT>         #判断上述检测机制为健康状态的响应码,一般为 200

    }

    connect_timeout <INTEGER>   #客户端请求超时时长, 相当于haproxytimeout 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发出健康状态检测请求时使用的源端口

}

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>     #客户端请求的超时时长

                                #等于haproxytimeout server

}

实现单主的 LVS-DR 模式

准备web服务器并使用脚本绑定VIPweb服务器lo网卡

所有RS]# ip a a 172.25.254.100/32 dev lo       【添加vip的lo网卡

# vim /etc/sysctl.conf       【配置参数文件,RS1 RS2 中设定vip何lo的应答禁止】

    net.ipv4.conf.all.arp_announce = 2

    net.ipv4.conf.all.arp_ignore = 1

    net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

所有KA]# dnf install ipvsadm-1.31-6.el9.x86_64 -y

所有KA]# vim /etc/keepalived/keepalived.conf     【VIP用一个主,抢占模式】

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

        }

    }

}

# systemctl restart keepalived.service

# ipvsadm -Ln

先ping 172.25.254.100检测激活

测试机]# for i in {1..4}; do curl 172.25.254.100; done

模拟故障

rs1 ~]# systemctl stop httpd

测试机]# for i in {1..6}; do curl 172.25.254.100; done

AK1 ~]# systemctl stop keepalived.service   

双主分别实现httpd和mysql服务的调度

所有RS]# dnf install mariadb-server -y    【下载】

# ip addr add 172.25.254.150/32 dev lo

rs1 ~]# vim /etc/my.cnf         【添加配置】

[mysqld]

    server-id=1

rs2 ~]# vim /etc/my.cnf

[mysqld]

    server-id=2

所有RS]# systemctl enable --now mariadb

所有RS]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"

# mysql -ulee -plee -h172.25.254.101 -e 'select @@server_id'

测试机]# sudo dnf install mariadb -y        【安装Maria DB客户端】

KA2 ~]# vim /etc/keepalived/keepalived.conf       【配置调度数据库,KA1也是一样

virtual_server 172.25.254.150 3306 {

    delay_loop 3

    lb_algo rr

    lb_kind DR

    protocol TCP

    real_server 172.25.254.10 3306 {

        weight 1

        TCP_CHECK {

            connect_timeout 5

            retry 3

            delay_before_retry 2

            connect_port 3306

        }

    }

    real_server 172.25.254.20 3306 {

        weight 1

        TCP_CHECK {

            connect_timeout 5

            retry 3

            delay_before_retry 2

            connect_port 3306

        }

}

}

# systemctl restart keepalived.service

# ifconfig

# ipvsadm -Ln 查看结果:

client ~]# mysql -ulee -plee -h172.25.254.150 -e 'select @@server_id'

【当KA挂掉一个后,调度不会有问题,RS挂掉一个后,访问的只有没挂掉的】

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

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

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

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

}

定义 VRRP script

    vrrp_script <SCRIPT_NAME> {            #定义一个检测脚本,在global_defs 之外配置

    script <STRING>|<QUOTED-STRING>         #shell命令或脚本路径

    interval <INTEGER>             #间隔时间,单位为秒,默认1

    timeout <INTEGER>             #超时时间

    weight <INTEGER:-254..254>     #默认为0,如果设置此值为负数,

                                #当上面脚本返回值为非0时【脚本跑失败了】

                                #会将此值与本节点权重相加可以降低本节点权重,

#【+20(脚本成功就相加,不成功不动),-20(脚本失败就相加,成功不动)】

                            #即表示fall.

                                #如果是正数,当脚本返回值为0【脚本跑成功】

                                #会将此值与本节点权重相加可以提高本节点权重

                                #即表示 rise.通常使用负值

    fall <INTEGER>            #执行脚本连续几次都失败,则转换为失败,建议设为2以上

    rise <INTEGER>             #执行脚本连续几次都成功,把服务器从失败标记为成功

    user USERNAME [GROUPNAME]         #执行监测脚本的用户或组

    init_fail                 #设置默认标记为失败状态,监测成功之后再转换为成功状态

}

调用 VRRP script

vrrp_instance test {

... ...

    track_script {         #调用脚本

        check_down         #配置调用脚本目录的,名称

    }

}

利用脚本实现主从角色切换

KA1 ~]# vim /etc/keepalived/lee.sh    【建立脚本】

#!/bin/bash

[ ! -f "/mnt/lee" ]

# chmod +x /etc/keepalived/lee.sh    【给予权限】

# vim /etc/keepalived/keepalived.conf    【配置主配置文件】

KA1 ~]# touch /mnt/lee

【等待几秒后KA2 # ifconfig 】

实现HAProxy高可用  

【vrrp不能用非抢占模式】

所有KA]# dnf install haproxy -y

# vim /etc/haproxy/haproxy.cfg      【配置haproxy调度】

listen webcluster

        bind    *:80

        mode    http

        balance     roundrobin

        bind 172.25.254.100:80

        server web1 172.25.254.10:80 check

        server web2 172.25.254.20:80 check

# systemctl restart haproxy.service

# vim /etc/sysctl.conf

    net.ipv4.ip_nonlocal_bind = 1       #开启内核参数

# sysctl -p    【查看参数】

# vim /etc/keepalived/haproxy.sh    【配置检测脚本,检测haproxy运行】

    #!/bin/bash

    /usr/bin/killall -0 haproxy

# chmod +x /etc/keepalived/haproxy.sh

# vim /etc/keepalived/keepalived.conf

# systemctl restart keepalived.service

测试机]# for i in {1..6}; do curl 172.25.254.100; done

一个KA停止haproxy

ka1 ~]# systemctl stop haproxy.service          【KA1权重会低于KA2】

Web服务器故障

RS1 ~]# systemctl stop httpd


网站公告

今日签到

点亮在社区的每一天
去签到