Keepalived+LVS构建高可用集群

目录

一、Keepalive基础介绍

1. Keepalive与VRRP

2. VRRP相关技术

3. 工作原理 

4. 模块

5. 架构

6. 安装

7. Keepalived 相关文件

7.1 配置组成

7.2 全局配置

7.3 VRRP实例配置(lvs调度器)

7.4 虚拟服务器与真实服务器配置 

二、Keepalived结合LVS负载均衡

1. 环境准备

2. 实际操作

三、Keepalived优化 

1. 非抢占与延时抢占

2. 单播与多播 

3. 通知脚本

4. 日志功能

5. 模拟脑裂

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

6.1 VRRP Script 配置

6.2 定义 VRRP script


一、Keepalive基础介绍

1. Keepalive与VRRP

Keepalive 是一种用于监视系统或服务是否处于活动状态的机制。在网络环境中,它通常指定一个周期性的信号或数据包,用于检测设备、服务或连接是否仍然处于活动状态。如果设备或服务停止响应,相应的监视器将触发警报或采取预定义的操作。

VRRP 是一种用于提供冗余路由器功能的协议,通过允许多个路由器共享同一个虚拟 IP 地址来提供冗余。这样,即使其中一个路由器失效,网络流量仍然可以被另一个路由器接管,从而保证了网络的连通性和可用性。

这两种技术通常结合使用,因为 Keepalive 可以用于监视 VRRP 路由器的活动状态。如果 VRRP 主要路由器失效,备份路由器可以通过接收不再有主要路由器发送的 keepalive 信号来检测到这一事件,并迅速接管虚拟 IP 地址,从而确保网络的连通性。

2. VRRP相关技术

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

工作方式:抢占式,非抢占式,延迟抢占模式

安全认证:如没有安全认证,不在集群中的keeplive服务器设置超高的优先级,会造成事故

工作模式:

  • 主/备:单虚拟路径器

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

3. 工作原理 

Keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议,保证集群高可用的一个服务软件,用来防止单点故障。将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。

IPV4总共三种通信方式:单播,组播,广播。组播是指以224.0.0.0地址作为通信地址的一种方式。

4. 模块

分别是core、check和vrrp。

  • core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
  • check负责健康检查,包括常见的各种检查方式。
  • vrrp模块是来实现VRRP协议的。 

5. 架构

用户空间核心组件:

① vrrp stack:VIP消息通告,用来管理虚拟ip

② checkers:监测real server(简单来说 就是监控后端真实服务器的服务)是否存活

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

④ SMTP:邮件组件(报警邮件)

⑤ IPVS wrapper:生成IPVS规则(直接生成ipvsadm)

⑥ Netlink Reflector:网络接口(将虚拟地址ip(vip)地址飘动)

⑦ WatchDog:监控进程(整个架构是否有问题)

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

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

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

6. 安装

① yum安装:yum install keepalived -y

② 官网下载安装包,编译安装:Keepalived for Linux

7. 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 CentOS

7.1 配置组成

/etc/keepalived/keepalived.conf 配置组成

① 全局配置:这部分包括全局参数的定义,例如进程 ID 文件、日志文件路径、通知邮箱地址等。全局配置通常用于指定整体行为和设置。

② 模块配置:Keepalived 配置文件中会包含关于 VRRP 或者 LVS 模块的配置。对于 VRRP 模块,需要定义虚拟路由器的标识符、优先级、虚拟 IP 地址以及监视其他路由器可用性所需的健康检查。对于 LVS 模块,需要定义负载均衡器的设置,包括虚拟服务器、后端服务器池、负载均衡算法等。

③ VRRP 实例配置:在 VRRP 模式下,配置文件中会包含一个或多个 VRRP 实例的配置。每个实例都会定义一个独立的虚拟路由器,包括其标识符、优先级、虚拟 IP 地址、健康检查设置等。

④ LVS 实例配置:在 Load Balancer 模式下,配置文件中会包含一个或多个 LVS 实例的配置。每个实例会定义一个独立的负载均衡服务,包括虚拟服务器、后端服务器池、负载均衡算法等设置。

⑤ 状态转换脚本:Keepalived 允许用户定义状态转换时执行的自定义脚本,这些脚本可以在主备切换时执行特定的操作,如通知管理员、启动或停止相关服务等。

7.2 全局配置

全局配置参数定义了邮件通知设置、路由器标识符以及 VRRP 的一些行为特性,确保在需要时可以进行状态通知,并控制 VRRP 协议的一些细节行为。

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 服务器的地址为 192.168.200.1
   smtp_connect_timeout 30       #SMTP 连接超时时间为 30 秒
   router_id LVS_DEVEL           #指定了路由器的标识符为 LVS_DEVEL
   vrrp_skip_check_adv_addr      #表示在 VRRP 状态转换时跳过对广播地址的检查
   vrrp_strict                   #启用严格模式,要求 VRRP 实例只能在其配置的网络接口上工作
   vrrp_garp_interval 0          #设置 Gratuitous ARP(GARP)消息发送的间隔时间为 0,即禁用 GARP
   vrrp_gna_interval 0           #设置 Gratuitous Neighbor Advertisement(GNA)消息发送的间隔时间为 0,即禁用 GNA
#GARP 是指发送者在不请求的情况下主动发送 ARP 响应消息
#GNA 是 IPv6 网络中的类似协议,它也是主动发送者在不请求的情况下向网络上的其他设备发送邻居通告消息。类似于 GARP
 vrrp_mcast_group4 224.0.0.18 
 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18;建议使用特有的组播地址或者改为单播
 vrrp_iptables        
 #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}

7.3 VRRP实例配置(lvs调度器)

共同定义了一个 VRRP 实例的属性、身份验证设置以及与其关联的虚拟 IP 地址,使得 Keepalived 能够管理虚拟路由器的状态,并确保在故障时能够进行适当的状态转换。

vrrp_instance VI_1 {      #定义了一个名为 VI_1 的 VRRP 实例,用于创建一个虚拟路由器实体(lvs虚拟调度器)
    state MASTER          #指定该实例的初始状态为 MASTER,即主服务器状态。在 VRRP 中,可以将路由器配置为主服务器或备份服务器。
    interface eth0        #指定了 VRRP 实例所使用的网络接口,这里是 eth0
    virtual_router_id 51  #为 VRRP 实例指定了一个唯一的虚拟路由器 ID。该 ID 在同一广播域内必须是唯一的,范围:0-255
    priority 100          #设置了该实例的优先级为 100。在 VRRP 中,具有最高优先级的路由器将被选举为主服务器
    advert_int 1          #指定了 VRRP 报文的发送间隔为 1 秒。这决定了 VRRP 路由器之间交换状态信息的频率
    authentication {      #这个部分定义了 VRRP 实例的身份验证设置(认证机制)
        auth_type PASS    #指定了使用密码进行身份验证
        auth_pass 1111    #设置了用于身份验证的密码为 1111
        auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
        auth_pass <PASSWORD> #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
    }
    virtual_ipaddress {   #列出了该 VRRP 实例关联的虚拟 IP 地址列表。这些 IP 地址将会在主服务器和备份服务器之间切换,确保始终有一台服务器能够接收流量并处理数据包。生产环境可能指定上百个IP地址
        192.168.200.16              #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认为/32
        192.168.200.17/24 dev eth1  #指定了一个带子网掩码的虚拟 IP 地址,并且明确地指定了它要绑定到的网络接口(eth1)
        192.168.200.18/24 dev eth2 label eth2:1  #指定VIP的网卡label,即将这个虚拟ip绑在eth2的虚拟网卡上
    }
}
    track_interface {     #配置监控网络接口,一旦出现故障,则转为FAULT(失败)状态实现地址转移
    eth0
    eth1
    …
}

注意:当生产环境中虚拟IP过多,可以在 virtual_ipaddress{ }前加入子配置文件声明,如:include /etc/keepalived/conf.d/*.conf,删除或注释主配置文件virtual_ipaddress{ }虚拟IP部分,最后每个项目生成一个子文件夹。

7.4 虚拟服务器与真实服务器配置 

定义虚拟服务器的行为,包括负载均衡算法、持久化会话设置以及用于检查真实服务器健康状态的参数。同时,您还可以为每个真实服务器定义权重和健康检查的详细规则,以确保负载均衡系统能够有效地分发流量并监控后端服务器的状态。

virtual_server 192.168.200.100 443 {  #定义了一个虚拟服务器,监听 IP 地址为 192.168.200.100,端口为 443
    delay_loop 6               #设置检测真实服务器状态的时间间隔为 6 秒
    lb_algo rr                 #指定了负载均衡算法为 Round Robin(轮询)方式
    lb_kind NAT                #指定了负载均衡的类型为 NAT。NAT 模式将客户端的请求通过 NAT 转换后发送到后端服务器
    persistence_timeout 50     #设置了持久化会话的超时时间为 50 秒
    protocol TCP               #指定了虚拟服务器所使用的协议为 TCP

    real_server 192.168.201.100 443 {  #定义了一个真实服务器,其 IP 地址为 192.168.201.100,端口为 443
        weight 1               #设置了该真实服务器的权重为 1,用于负载均衡算法
        SSL_GET {              #这一部分定义了用于检查真实服务器健康状态的 SSL GET 请求的参数
            url {              #指定了要进行健康检查的 URL 路径,并提供了对应的摘要信息
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
        TCP_CHECK {
            connect_port 443       #检查目标端口
            connect_timeout 3      #设置了连接超时时间为 3 秒
            nb_get_retry 3         #指定了在失败时尝试重新连接的次数为 3 次
            delay_before_retry 3   #设置了重试前的延迟时间为 3 秒
            }
        }
    }
    real_server 192.168.91.105 80 {  #定义第二台真实服务器
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

二、Keepalived结合LVS负载均衡

Keepalived结合LVS构建的负载均衡系统不仅可以提高系统的可靠性和性能,还能简化管理并降低成本,是企业构建稳定、高效的网络架构的重要组成部分。

1. 环境准备

2. 实际操作

① 代理服务器7-0,7-1关闭防火墙,安装ipvsadm,keepalived

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]#yum install ipvsadm keepalived -y

② 修改代理服务器7-0keepalived服务配置

[root@localhost ~]#cd /etc/keepalived/
[root@localhost keepalived]#cp keepalived.conf keepalived.conf.bak #备份配置文件
[root@localhost keepalived]#vim keepalived.conf
10    smtp_server 127.0.0.1
12    router_id LVS_01
14    #vrrp_strict
21     interface ens33
27         auth_pass 123123
29     virtual_ipaddress {
30         192.168.190.188
31     }
34 virtual_server 192.168.190.188 80 {
37     lb_kind DR
38     persistence_timeout 0
删除43-51行,58行往后全部删除
后端真实服务器配置如下:
    real_server 192.168.190.102 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }   
    real_server 192.168.190.103 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }   
    }

③ 加载IPVS模块、保存当前的IPVS配置,并且查看当前系统上的IPVS配置信息

[root@localhost keepalived]# modprobe ip_vs  #加载 IP 虚拟服务器 (IPVS) 模块
[root@localhost keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm  #将当前 IPVS 的配置保存到 /etc/sysconfig/ipvsadm 文件中
[root@localhost keepalived]# systemctl start ipvsadm.service
[root@localhost keepalived]# systemctl restart keepalived.service 
[root@localhost keepalived]# ipvsadm -ln     #列出当前系统上的 IPVS 配置信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  127.0.0.1:80 rr
TCP  192.168.190.188:80 rr
  -> 192.168.190.102:80           Route   1      0          0         
  -> 192.168.190.103:80           Route   1      0          0  

④ 修改代理服务器7-1keepalived服务配置

192.168.190.101,7-1:
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf  keepalived.conf.bak
[root@localhost keepalived]# ls

192.168.190.100,7-0:
[root@localhost keepalived]# scp keepalived.conf 192.168.190.101:/etc/keepalived/
The authenticity of host '192.168.190.101 (192.168.190.101)' can't be established.
ECDSA key fingerprint is SHA256:aIqKteFz37bh8tOF7A07YElsVqfHgBSbxwkKXK9dfks.
ECDSA key fingerprint is MD5:9c:5a:7f:ec:d9:0c:2a:b2:9d:9e:03:77:f3:87:36:d4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.190.101' (ECDSA) to the list of known hosts.
root@192.168.190.101's password: 
keepalived.conf  
#远程传输配置文件

192.168.190.101,7-1:
[root@localhost keepalived]# vim keepalived.conf
12    router_id LVS_02
20     state BACKUP
23     priority 80
[root@localhost keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost keepalived]# systemctl start ipvsadm.service
[root@localhost keepalived]# systemctl start keepalived.service 
[root@localhost keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.190.188:80 rr
  -> 192.168.190.102:80           Route   1      0          0         
  -> 192.168.190.103:80           Route   1      0          0  

⑤ 查看虚拟IP在代理服务器7-0还是7-1

⑥ web服务器7-2,7-3分别添加web文件,开启httpd服务,添加路由

192.168.190.102,7-2:
[root@localhost ~]# echo 7-2 > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ifconfig lo:0 192.168.190.188 netmask 255.255.255.255
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

192.168.190.103,7-3:
[root@localhost ~]# echo 7-2 > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ifconfig lo:0 192.168.190.188 netmask 255.255.255.255
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

⑦ 客户端7-4访问代理服务器VIP

[root@localhost ~]# curl 192.168.190.188
7-2
[root@localhost ~]# curl 192.168.190.188
7-3
[root@localhost ~]# curl 192.168.190.188
7-2
[root@localhost ~]# curl 192.168.190.188
7-3

注意:如果PC端浏览器访问VIP,刷新没有变化需要关闭apache长连接设置

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
keepalive off

三、Keepalived优化 

1. 非抢占与延时抢占

默认配置为立即抢占,效果如下:

关闭7-0keepalived服务,观察客户端访问情况,并查看虚拟IP所处位置

7-0代理lvs1:
[root@localhost keepalived]# systemctl stop keepalived.service

7-4客户端:
[root@localhost ~]# curl 192.168.190.188
7-3
[root@localhost ~]# curl 192.168.190.188
7-2

非抢占模式: 

① 两台LVS代理服务器均需要修改keepalived服务配置

[root@localhost keepalived]# vim keepalived.conf
 19 vrrp_instance VI_1 {
 20     state BACKUP        #均改为BACKUP
 21     nopreempt           #添加此行
[root@localhost keepalived]# systemctl restart keepalived.service

② 默认虚拟IP在LVS1上,修改完LVS1配置后,查看虚拟IP已转移到LVS2上

[root@localhost keepalived]# hostname -I
192.168.190.101 192.168.190.188 192.168.122.1

延迟抢占:

① 两台LVS代理服务器均需要修改keepalived服务配置

[root@localhost keepalived]# vim keepalived.conf 
19 vrrp_instance VI_1 {
20     state BACKUP
21     preempt_delay 10
[root@localhost keepalived]# systemctl restart keepalived.service

② 先前测试非抢占模式,目前虚拟IP位于LVS2上,修改LVS1实例配置,并查看延迟抢占

[root@localhost keepalived]# vim keepalived.conf
19 vrrp_instance VI_1 {
20     state BACKUP
21     preempt_delay 10    #抢占延迟模式,默认延迟300s
[root@localhost keepalived]# systemctl restart keepalived.service 
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.122.1 
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.122.1 
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.122.1 
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.190.188 192.168.122.1 
[root@localhost keepalived]# hostname -I
192.168.190.100 192.168.190.188 192.168.122.1 

2. 单播与多播 

  • 单播模式:在单播模式下,VRRP 报文是通过单播方式进行传输的。这意味着每个 VRRP 实例的主机都会向其他 VRRP 实例的主机发送单独的 VRRP 报文。这种方式需要占用更多的网络带宽,但可以提供更高的可靠性和安全性。
  • 多播模式:在多播模式下,VRRP 报文是通过多播方式进行传输的。这意味着每个 VRRP 实例的主机都会向一个多播地址发送 VRRP 报文。这种方式需要占用更少的网络带宽,但可能会受到网络中的其他设备的影响,从而导致可靠性和安全性下降。

因此,单播模式相对于多播模式来说,更加稳定和安全,但需要占用更多的网络带宽。多播模式则更加节省网络带宽,但可能会受到其他因素的影响,从而导致可靠性和安全性下降。在实际应用中,需要根据具体的网络环境和需求来选择适合的 VRRP 模式。

抓包查看vrrp报文:可见密码没什么意义

抓包查看单播地址:在 ens33 网卡上抓取源 IP 地址为 192.168.190.100 的网络流量

修改多播:

① 分别修改LVS1,LVS2 keepalived配置文件

[root@localhost keepalived]# vim keepalived.conf
global_defs {
vrrp_mcast_group4 234.6.6.6
[root@localhost keepalived]# systemctl restart keepalived.service

② 抓拍查看报文

修改单播:

① 分别修改LVS1,LVS2 keepalived配置文件

LVS1,192.168.190.100:
vrrp_instance VI_1 {
……
    unicast_src_ip 192.168.190.100  #本机IP,master100,backup101
    unicast_peer {
    192.168.190.101                 #指向对方主机IP 如果有多个keepalived,再下面加其它节点的IP
    }

LVS2,192.168.190.101:
vrrp_instance VI_1 {
……
    unicast_src_ip 192.168.190.101
    unicast_peer {
    192.168.190.100
    }

② 抓包,在 ens33 网卡上抓取源 IP 地址为 192.168.190.100,目标 IP 地址为 192.168.190.101 的网络流量

3. 通知脚本

通知脚本(notification script)是用来在状态转换发生时通知管理员或执行特定操作的脚本。当Keepalived监测到故障或状态变化时,例如主服务器故障或切换到备用服务器,它会触发通知脚本。记录状态变化和事件日志,并发送电子邮件或短信通知给管理员或运维团队等操作。

① 编写脚本

[root@localhost opt]# vim keepalive.sh
#!/bin/bash
#
contact='num@qq.com'   #qq邮箱
notify() {
 mailsubject="$(hostname) to be $1, vip floating"
 mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
 echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
 notify master
 ;;
backup)
 notify backup
 ;;
fault)
 notify fault
 ;;
*)
 echo "Usage: $(basename $0) {master|backup|fault}"
 exit 1
 ;;
esac
[root@localhost opt]# chmod +x keepalived.sh 

② 修改LVS1keepalived配置文件

[root@localhost opt]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
  ……
   notify_master "/opt/keepalive.sh master"
   notify_backup "/opt/keepalive.sh backup"
   notify_fault "/opt/keepalive.sh fault"
}
[root@localhost opt]# systemctl restart keepalived.service 

③ 配置邮箱

[root@localhost ~]# vim /etc/mail.rc
set from=num@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=num5@qq.com
set smtp-auth-password=*******   #POP3/IMAP/SMTP/Exchange/CardDAV 授权码

④ 模拟master故障

[root@localhost opt]# systemctl restart keepalived.service 
[root@localhost opt]# killall keepalived

⑤ 查收邮件 

​​​​​​​

4. 日志功能

开启单独日志功能

① 设置日志输出的设施

[root@localhost opt]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"

② 将local6设备的所有日志消息重定向到/data/keepalived.log文件中。

[root@localhost opt]# vim /etc/rsyslog.conf
local6.*                                                /data/keepalived.log
[root@localhost opt]# systemctl restart rsyslog.service
[root@localhost opt]# systemctl restart keepalived.service
[root@localhost opt]# ls /data
keepalived.log
#查看生成日志文件

5. 模拟脑裂

[root@localhost keepalived]#iptables -A INPUT -s 192.168.190.100 -j REJECT 
#在备份主机LVS1中加入此项
[root@localhost keepalived]#ip a
#可以在主备上都发现vip地址

都有哪些原因导致脑裂?

① 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

② 因心跳线坏了(包括断了,老化)。

③ 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)

④ 因心跳线间连接的设备故障(网卡及交换机)

⑤ 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。

⑥ 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败

⑦ 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

⑧ 多组keepalive服务器造成   组播冲突    1.换组播地址   2.改成单播 

如何解决keepalived脑裂问题?

同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息。即多拉一条网线。

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

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

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

6.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时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
     fall <INTEGER>       					#执行脚本连续几次都失败,则转换为失败,建议设为2以上
     rise <INTEGER>       					#执行脚本连续几次都成功,把服务器从失败标记为成功
     user USERNAME [GROUPNAME] 				#执行监测脚本的用户或组      
     init_fail         						#设置默认标记为失败状态,监测成功之后再转换为成功状态
}

操作:keepalived+nginx实现反向代理集群

① 两台代理服务器安装nginx,修改配置文件,配置反向代理

[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install nginx -y
[root@localhost ~]# vim /etc/nginx/nginx.conf
 23     upstream web {
 24     server 192.168.190.102;
 25     server 192.168.190.103;
 26     }
 48         location / {
 49         proxy_pass http://web;
 50         }
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# scp /etc/nginx/nginx.conf 192.168.190.101:/etc/nginx/nginx.conf

② 编写脚本

[root@localhost ~]# vim /etc/keepalived/ng.sh
killall -0 nginx
[root@localhost ~]# chmod +x /etc/keepalived/ng.sh

③ 编辑keepalived配置文件

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
# 全局配置下配置,平级    
vrrp_script check_down {
        script  "/etc/keepalived/ng.sh"   
        interval 1
        weight -30
        fall  3
        rise 2
        timeout 2
}

vrrp_instance VI_1 {
  ……
    track_script {
     check_down
 }
}

④ 模拟故障,关闭代理服务器1nginx服务,访问页面需要多次刷新,同时观察VIP在哪台机器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用*把棱形画出来

输入一个整数n表示棱形的对角半长度&#xff0c;请你用*把这个棱形画出来。 输入&#xff1a;1输出&#xff1a;*输入&#xff1a;3输出&#xff1a;**** *********输入输出格式 输入描述: 输入一个整数n&#xff08;n < 10&#xff09;。 输出描述: 按题目要求输出字符棱…

Jobs Portal求职招聘系统源码v3.5版本

源码介绍: Jobs Portal 求职招聘系统 是为求职者和公司发布职位而开发的交互式求职招聘源码。它使求职者能够发布简历、搜索工作、查看个人工作列表。它将提供各种公司在网站上放置他们的职位空缺资料&#xff0c;并且还可以选择搜索候选人简历。除此之外&#xff0c;还有一个…

Jupyter Notebook使用教程——从Anaconda环境构建到Markdown、LaTex语法介绍

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 你是否在视频教程或说明文档或Githu…

TC7.0简单编程十六进制跟十进制转化函数

写脚本的时候&#xff0c;没用内存的功能什么的&#xff0c;基本跟十六进制用得都比较少。最近因为易语言的一个代码要转化过来&#xff0c;看到易语言里面有现成的函数 16到10 跟10 到16&#xff0c;就想着TC是否也有这样的函数。找来找去没找到。其实TC也有这样的函数来的。藏…

misc49

下载附件是个txt文件&#xff0c;打开发现是个压缩包的头 后缀改成zip后打开 base解码无果&#xff0c;我们尝试字母解码 然后音符解码得到 ❀✿✼❇❃❆❇✿❁❇✻✿❀✾✿✻❀❊❆❃❀❊✻❅❀❄✼❂❊❊✾❇❁✽✽✼❁❂❀❀❀❉❃❂❀❉❃❂❊❊✾✼✻✻❀❆✻✻❀❀✻✻✿…

C#MQTT编程10--MQTT项目应用--工业数据上云

1、文章回顾 这个系列文章已经完成了9个内容&#xff0c;由浅入深地分析了MQTT协议的报文结构&#xff0c;并且通过一个有效的案例让伙伴们完全理解理论并应用到实际项目中&#xff0c;这节继续上马一个项目应用&#xff0c;作为本系列的结束&#xff0c;奉献给伙伴们&#x…

Visual Studio单步调试中监视窗口变灰的问题

在vs调试中&#xff0c;写了这样一条语句 while((nfread(buf, sizeof(float), N, pf))>0) 然而&#xff0c;在调试中&#xff0c;只要一执行while这条语句&#xff0c;监视窗口中的变量全部变为灰色&#xff0c;不能查看&#xff0c;是程序本身并没有报错&#xff0c;能够继…

简单了解一个数据包在网络的一生

在主题之前&#xff0c;我想先谈谈目前计算机的网络模型&#xff0c;主要谈谈 TCP/IP 模型&#xff1a; 应用层&#xff1a;产生最原始的数据&#xff0c;常见协议如 http、ftp、websocket、DNS、QUIC 传输层&#xff1a;传递应用层的数据给网络层&#xff0c;必要时进行切割&…

[Angular 基础] - 表单:响应式表单

[Angular 基础] - 表单&#xff1a;响应式表单 之前的笔记&#xff1a; [Angular 基础] - routing 路由(下) [Angular 基础] - Observable [Angular 基础] - 表单&#xff1a;模板驱动表单 开始 其实这里的表单和之前 Template-Driven Forms 没差很多&#xff0c;不过 Tem…

从16-bit 到 1.58-bit :大模型内存效率和准确性之间的最佳权衡

通过量化可以减少大型语言模型的大小&#xff0c;但是量化是不准确的&#xff0c;因为它在过程中丢失了信息。通常较大的llm可以在精度损失很小的情况下量化到较低的精度&#xff0c;而较小的llm则很难精确量化。 什么时候使用一个小的LLM比量化一个大的LLM更好? 在本文中&a…

C 嵌套循环

C 语言允许在一个循环内使用另一个循环&#xff0c;下面演示几个实例来说明这个概念。 语法 C 语言中 嵌套 for 循环 语句的语法&#xff1a; for (initialization; condition; increment/decrement) {statement(s);for (initialization; condition; increment/decrement){s…

Java项目修改源码jar文件(无需反编译)

文章目录 应用场景实现方案实现原理注意事项 应用场景 在项目中用了第三方的jar包&#xff0c;但是jar包内某个类不符合项目业务需求&#xff0c;需要修改第三方jar包源码文件内容。 实现方案 首先我们尝试直接修改jar包源码文件内容时&#xff0c;页面上会提示文件是只读的&a…

【Java】生成条形码工具类

报销单需要根据单号生成条形码 先看效果图 直接上代码&#xff0c;复制即可使用 /*** Description:生成条形码*/ public class BarCodeUtils {/*** 默认图片宽度*/private static final int DEFAULT_PICTURE_WIDTH 300;/*** 默认图片高度*/private static final int DEFAULT_…

Python SSH协议库之paramiko使用详解

概要 在网络编程中,远程操作是一项非常常见的需求,特别是在服务器管理和自动化任务执行方面。Python提供了许多库来实现远程操作,其中Paramiko是一个备受欢迎的选择。Paramiko是一个纯Python编写的SSH协议库,它提供了一种简单而强大的方式来执行远程命令、上传和下载文件等…

Consul服务注册与发现

Consul服务注册与发现 1、为什么不再使用传统的Eureka&#xff1f; Eureka停更进维护&#xff1b;Eureka对初学者还是不太友好的&#xff0c;它还有自我保护模式&#xff1b;注册中心独立且与微服务各功能解耦是大势所趋&#xff0c;目前主流服务中心&#xff0c;希望单独隔离…

深入理解java之网络编程

目录&#xff1a; 网络编程基本概念计算机网络网络通信协议数据封装与解封IP地址TCP协议和UDP协议 Java网络编程中的常用类InetAddress的使用InetSocketAddress的使用URL的使用TCP通信的实现和项目案例TCP通信入门案例UDP通信的实现和项目案例UDP通信入门案例 网络编程基本概念…

片上网络(NoC)技术的发展及其给高端FPGA带来的优势

片上网络(NoC)技术的发展及其给高端FPGA带来的优势 1. 概述 在摩尔定律的推动下,集成电路工艺取得了高速发展,单位面积上的晶体管数量不断增加。 片上系统(System-on-Chip,SoC)具有集成度高、功耗低、成本低等优势,已经成为大规模集成电路系统设计的主流方向,解决了…

自媒体新人该如何开始

作为一个准备踏入自媒体领域的新手&#xff0c;面对一片陌生的领域可能让你感到有点手足无措&#xff0c;就好比是第一次学游泳&#xff0c;心里有些许的恐惧和不确定。同样的&#xff0c;当你第一次学骑自行车&#xff0c;也是一样的陌生&#xff0c;如果学会这些并熟练之后&a…

一文了解原型和原型链

本文重点概念&#xff1a; 1、所有的对象都是new一个函数创建的 2、所有的函数都有一个属性prototype&#xff0c;称为函数原型 3、函数原型得到的这个对象都有一个属性constructor,指向该函数 4、所有的对象都有一个属性&#xff1a;隐式原型__proto__&#xff0c;隐式原型…

pyqt线程正确使用

PyQt之科学使用线程处理耗时任务以及线程通信方法 上面这篇文章看似很科学… 经过实际测试&#xff0c;需要按下面创建线程&#xff1a; self.work EmailWork() self.thread QtCore.QThread() self.thread.start()self.work.moveToThread(self.thread) self.work.complete_…