详细解读keepalived高可用集群

news2024/9/20 22:38:24

一.高可用集群

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)

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

概述:

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

  1. 利用VRRP,一组路由器(同一个LAN中的接口)协同工作,但只有一个处于Master状态,处于该状态的路由器(的接口)承担实际的数据流量转发任务。在一个VRRP组内的多个路由器接口共用一个虚拟IP地址,该地址被作为局域网内所有主机的缺省网关地址。

  2. VRRP决定哪个路由器是Master,Master路由器负责接收发送至用户网关的数据包 并进行转发,以及响应PC对于其网关IP地址的ARP请求。

  3. Backup路由器侦听Master路由器的状态,并在Master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换。

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

软件层: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)

二.Keepalived 部署

2.1 keepalived 简介

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

官网:http://keepalived.org/  

功能:

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

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

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

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

2.2 Keepalived 架构

官方文档:
https://keepalived.org/doc/ http://keepalived.org/documentation.html

http://keepalived.org/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 环境准备

实验环境
主机名IP地址
KA1172.25.254.10
KA2172.25.254.20
webserver1172.25.254.110
webserver2172.25.254.120
  • 各节点时间必须同步: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

    2.5 Keepalived 安装

    安装 keepalived

[root@ka1 ~]# yum install keepalived -y
[root@ka1 ~]# systemctl start keepalived
[root@ka2 ~]# yum install keepalived -y
[root@ka2 ~]# systemctl start keepalived

2.6 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

2.6.1 配置虚拟路由

配置master:

vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
      2823279147@qq.com                #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
   }
   notification_email_from keepalived@ka1.exam.org      #发邮件的地址
   smtp_server 127.0.0.1                                #邮件服务器地址
   smtp_connect_timeout 30                              #邮件服务器连接timeout
   router_id ka1.exam.org                               #每个keepalived主机唯一标识,多节点 
                                                         重名不影响

   vrrp_skip_check_adv_addr                 #对所有通告报文都检查,会比较消耗性能  
                                            #启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查

   #vrrp_strict                            #严格遵循vrrp协议
                                           #启用此项后以下状况将无法启动服务:
                                              1.无VIP地址
                                              2.配置了单播邻居
                                              3.在VRRP版本2中有IPv6地址
                                           #建议不加此项配置

   vrrp_garp_interval 0                    #报文发送延迟,0表示不延迟
   vrrp_gna_interval 0                     #消息发送延迟
   vrrp_mcast_group4 224.0.0.18            #指定组播IP地址范围:
}

配置slave:

vrrp_instance VI_1 {
    state MASTER
    interface eth0                   #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和            
                                      VIP不在一个网卡
    
    virtual_router_id 100            #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此 
                                      值必须唯一,否则服务无法启动
                                      同属一个虚拟路由器的多个keepalived节点必须相同
                                      务必要确认在同一网络中此值必须唯一
    
    priority 100                    #当前物理节点在此虚拟路由器的优先级,范围:1-254
                                     值越大优先级越高,每个keepalived主机节点此值不同
 
    advert_int 1                    #vrrp通告的时间间隔,默认1s
    authentication {                #认证机制
        auth_type PASS              #PASS为简单密码(建议使用)
        auth_pass 1111              #预共享密钥,仅前8位有效
                                     同一个虚拟路由器的多个keepalived节点必须一样
    }
    virtual_ipaddress {             #虚拟IP,生产环境可能指定上百个IP地址
                                    
        172.25.250.100/24 dev eth0 label eth0:1    #<IPADDR> dev <STRING> scope <SCOPE>                                     
                                                   label <LABEL>
                                       #指定VIP,不指定网卡,默认为eth0,注意:不指 
                                        定/prefix,默认32
    }
}
2.6.2 示例: keepalived配置文件中配置虚拟路由

ka1和ka2中安装软件包:

yum install keepalived -y

主配置文件:

vim /etc/keepalived/keepalived.conf

默认为抢占模式:

配置全局参数:

global_defs {
   notification_email {
   	2823279147@qq.com
   }
   notification_email_from keepalived@timingding.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.timingding.org
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18
}

配置vip:
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 start keepalived.service

测试:

这里可以快捷一点:使用scp命令直接复制到另一台ka上面

直接复制到ka2上面:
scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf

ka2上面的优先级设置的低一些:

ka2配置vip的地方要改优先级:

vrrp_instance VI_1 {
    state BACKUP   ------ 改为BACKUP
    interface eth0
    virtual_router_id 100
    priority 80    ------ 改的比ka1低一些
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
2.6.2.1 抓包命令查看组播信息:

tcpdump -i eth0 -nn host 224.0.0.18

此时ping 172.25.254.100是ping不通的,想ping通,得在全局配置里面加参数 vrrp_iptables,不想加就可以把vrrp_strict注释掉,要么都开,要么就注释掉

iptables -nL

global_defs {
   notification_email {
        2823279147@qq.com
   }
   notification_email_from keepalived@timinglee.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.timinglee.org
   vrrp_skip_check_adv_addr
   #vrrp_strict                   ------注释掉这一行
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_global4 224.0.0.18
}

此时就可以ping通172.25.254.100了。

2.6.3 实现独立子配置文件

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
#    }
#}
加上
include "/etc/keepalived/conf.d/*.conf"

vim /etc/keepalived/conf.d/172.25.254.100.conf

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

systemctl restart keepalived.service

三.Keepalived应用示例

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

3.1.1 配置MASTER

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

global_defs {
   notification_email {
      2823279147@qq.com  
   }
   notification_email_from keepalived@timingding.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1.timingding.org
   vrrp_skip_check_adv_addr
   #vrrp_strict                
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   #vrrp_mcast_group4 224.0.0.18
   #vrrp_iptables
}

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

3.1.2 配置BACKUP

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

global_defs {
   notification_email {
      2823279147@qq.com
   }
   notification_email_from keepalived@ka2.timingding.org
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka2.timingding.org
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group 224.0.0.18
   #vrrp_iptables
}

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

3.1.3 抓包查看

tcpdump -i eth0 -nn host 224.0.0.18

3.2 抢占模式和非抢占模式

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色, 这样会使vip 在 KA 主机中来回漂移,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色

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

master角色下线后,会转移到另一台主机后,master角色重新恢复之后,不会因为优先级抢占vip

3.2.1 非抢占模式 nopreempt
ka1和ka2一样:
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP   ---- 也得设置为BACKUP,两台都为备机
    interface eth0
    virtual_router_id 100 
    priority 100
    advert_int 1
    nopreempt     ------- 加上这个参数
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
3.2.2 抢占延迟模式preempt_delay

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

注意:需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict

ka1主机上:ka2也一样
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    preempt_delay 5s    ---- 抢占延时为5s,一般设定一分钟,五分钟,这里演示。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }

3.3vip单播模式

ka1主机上: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.10   ---- 指定谁到谁  ka2上相反
    unicast_peer {
        172.25.254.20
    }

3.3.1 抓包命令查看:

[root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20

3.4 keepalived实现邮件通知

安装邮件发送工具:
dnf install mailx -y

QQ邮箱配置:
vim /etc/mail.rc
在配置文件最后面加上这5行
set from=2823279147@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2823279147@qq.com
set smtp-auth-password=jxtebbewurjddhci            ---- 在QQ邮箱上面登录弄授权码
set smtp-auth=login

测试发送邮件:
echo test message |mail -s test 2823279147@qq.com

写个脚本:
vim /etc/keepalived/mail.sh

#!/bin/bash
mail_dst="2823279147@qq.com"
send_message()
{
  mail_sub="HOSTNAME to be $1 vip mopve"
  mail_msg="`date +%F\ %T`: vrrp move $HOSTNAME chage $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

chmod +x /etc/keepalived/mail.sh

在ka1和ka2虚拟路由上面添加节点:
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    advert_int 1
    #preempt_delay 5s
    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/notify.sh master"     ----- 添加这三行
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

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

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

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

ka1和ka2上都加上,都有一个主备
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_2 {
    state MASTWE
    interface eth0
    virtual_router_id 200
    priority 80      ----- 优先级不能一样
    advert_int 1
    #preempt_delay 5s
    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
    }
}

3.6 实现IPVS的高可用性(DR模式)

3.6.1 应用层监测

应用层检测: 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.2 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.3 实现单主的 LVS-DR 模式
永久设定vip:
vim /etc/sysconfig/network-scripts/ifcfg-lo 

加上:
IPADDR1=172.25.254.100
NETMASK1=255.255.255.255
NETWORK=127.0.0.0

这里我们给上临时的就行:
reslserver1和2上面给上vip(临时)
ip a a 172.25.254.100 dev lo

解决响应问题:
查看arp:
sysctl -a | grep arp

ka1上面
vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1

用scp命令写到ka2上面:
scp /etc/sysctl.d/arp.conf root@172.25.254.110:/etc/sysctl.d/arp.conf

#######################################
ka1和ka2上面安装ipvsadm 用来查看策略:
yum install ipvsadm -y
######################################
ka1和ka2一样:
vim /etc/keepalived/keepalived.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
    }
}
}

ssytemctl restart keepalived.service

使用ipvsadm -Ln 查看策略是否写进去

3.7 vrrp Script 配置 脚本控制vip

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

示例:先用例子测试一下:
检测文件是否存在,存在为真(1),ka1就降低优先级,vip飘到ka2上面,不存在为假(0),vip就按兵不动
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/ding ]   ---- 取反

chmod +x /etc/keepalived/test.sh ---- 给上可执行权限

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

vrrp_script lee {
   script "/etc/keepalived/test.sh"     ------shell命令或脚本的路径
   interval 1                  ------ 检测的间隔时间,默认为1s
   weight -30                  ------ 默认为零,这里测试设置-30,当运行脚本检测到之后,为非0,就会与VIP的优先级相加,优先                                         降低,实现VIP飘移,为0时就VIP就按兵不动。
   fall 2                       ------ 脚本连续几次都执行失败,则转换为失败,建议设置为2以上
   rise 2                         ------ 执行脚本连续几次都成功,把服务器标记为成功
   timeout 2                   ------ 设置的超时时间。
}


vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #preempt_delay 5s
    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 {            ------ 调用这个script配置参数
         lee
    }    
}

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

sh /etc/keepalived/test.sh
echo $?

0
此时/mnt底下没有ding这个文件,运行脚本输出0,VIP就不动

此时在/mnt底下创建lee这个文件,输出为非0,执行脚本,此时vip飘到ka2上面
touch /mnt/lee
sh /etc/keepalived/test.sh
echo $?
1

ka1上面:

ka2上面:

3.8 keepalived-haproxy实现高可用

3.8.1 还原状态

两台ka1和ka2上安装haproxy
yum install haproxy -y

把两台server机上面的VIP和arp响应给去掉:
[root@realserver1 ~]# ip a d 172.25.254.100/32 dev lo
[root@realserver2 ~]# ip a d 172.25.254.100/32 dev lo

arp响应:
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf

net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0

sysctl --system   ---- 查看


ka1和ka2上都开启内核路由:
[root@ka1 ~]# vim /etc/sysctl.conf 
[root@ka2 ~]# vim /etc/sysctl.conf 

et.ipv4.ip_nonlocal_bind=1    ---- 两台都开启内核路由

sysctl -p    ----- 刷新一下

记住要把之前做的LVS给注释掉,lvs和haproxy不能同时使用!!!!
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka2 ~]# vim /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 3 fall 2 rise 5
    server web1 172.25.254.120:80 check inter 3 fall 2 rise 5

查看端口是否开启:
[root@ka1 ~]# netstat -antlupe | grep haproxy
tcp        0      0 0.0.0.0:5000            0.0.0.0:*     LISTEN      0          315293     20936/haproxy       
tcp        0      0 172.25.254.100:80       0.0.0.0:*     LISTEN      0          315291     20936/haproxy       
udp        0      0 0.0.0.0:50163           0.0.0.0:*                 0          315292     20934/haproxy 

3.8.2 实现haproxy高可用
如何检测haproxy的存活状态:
killall -0 haproxy

写入之前示例的那个脚本:
[root@ks2 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy

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

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
    #preempt_delay 5s
    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
	}    
}

systemctl restart keepalived.service
3.8.3 测试

复制一个ka1出来,写个死循环:
while true
>do
>curl 172.25.254.100;sleep 0.5
>done

把ka1上的haproxy挂掉,这边不会受影响,一直循环,VIP会飘到ka2上面

把ka1上面的haproxy给挂掉:

[root@ka1 ~]# systemctl stop haproxy.service
此时ka1上面没有VIP了

查看ka2上面:

把ka1上面的haproxy重新启动,VIP又回来了
systemctl start haproxy.service

死循环也不会受影响,因为ka1上面haproxy挂掉了,ka1上的VIP优先级降低,飘到ka2上面去了,ka2上面的haproxy还存活,也有VIP,所以死循环会一直能访问。最终不会影响架构的最终访问。

至此,keepalived-haproxy就实现了高可用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker容器挂载USB串口设备

1、在容器所在宿主机确认USB串口设备 有两种方法可以将USB设备挂载到容器中: 使用--privileged参数或者使用--device参数 --prvleged参数可以让容器拥有主机的所有特权&#xff0c;包括所有可以访问USB设备。--device参数可以针对特定的设备挂载到容器中。 [rootdocker40 ~]…

【经验总结】ShardingSphere+Springboot-01模式参数配置

文章目录 详细配置&#xff08;boot&#xff09;一、模式配置&数据源配置1.1 模式配置1.2 数据源配置1.3 默认数据源的配置默认数据源配置结论 二、基础属性配置2.1 在日志中打印 SQL2.2 在程序启动和更新时&#xff0c;是否检查分片元数据的结构一致性 详细配置&#xff0…

JavaScript高阶笔记总结第三天:(JavaScript高阶完结)

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; js高阶笔记总结&#xff1a; 严格模式&#xff1a; 1.开启严格模式&#xff1a;"use strict" 2.不使用var关键字声明会报错 3.严格模式下普通函数的this指向undefined 高阶函数&#xff1a; 满足…

浅谈C/C++指针和引用在Linux和Windows不同环境下的编码风格

目录 0. 前言 1. 代码块、函数体上的 { } 的规范 2. 指针和引用中的 * 和 & 符号的位置 1. Linux 环境下编码风格(gcc) 2. Windows 环境下编码风格(Visual Studio) 3. 简单总结 0. 前言 C/C因为高度的自由性&#xff0c;并没有对一些常见的编码风格进行限制&#…

https://registry.nlark.com/无法访问

先上问题&#xff1a; own up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOU…

电动自行车出海黑马Avento独立站拆解(上)丨出海笔记

这次我们来拆解一个电动自行车的独立站 为什么选电动自行车&#xff1f; 因为全球疫情&#xff0c;带来出行问题——避免聚集&#xff0c;大家都减少了公共交通工具&#xff0c;而改为自行车&#xff0c;电动自行车...... 君不见疫情之后无论是出行自行车&#xff0c;还是健…

NMAP扫描器的使用

NMAP 一 概述 nmap是一个网络探测和安全扫描工具,系统管理者和个人可以使用这个软件扫描大型的网络&#xff0c;获取 哪台主机正在运行以及提供什么服务等信息。 nmap可用于 检测活在网络上的主机(主机发现)。 检测主机上开放的端口(端口发现)。 检测到相应的端口(服务发现…

cisp-pte考试复盘

考试客户端下载-->点击进入考试>输入密码->进去可以看见一个qax的登录框【监考员会告知账户密码】->进入考试页面 里面的操作题,点击开始答题,能看见一个题有一个攻击机,这时我们需要点击鼠标左键,看见一个控制台,点击控制台才能进入答题【双击是没有用的】 …

C/C++开发,opencv内置背景减除算法与运动检测

目录 一、c opencv 背景减除算法内置算法 1.1 MOG2算法 1.2 KNN算法 二、完整案例实现 2.1 程序代码 2.2 程序编译及输出 一、c opencv 背景减除算法内置算法 背景减除算法的目标是将视频帧中的背景与前景&#xff08;通常是移动的对象&#xff09;分离。OpenCV提供MOG2&…

数据结构-排序的概念、应用及其算法实现1(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序)

本篇文章主要讲解直接插入排序、希尔排序、选择排序、堆排序、冒泡排序算法实现以及时间复杂度&#xff0c;稳定性分析。将在接下来的文章讲解快速排序、归并排序和计数排序。 本文全部代码在文章最后 目录 一、常见的排序算法 a.排序实现的接口 1.1插入排序 1.1.1基本思想…

【C++】BFS解决边权唯一的最短路径问题

目录 介绍 迷宫中离入口最近的出口 算法思路 代码实现 最小基因变化 算法思路 代码实现 单词接龙 算法思路 代码实现 为高尔夫比赛砍树 算法思路 代码实现 介绍 最短路问题是图论中非常经典的一种问题,其实就是通过代码找到两点之间的最优路径(往往是距离最短),最…

用MobaXterm,TightVNC和secure SSH实现两台windows电脑之间的连接和通信

今天给大家分享一个非常有趣的技术&#xff0c;那便是如何使用MobaXterm来实现两台电脑之间的通信。实验成功&#xff0c;保证能跑。 首先&#xff0c;给大家介绍我们今天最重要的工具&#xff1a;那便是MobaXterm&#xff08;以下由ChatGPT生成&#xff09;&#xff1a; Moba…

C++初阶_2: inline内联函数 宏函数

C推出了inline关键字&#xff0c;其目的是为了替代C语言中的宏函数。 我们先来回顾宏函数&#xff1a; 宏函数 现有个需求&#xff1a;要求你写一个Add(x,y)的宏函数。 正确的写法有一种&#xff0c;错误的写法倒是五花八门&#xff0c;我们先来“见不贤而自省也。” // …

我怎么会这么依赖 GUI?

AWS CLI、.NET 和 Lambda 函数 欢迎来到雲闪世界。在 Windows 上使用 Visual Studio 和 AWS Explorer 绝对会让你变得懒惰。我的意思是&#xff0c;能够通过右键单击项目来构建和部署 Lambda 函数之类的东西真是太棒了&#xff0c;但有时最好了解幕后发生了什么。 尽管如此&am…

Java - 异常

异常处理&#xff1a; ①捕获异常 选中代码后ctrlAltt: try catch捕捉异常 ②抛出异常 加上throws 异常类型 自定义异常 Exception.java: package Exception;//自定义运行时异常 public class ExceptionTest {public static void main(String[] args) {//保存一个合法的年…

知识库管理软件购买指南:2024年十大选择

本篇文章介绍了以下工具&#xff1a;PingCode、Worktile、蓝湖、语雀、幕布、Guru、Helpjuice、Stack Overflow for Teams、KnowledgeOwl、eXo Platform。 在企业中&#xff0c;信息分散、难以获取是个常见的痛点。无论是新员工入职、团队协作&#xff0c;还是项目管理&#xf…

电脑高手必备!这款数据恢复神器你值得拥有

哎呀&#xff0c;现在我们天天在用的手机、电脑和各种移动设备都是有很多日常和工作中的重要数据&#xff0c;丢失重要的文件和数据的时候就很着急&#xff0c;所以我也很感同身受&#xff0c;为此困扰过我好几次&#xff0c;所以今天特地借此文章整理了常用的失易得数据恢复软…

Unity游戏开发002

Unity游戏开发002 目录 第一章&#xff1a;Hello&#xff0c;Unity&#xff01;第二章&#xff1a;创建一个游戏体 本文目录 Unity游戏开发 Unity游戏开发002目录本文目录前言一、创建一个游戏体1. 编辑器语言设置2. 创建游戏对象的两种方法3. 快速复制和粘贴物体4. 注意事项…

/springmvc/xxx.html和/springmvc/xxx的区别

起因&#xff1a; 今天在访问webapp目录下的html文件时&#xff0c;突然报了500错误&#xff08;如下图&#xff09;&#xff0c;让我检查视图解析器&#xff0c;我寻思我访问的是静态资源&#xff0c;不是直接交给servlet处理嘛&#xff1f;需要什么视图解析器&#xff1f;&a…

13.C基础_预处理

预处理语句就是以#开头的语句。这些语句类型如下&#xff1a; #include&#xff1a;包含头文件#define&#xff1a;宏定义#undef&#xff1a;取消宏定义#ifdef&#xff0c;#endif&#xff1a;成对使用&#xff0c;判断是否定义了某个宏 宏定义 宏定义的本质就是原样替换&…