Keepalived+LVS构建高可用集群

news2024/11/16 11:45:27

目录

一、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在哪台机器

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

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

相关文章

【数据库】软件测试之MySQL数据库面试总结

有表如下&#xff1a; Student 学生表 SC 成绩表 Course 课程表 Teacher 老师表 每个学生可以学习多门课程&#xff0c;每一个课程都有得分&#xff0c;每一门课程都有老师来教&#xff0c;一个老师可以教多个学生 1、查询姓‘朱’的学生名单 select * from Student whe…

010Editor汉化版+下载+注册码+模板bug

项目场景&#xff1a; 这天我想使用我的不知名的一个破解版本的010Edit来查看一个EXE程序&#xff0c;并想使用模板功能&#xff0c;但是发现没有该模板还无法下载最新模板 问题描述 010Edit联网后需要注册码&#xff1a; 010 Editor 激活码生成器 使用方法 参照教程使用0…

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时&#xff0c;通常使用 Redis 的字符串&#xff08;String&#xff09;。Redis 的字符串是最基本的数据类型&#xff0c;一个键对应一个值&#xff0c;它能够存储任何形式的字符串&#xff0c;包括二进制数据。字符串类型的值最多可以是 512MB。 Re…

浅谈Maven

Maven能为我们解决什么问题 1&#xff1a;添加第三方jar包 按照最原始的做法&#xff0c;我们是手动复制jar包到项目WEB-INF/lib下&#xff0c;每个项目都会有一份&#xff0c;造成大量重复文件。而Maven将jar包放在本地仓库中统一管理&#xff0c;需要jar包只需要用坐标的方式…

使用Canvas绘制一个自适应长度的折线图

要求x轴根据数据长度自适应 y轴根据数据最大值取长度值 <template><div ref"cvsContainer" class"cvs-container"><canvas ref"cvs" class"canvas"></canvas></div> </template><script set…

188基于matlab的AR模型参数估计

基于matlab的AR模型参数估计&#xff0c;burg法和ule-Walker法估计信号&#xff0c;并输出估计误差。程序已调通&#xff0c;可直接运行。 188 AR模型参数估计 burg法和ule-Walker法 (xiaohongshu.com)

离散数学例题——6.树和特殊图

树 树的证明 森林 同构树非同构树 生成树 有向树 二叉树遍历 哈夫曼树 特殊图 欧拉图&#xff08;一次边&#xff09; Fleury算法求欧拉回路 欧拉通路&#xff08;一笔画&#xff09; 哈密顿图&#xff08;一次点&#xff09; 哈密顿图的充分条件 哈密顿图必要条件 二部图 二部…

人工智能OCR领域安全应用措施

引言 编写目的 随着新一轮科技革命和产业变革的深入发展&#xff0c;5G、大数据、云计算、深度学习等新技术日益成为推动社会进步的核心动力。人工智能&#xff08;AI&#xff09;作为这些新技术的集大成者&#xff0c;正迅速成为新型基础设施建设的战略性支柱&#xff0c;其广…

【详识C语言】自定义类型之三:联合

本章重点 联合 联合类型的定义 联合的特点 联合大小的计算 联合&#xff08;共用体&#xff09; 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09;…

AI 辅助研发趋势

引言 随着人工智能技术的持续发展与突破&#xff0c;AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&#xff0c;AI辅助研发不仅…

Linux学习——锁

目录 ​编辑 一&#xff0c;锁的概念 二&#xff0c;锁的操作 1&#xff0c;锁类型 pthread_mutex_t 2&#xff0c;初始化锁 3&#xff0c;上锁 4&#xff0c;解锁 5&#xff0c;销毁锁 三&#xff0c;线程安全问题演示 四&#xff0c;锁的原理 五&#xff0c;死锁 …

每日OJ题_牛客HJ73 计算日期到天数转换(IO型OJ)

目录 牛客HJ73 计算日期到天数转换 解析代码 牛客HJ73 计算日期到天数转换 计算日期到天数转换_牛客题霸_牛客网 解析代码 #include <iostream> using namespace std; int main() {int year 0, month 0, day 0, sum 0;cin >> year >> month >>…

【SpringBoot框架篇】36.整合Tess4J搭建提供图片文字识别的Web服务

文章目录 简介文件下载引入依赖main函数中使用基于Springboot搭建OCR Web服务配置traineddata路径枚举用到的语种类型定义接口响应的json数据格式封装OCR服务引擎编写web提供服务的接口启动服务并且测试html demo扩展 项目配套代码 简介 Tess4J是一个基于Tesseract OCR引擎的J…

[Java安全入门]三.URLDNS链

一.前言 在初步学习java的序列化和反序列化之后&#xff0c;这里学习java反序列化漏洞的一个利用链&#xff0c;也是比较基础的一条链。 由于URLDNS不需要依赖第三方的包&#xff0c;同时不限制jdk的版本&#xff0c;所以通常用于检测反序列化的点。 二.代码展开分析 构造链 …

Learn OpenGL 03 着色器

GLSL 着色器的开头总是要声明版本&#xff0c;接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数&#xff0c;在这个函数中我们处理所有的输入变量&#xff0c;并将结果输出到输出变量中。 一个典型的着色器有下面的结构&#xff1a; #version vers…

[java入门到精通] 10 常用API , 正则表达式 , Collection集合

今日目标 BigInteger类BigDecimal类Arrays类包装类String类的常用方法正则表达式Collection集合 1 BigInteger类 1.1 概述 概述 : java.math.BigInteger类是一个引用数据类型 , 可以用于计算一些大的整数 , 当超出基本数据类型数据范围的整数运算时就可以使用BigInteger了。…

Arduino Uno使用Mind+实现图形化编程

文章目录&#xff1a; 一&#xff1a;软件下载安装 1.下载安装 1.1 开发软件 2.辅助软件 2.主控板 二&#xff1a;基础 1.LED 2.传感器 3.智能小车 三&#xff1a;学习资源 一&#xff1a;软件下载安装 1.下载安装 1.1 开发软件 Arduino IDE代码编程软件&#…

集合和数组的相关操作

目录 1.数组转集合(引用类型数组) 2.数组转集合(基础类型数组) 3.集合转数组 4.集合之间是否相交 5.获取两个集合的交集 6.集合转为字符串 1.数组转集合(引用类型数组) (1)Arrays.asList 示例&#xff1a; String[] colArr new String[6];colArr[0] "1";co…

Fastgithub

上Github太慢、打不开怎么办&#xff1f; 选择之一是Fastgithub工具&#xff0c;同时支持win, linux, mac。 1. 工作原理 从公共dns服务器拿到github的大量ip数据&#xff0c;检测哪些ip可用&#xff0c;哪些ip访问速度最佳&#xff0c;然后编写一个本地版的dns服务&#xff0…

小巧设备,大能量:探索口袋中的远程控制神器

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…