" /> " />

目 录CONTENT

文章目录

Keepalived + nginx 高可用

Administrator
2024-10-28 / 0 评论 / 0 点赞 / 23 阅读 / 26090 字

背景

什么是高可用?
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

解决的问题?
在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。

虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived来实现Nginx

的高可用。

双机热备方案
这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。

keepalived是什么?

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

故障转移机制

Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。

在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

keepalived介绍

keepalived是基于`VRRP`(Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)协议实现的`LVS`(LinuxVirtual Server ,Linux虚拟服务器)服务高可用方案。主要提供了负载均衡和高可用功能,用来避免单点故障。负载均衡是通过linux的IPVS(ip虚拟服务器)实现,高可用通过VRRP实现多机故障转移。

[什么是VRRP,VRRP有哪些应用? - 华为](https://info.support.huawei.com/info-finder/encyclopedia/zh/VRRP.html)

虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信

当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信

VRRP概述:
VRRP路由器(VRRP Router):运行VRRP协议的设备,它可能属于一个或多个虚拟路由器。
虚拟路由器(Virtual Router):又称VRRP备份组,由一个Master设备和多个Backup设备组成,被当作一个共享局域网内主机的缺省网关。
Master路由器(Virtual Router Master):承担转发报文任务的VRRP设备。
Backup路由器(Virtual Router Backup):一组没有担转发任务的VRRP设备,当Master设备出现故障时,它们将通过竞选成为新的Master设备。
VRID:虚拟路由器的标识。
虚拟IP地址(Virtual IP Address):虚拟路由器的IP地址,一个虚拟路由器可以有一个或多个IP地址,由用户配置。
IP地址拥有者(IP Address Owner):如果一个VRRP设备将虚拟路由器IP地址作为真实的接口地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,通常它将成为Master。
虚拟MAC地址(Virtual MAC Address):虚拟路由器根据虚拟路由器ID生成的MAC地址。一个虚拟路由器拥有一个虚拟MAC地址,**格式为:00-00-5E-00-01-{VRID}(VRRP for IPv4);00-00-5E-00-02-{VRID}(VRRP for IPv6)。**当虚拟路由器回应ARP请求时,使用虚拟MAC地址,而不是接口的真实MAC地址。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_38265137/article/details/80404440

报文信息查看上面的链接

keepalived一般是2个节点运行keepalived,一台是`主节点(MASTER`),一台是`备节点(BACKUP)`,`对外`表现都是`一个虚拟IP`,主节点会发送特定的消息给备节点,如果备节点收不到这个特定消息时,说明`主节点就宕机`了,此时`备节点就会接管虚拟IP`进行服务提供,这就实现了高可用。

备注:

指 Linux 操作系统中的一种虚拟服务器技术。IPVS 是 "IP Virtual Server" 的缩写,它是一个内核模块,可以运行在 Linux 系统上,为网络服务提供负载均衡功能。

iptables、ipset 和 ipvs 是 Linux 系统中用于网络流量管理和负载均衡的工具,它们在 kube-proxy 中协同工作,以实现 Kubernetes 的 Service 功能。以下是对它们的详细解释:

iptables
iptables 是 Linux 内核中的一个功能强大的防火墙工具,用于配置 IP 数据包过滤规则。它通过链(chains)和规则(rules)来决定数据包的处理方式,如接受、拒绝或修改数据包。iptables 可以用于 NAT(网络地址转换)、过滤和修改数据包等。

在 Kubernetes 中,kube-proxy 使用 iptables 来实现 Service 的负载均衡。具体来说,kube-proxy 会为每个 Service 创建一系列 iptables 规则,将流量从 Service 的虚拟 IP 地址(ClusterIP)转发到后端的 Pod IP 地址。

ipset(内蒙专属云部署的时候92的执行机器就使用ipset设置过ip白名单)
ipset 是 iptables 的一个扩展,用于创建和管理 IP 地址集合。ipset 允许你将一组 IP 地址或网络地址作为一个整体来处理,而不是为每个 IP 地址单独创建 iptables 规则。这大大提高了规则管理的效率,特别是在处理大量 IP 地址时。

在 Kubernetes 中,kube-proxy 使用 ipset 来管理 Service 后端的 Pod IP 地址集合。通过 ipset,kube-proxy 可以更高效地更新和维护 iptables 规则,尤其是在 Pod 频繁变化的情况下。

ipvs
IP Virtual Server (IPVS) 是 Linux 内核中的一个高性能负载均衡模块,专门用于处理大规模的网络流量。IPVS 支持多种负载均衡算法,如轮询(Round Robin)、最小连接(Least Connections)等。

在 Kubernetes 中,kube-proxy 可以选择使用 IPVS 来替代 iptables 进行负载均衡。IPVS 提供了更高的性能和更低的延迟,特别是在处理大量并发连接时。IPVS 通过在内核中直接处理数据包,减少了用户空间和内核空间之间的切换,从而提高了效率。

总结
iptables:用于配置数据包过滤和 NAT 规则,kube-proxy 使用它来实现基本的负载均衡。

ipset:用于管理 IP 地址集合,提高 iptables 规则管理的效率。

ipvs:提供高性能的负载均衡,kube-proxy 可以选择使用它来替代 iptables,以获得更好的性能。

IPVS 通过在 Linux 内核中实现一个虚拟的 IP 地址,将网络流量分发到后端的多个真实服务器上,从而实现负载均衡。这种方法可以提高网络服务的可用性和扩展性,因为当某个服务器出现问题时,流量可以被自动重新分配到其他健康的服务器上。

IPVS 支持多种负载均衡算法,包括轮询(round-robin)、最少连接(least-connection)和加权轮询(weighted round-robin)等,可以根据实际需求选择合适的算法来分配流量。

(IPVS 可以将对基于 TCP 和 UDP 的服务的请求定向到真实服务器,并使真实服务器的服务在单个[IP 地址](https://en.wikipedia.org/wiki/IP_address "IP 地址")上显示为虚拟服务。IPVS 建立在[Netfilter](https://en.wikipedia.org/wiki/Netfilter "网络过滤器")之上。[[ 1 ]](https://en.wikipedia.org/wiki/IP_Virtual_Server#cite_note-linuxvirtualserver-1))

源码:https://elixir.bootlin.com/linux/v5.8.18/source/net/netfilter/ipvs/ip_vs_core.c#L1

[《一篇搞懂》系列之二——IPVS_ipvs工作原理-CSDN博客](https://blog.csdn.net/qiqi_6666/article/details/130546935)

上面链接是关于ipvs的基础介绍

ipvs 只实现了 Netfilter 框架中的三个钩子,分别是:Input,Forward 和 Output,也就是加工发往本机的数据包,转发数据包以及加工从本机进程处理后的数据包。

从源码层面来看,与三个钩子相对应的函数主要有:ip_vs_remote_request, ip_vs_reply ip_vs_forward_icmp, ip_vs_local_request, ip_vs_local_reply

[ipvs 浅析 | DemonLee's Time](https://demonlee.tech/archives/2306001)

当一个请求到 ipvs 系统后,会被内核拦截,在 ipvs 系统处理后(即上面提到的钩子),再发往后端真实的服务器,后端服务器回复的消息也 可能 会走 ipvs,经过转换后,再转发给原请求客户端

[ipvs 浅析 | DemonLee's Time](https://demonlee.tech/archives/2306001)

部署架构

keepalived和nginx部署在一台服务器

高可用

keepalived是基于VRRP协议来实现高可用的,有两种模式,一种是抢占模式(默认使用),另一种是非抢占模式,需配置nopreempt,在后面的keepalived配置文件详解中我们会讲到。当使用抢占模式的时候,这是一种竞选机制进行通信,主节点优先级大于备节点优先级。当主节点宕机的时候,可以切到备节点进行提供服务。

抢占模式原理如下:

  1. keepalived正常工作的时候,MASTER主节点会向BACKUP备节点不断的发送特定消息(多播心跳消息),就是一种健康检查机制,告诉备节点“我还活着,虚拟IP我来管就行了!”。

  2. 当主节点发生故障出现宕机情况的时候,无法向备节点发送心跳信息,备节点无法收到主节点的健康检查心跳信息,这个时候,备节点终于转正了,机会来了,就接管虚拟IP进行服务提供。

  3. 当主节点故障恢复后,又不断的发送心跳给备节点,告知“我现在活着呢,我来管虚拟IP”,备节点就会释放主节点宕机时所接管的IP资源以及服务,默默的做回一个备机

部署

信息

  • 主:{ip}.5

  • 从:{ip}.6

  • 虚拟IP:{ip}.66

从虚拟IP访问,在主正常的时候,优先从主keepalived访问nginx,nginx再请求应用服务

keepalived

yum -y install keepalived

rpm -q -a keepalived

ls /etc/keepalived

常用命令

更改keepalived配置

$ cd /etc/keepalived
$ vim keepalived.conf
主要修改分配的虚拟ip地址等配置。
启动keepalived

$ systemctl start keepalived.service 或者 $ service keepalived start
其他相关命令
1)重启:
$ systemctl restart keepalived.service
2)停止:
$ systemctl stop keepalived.service
3)状态:
$ systemctl status keepalived.service
4)设置开机启动:
$ chkconfig keepalived on
查看keepalived状态

$ systemctl status keepalived.service

主备高可用

! Configuration File for keepalived

global_defs {
   # notification_email { # 邮件通知,一般不用
   #   test1@163.com
   #   test2@163.com
   # }
   # notification_email_from test@163.com
   router_id hostname1 # 标识本节点的字符串,设置为hostname即可
}

vrrp_instance VI_1 {
    state MASTER	# 标识主节点服务(只有MASTER和BACKUP两种,大写)
    interface eth0	# VIP绑定的网卡接口
    virtual_router_id 52	# 虚拟路由id,和备节点保持一致,注意有范围限制
    priority 100	# 优先级,高于备节点的即可。
    # nopreempt		# 禁止MASTER宕机恢复后抢占服务
    # smtp_alert		# 激活故障时发送邮件告警
    # mcast_src_ip 10.139.1.10	# 本机IP地址,这个参数有些文档有,没看到具体功能
    advert_int 1	# MASTER和BACKUP节点之间的同步检查时间间隔,单位为秒
    authentication {	# 验证类型和验证密码
        auth_type PASS	# PAAS(默认),HA
        auth_pass 1111	# MASTER和BACKUP使用相同明文才可以互通
    }
    virtual_ipaddress {	# 虚拟IP地址池,可以多个IP
        {vip} # 虚拟IP1(VIP)
        {vip} # 虚拟IP2(VIP)
    }
}

同上面主节点的配置

实际配置

[root@NMA04-304-D-05-SEV-DELLR740-02U17 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {  #全局定义
   #notification_email {  # 定义发送故障通知邮件的地址列表
   #  acassen@firewall.loc  # 管理员接受邮件,在服务故障的时候
   #  failover@firewall.loc  # 用于接收故障转移通知。可以是专门的故障处理团队的邮箱
   #  sysadmin@firewall.loc  # 系统管理员的邮箱地址,通常用于接收系统的状态更新和故障通知
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   #router_id LVS_DEVEL  # 指定一个唯一的路由器 ID,用于标识该实例。这在 VRRP(虚拟路由冗余协议)中是非常重要的,因为它帮助其他节点识别和区分主节点和备份节点。通常使用字符串或数字。
   #vrrp_skip_check_adv_addr  # 这个参数控制是否跳过检查 VRRP 广播地址的合法性。在某些情况下,可以允许不进行此检查,以避免因网络配置不当而导致的故障
   #vrrp_strict # 启用严格模式。启用后,只有当主节点处于 MASTER 状态时,才能发送 VRRP 广告。这可以增加系统的稳定性,确保只有主节点在虚拟路由器的存在
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}
vrrp_script chk_http_ port {
    script "/usr/local/src/nginx_check.sh"   #检测脚本
    interval 2   # (检测脚本执行的间隔)2s
    weight 2  #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {  # VRRP 
    state MASTER  # 主从设置
    interface bond1  # 网卡
    virtual_router_id 52  # 为实例指定唯一的虚拟路由id
    priority 100  # 设置节点的优先级。数字越大,优先级越高。在出现故障时,优先级较高的节点将成为新的主节点
    advert_int 1  # 主节点发送 VRRP 广告的频率。较短的间隔有助于更快地检测故障
    authentication {  # 身份验证
        auth_type PASS
        auth_pass {passwd}
    }
    track_script {
        chk_http_ port  #(调用检测脚本)
    }
    virtual_ipaddress {  # 虚拟ip列表
        {ip}
    }
}

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# 以下为默认配置

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

特殊说明

vrrp_garp_interval
定义:vrrp_garp_interval 用于设置发送 GARP(组播地址解析协议)消息的时间间隔。GARP 主要用于在网络中通知其他设备某个 IP 地址的所有权已经转移。

功能:当 VIP(虚拟 IP)从一个节点转移到另一个节点时,新的主节点需要发送 GARP 消息,以告诉网络中的其他设备(如交换机和路由器)这个 IP 地址现在是由新的主节点控制的。这样可以确保流量正确路由到新的主节点。

设置为 0:将该值设置为 0 表示禁用 GARP 消息的发送。这意味着在 VIP 迁移时,网络中的其他设备不会收到更新通知,可能导致短暂的流量中断,因为设备仍可能将流量发送到旧的主节点。

vrrp_gna_interval
定义:vrrp_gna_interval 用于设置发送 GNA(组播网络地址)消息的时间间隔。GNA 消息用于主动更新网络中其他设备的路由信息。

功能:当 VIP 或网络拓扑发生变化时,新的主节点可以通过发送 GNA 消息,告知其他设备关于 IP 地址或路由信息的变化。这有助于确保网络设备使用最新的路由信息,减少因信息滞后而导致的流量问题。

设置为 0:将该值设置为 0 表示禁用 GNA 消息的发送。这意味着在 VIP 迁移或其他网络变化时,其他设备不会接收到更新的路由信息,可能导致不必要的路由延迟或流量丢失。

总结
GARP 和 GNA 的重要性:GARP 和 GNA 的功能在于确保网络设备能够及时了解 IP 地址的所有权变化和路由信息更新,从而减少故障转移或网络变更时的流量中断。禁用这些功能可能会在网络环境中导致不稳定性,特别是在需要高可用性和快速故障转移的场景下。

默认配置

virtual_server 10.10.10.2 1358 {# 定义一个虚拟服务器,IP 地址为 10.10.10.2,监听端口 1358。所有发送到这个虚拟服务器的请求都会被分配到后端真实服务器
    delay_loop 6 #检测后端服务器状态的时间间隔(单位为秒)
    lb_algo rr  # 设置负载均衡算法为轮询(rr),即请求会在后端服务器之间轮流分配
    lb_kind NAT
    persistence_timeout 50 #会话保持超时时间(单位为秒),用于确保在此期间相同的客户端请求会被发送到同一后端服务器,以维持会话状态
    protocol TCP

    sorry_server 192.168.200.200 1358 # 定义一个备用服务器,当所有真实服务器不可用时,将请求转发到这个备用服务器

    real_server 192.168.200.2 1358 {#定义一个后端真实服务器,IP 地址为 192.168.200.2,监听端口为 1358。
        weight 1# 权重越高,分配到该服务器的请求就越多
        HTTP_GET {# 用于配置对该真实服务器的健康检查,采用 HTTP GET 请求
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3#超时时间
            nb_get_retry 3#重试次数
            delay_before_retry 3#重试之前的延迟时间S
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

特殊说明

lb_kind NAT 的详细解释
lb_kind NAT 表示在负载均衡过程中使用网络地址转换(NAT)方式。以下是这个设置的具体细节:

工作原理
虚拟服务器:当客户端请求到达虚拟 IP 地址(VIP)时,Keepalived 会将这个请求接收并处理。

地址转换:NAT 会将请求的目的地址(VIP)转换为真实服务器的 IP 地址(例如 192.168.200.2 或 192.168.200.3)。这个过程称为地址映射。

请求转发:转换后的请求会被转发到选定的真实服务器。真实服务器响应后,流量会返回给 Keepalived。

响应处理:Keepalived 会将来自真实服务器的响应数据包的源地址(真实服务器的 IP)转换回虚拟 IP 地址,然后再将响应发送回客户端。这样,客户端只与虚拟 IP 地址交互,无法直接知道后端真实服务器的存在。

备注

VIP 绑定Keepalived 会将配置中指定的虚拟 IP(VIP)绑定到所选的网络接口上(如 eth0)。这样,所有向该 VIP 发送的请求都会自动路由到绑定该 VIP 的主机,Nginx默认是80端口,所以在不显示配置的时候也会转发到nginx

nginx

yum install -y nginx
[root@NMA04-304-D-05-SEV-DELLR740-02U17 ~]# rpm -q -a nginx
nginx-1.20.1-10.el7.x86_64

nginx保活检查

可写在keepalived指定检查脚本

#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        
      systemctl start nginx                #重启nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              killall keepalived                    
      fi
fi

chmod +755 /usr/local/src/nginx_check.sh

配置nginx

将{ip}解析到k8s的集群里,因为服务使用的是nodeport,访问任意节点的nodeport,就会转发到对应服务所在机器的IP+nodeport上

    upstream backend_servers {
       server ip.6:31841;
       server ip.7:31841;
       server ip.13:31841;
       # 添加更多服务器
    }
    server {
        listen 80;
        server_name ip.66;
        # server_name {ip};
        client_max_body_size 1024m;
        # 如果请求的 Host 不是 域名,则返回 403 Forbidden
        #if ($http_host != "域名") {
        #    return 403;
        #}
	location / {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

验证

主正常

nginx和keepalived

● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-10-28 13:08:52 EDT; 32min ago
  Process: 157796 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 157797 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─157797 /usr/sbin/keepalived -D
           ├─157799 /usr/sbin/keepalived -D
           └─157800 /usr/sbin/keepalived -D
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-10-28 13:07:19 EDT; 34min ago
  Process: 157609 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 157605 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 157602 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 157610 (nginx)
   CGroup: /system.slice/nginx.service

通过虚拟IP访问,可以转发到nginx,并访问服务

[root@NMA04-304-D-06-SEV-DELLR740-02U17 ~]# ip addr|grep bond1
2: em1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond1 state UP group default qlen 1000
6: p4p1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond1 state UP group default qlen 1000
9: bond1: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet {ip}.5/25 brd 30.255.255.255 scope global bond1
    inet {ip}.66/32 scope global bond1

{ip}.66是我们的虚拟IP,这个时候发现在主keepalived上,单播,掩码为 32 的这个虚拟ip被绑定到bond1的网口上

关闭主

主节点执行:systemctl stop keepalived.service

从节点:新增Oct 28 12:59:00 NMA04-304-D-06-SEV-DELLR740-02U17 Keepalived_vrrp[59926]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on bond1 {ip}
日志信息 Oct 28 12:59:00 NMA04-304-D-06-SEV-DELLR740-02U17 Keepalived_vrrp[59926]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on bond1 for {ip} 表示 keepalived 正在发送或排队发送 Gratuitous ARP(免费 ARP)消息,以通知网络中的其他设备 {ip} 这个虚拟 IP 地址(VIP)已经绑定到 bond1 接口。

详细解释
1. Gratuitous ARP
Gratuitous ARP(免费 ARP)是一种特殊的 ARP 请求,用于通知网络中的其他设备某个 IP 地址的 MAC 地址已经发生了变化。Gratuitous ARP 消息通常用于以下场景:

IP 地址冲突检测:当设备接收到一个 Gratuitous ARP 响应时,如果响应中的 IP 地址与本地接口的 IP 地址相同,则表示发生了 IP 地址冲突。

通知 IP 地址变更:当设备的 IP 地址发生变化时,发送 Gratuitous ARP 消息通知网络中的其他设备更新 ARP 缓存。

2. 日志信息
VRRP_Instance(VI_1):表示 VRRP 实例 VI_1。

Sending/queueing gratuitous ARPs:表示正在发送或排队发送 Gratuitous ARP 消息。

on bond1:表示 Gratuitous ARP 消息将通过 bond1 接口发送。

for {ip}.66:表示 Gratuitous ARP 消息用于通知 {ip}.66 这个 IP 地址的变更。

为什么发送 Gratuitous ARP
当 keepalived 将 VIP 绑定到某个网络接口时,它会发送 Gratuitous ARP 消息,以通知网络中的其他设备更新 ARP 缓存。这样可以确保其他设备能够正确地将流量发送到新的 VIP 地址。

配置 keepalived 发送 Gratuitous ARP
在 keepalived 配置文件中,你可以通过 vrrp_garp_interval 参数来控制 Gratuitous ARP 消息的发送间隔。默认情况下,vrrp_garp_interval 设置为 0,表示不发送 Gratuitous ARP 消息。你可以将其设置为一个非零值,以控制 Gratuitous ARP 消息的发送频率。
inet {ip}.12/25 brd 30.255.255.255 scope global bond1
inet {ip}.66/32 scope global bond1

{ip}.66是我们的虚拟IP,这个时候发现在主keepalived上,单播,掩码为 32 的这个虚拟ip被绑定到bond1的网口上

在不同机器上curl 虚拟ip地址,响应正常,实现高可用

切主

关闭从节点,虚拟IP自动绑定到主节点的bond1网口

keepalived定义

VRBP

# 组
vrrp_sync_group string {
    group {
        string
        string
    }
    # 可以为脚本传递参数,整体用引号包围
    notify_master /path_to_script/script_master.sh
    notify_backup /path_to_script/script_backup.sh
    notify_fault /path_to_script/script_fault.sh
}
 
# 默认情况下,Keepavelid只能对网络故障、Keepalived自身故障进行监控,并依此进行Master切换
# 使用vrrp_script则可以通过脚本进行自定义的(对本节点)健康检查
 
vrrp_script chk {
   script "/bin/bash -c 'curl -m1 -k -s https://127.0.0.1:6443/healthz -o/dev/null'"
   # 每两秒执行一次
   interval 2
   # 如果检测成功(脚本结果为0),且weight大于0,则当前实例的优先级升高
   # 如果检测失败(脚本结果为非0),且weight小于0,则当前实例的优先级降低
   weight -10
   # 连续3次为0才认为成功
   fall 3
   # 连续1次失败则认为失败
   rise 1
}
# 实例
vrrp_instance string {
    # 实例状态
    # 如果所有实例都配置为BACKUP,则初始时高优先级的成为第一个Master
    # 如果一个设置为MASTER其它设置为BACKUP,那么不设置nopreempt时每当Master恢复都会强占成为主
    state MASTER|BACKUP
    # 高优先级的实例恢复正常后,不会去强占,成为Master
    nopreempt
    # 使用的网络接口
    interface string
    # <span style="color: #404040;" data-mce-style="color: #404040;">VRRP通知的IP头上的IP地址</span>
    mcast_src_ip @IP
    # LVS sync_daemon在什么网络接口上运行
    lvs_sync_daemon_interface string
    # 此实例所属的虚拟路由器ID
    virtual_router_id num
    # 优先级,其运行时值可以随着vrrp_script的检测结果动态变化
    # 如果接收到Peer的vrrp广播包,发现自己的优先级最高,则自动切换为Master
    priority num
    # VRRP通知间隔
    advert_int num
    # 当MASTER状态变化时进行邮件通知
    smtp_alert
    # VRRP身份验证配置
    authentication {
        auth_type PASS|AH
        auth_pass string
    }
    # 定义虚IP
    virtual_ipaddress {
        @IP
        @IP
        @IP
    }
    # 排除虚IP
    virtual_ipaddress_excluded {
        @IP
        @IP
        @IP
    }
    # 进入MASTER状态后执行的脚本
    notify_master /path_to_script/script_master.sh
    # 进入BACKUP状态后执行的脚本
    notify_backup /path_to_script/script_backup.sh
    # 进入FAULT状态后执行的脚本
    notify_fault /path_to_script/script_fault.sh
}

虚拟服务器

# 提示此虚拟服务器是一个FWMARK
virtual_server (@IP PORT)|(fwmark num) {
    # 健康检查周期,秒
    delay_loop num
    # 负载均衡算法(调度算法)
    lb_algo rr|wrr|lc|wlc|sh|dh|lblc
    # IPVS模式
    lb_kind NAT|DR|TUN
    (nat_mask @IP)
    # 持久化连接,即会话亲和,让一段时间内同一客户端的连接(短)都发送到同一个RS
    # 持久化连接的超时
    persistence_timeout num
    # 持久化连接的粒度掩码
    persistence_granularity @IP
    # 用于HTTP/SSL_GET的虚拟主机名
    virtualhost string
    # 协议类型
    protocol TCP|UDP
    # 如果所有RS宕机,将下面的服务器加入池中
    sorry_server @IP PORT
    # 定义一个真实服务器(RS)
    real_server @IP PORT {
        # 负载均衡权重
        weight num
        # 通过TCP进行健康检查
        TCP_CHECK {
            connect_port num
            connect_timeout num
        }
    }
    real_server @IP PORT {
        weight num
        # 通过脚本进行健康检查
        MISC_CHECK {
            misc_path /path_to_script/script.sh
            (or misc_path “ /path_to_script/script.sh <arg_list>”)
        }
    }
}
real_server @IP PORT {
    weight num
    # 通过HTTP/HTTPS进行健康检查
    HTTP_GET|SSL_GET {
        # 可以指定多个url块
        url {
            # URL路径
            path alphanum
            # 摘要信息
            digest alphanum
        }
        # 端口
        connect_port num
        # 超时
        connect_timeout num
        # 重试次数
        retry num
        # 重试延迟
        delay_before_retry num
    }
}

0

评论区