项目二--03.基于Nginx、keepalived的高可用集群之keepalived高可用实现

keepalived实现高可用

keepalived介绍

keepalived的两大核心功能是失败切换(高可用)和健康检查
所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;
而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

高可用:High Availability(HA),高可用就是高度可用,有备份,不需要人为时时刻刻去维护配置,避免了单点故障的情况,保障了系统的稳定性
灾备(灾难备份)的代价:多搞几台服务器进行备份,就要多花钱
目前比较流行的高可用软件:keepalived、heartbeat
选择keepalived来做高可用的原因
1.keepalived开源并且免费,而且底层框架更加简单,只有一个配置文件和一个安装文件,但是heartbeat2.1.4后拆分成3个子项目,安装、配置、使用都比较复杂,尤其是出问题的时候,都不知道具体是哪个子系统出问题了
2.keepalived实现高可用是基于vrrp协议,而heartbeat实现高可用是基于主机或者网络的服务
3.负载均衡的高可用推荐使用keepalived,业务的高可用推荐使用heartbeat

keepalived的三个进程

启动keepalived服务之后,你查看keepalived的进程,你会发现他有三个进程,无论你有几个vrrp实例,他都是三个进程。

[root@lb ~]#  ps -ef|grep keep
root       5505      1  0 05:33 ?        00:00:01 /usr/sbin/keepalived -D
root       5506   5505  0 05:33 ?        00:00:01 /usr/sbin/keepalived -D
root       5507   5505  0 05:33 ?        00:00:08 /usr/sbin/keepalived -D
root       7288   7214  0 10:42 pts/0    00:00:00 grep --color=auto keep

keepalived正常启动的时候,共启动3个进程:
父进程:内存管理,负责监控其子进程
子进程:vrrp子进程,用来实现vrrp协议
子进程:checkers子进程,负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置文件的解析(healthchecker是检查后端的real server是否宕机,如果出现问题了,keepalived在做负载均衡的时候,就不再给这台服务器转发请求)

两个子进程都被系统watchdog看管,两个子进程各自负责自己的事

VRRP协议

正如前面所提到的,keepalived实现高可用,是基于vrrp(虚拟路由冗余协议)而实现的,当backup收不到master发来的vrrp报文,就会认为master已经挂掉了,然后根据vrrp的一个优先级,重新选举一个backup来成为master,这样就可以保障了集群的高可用,并且对于用户来说,他是感受不到master已经挂了的。

我们先学习了解一个vrrp协议的具体内容

下面是keepalived官网对于keepalived高可用功能的一句简单概述:
high-availability is achieved by VRRP protocol. VRRP is a fundamental brick for router failover.

Virtual Router Redundancy Protocol (vrrp)虚拟路由冗余协议,VRRP是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性,它工作在网络层

VRRP优点

1.简化网络管理。在局域网中,借助VRRP能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。
2.适应性强。VRRP报文封装在IP报文中,支持各种上层协议。
3.网络开销小。VRRP只定义了一种报文——VRRP通告报文,并且只有处于Master状态的路由器可以发送VRRP报文。

VRRP协议中的相关术语

虚拟路由器:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。
VRID:虚拟路由器的标识。有相同VRID的一组路由器构成一个虚拟路由器。
Master路由器:虚拟路由器中承担报文转发任务的路由器。
Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器。
虚拟IP地址:虚拟路由器的IP地址,又称为vip。一个虚拟路由器可以拥有一个或多个IP地址。
IP地址拥有者:接口IP地址与虚拟IP地址相同的路由器被称为IP地址拥有者。
虚拟MAC地址:一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位。
非抢占方式:如果Backup路由器工作在非抢占方式下,则只要Master路由器没有出现故障,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器。
抢占方式:如果Backup路由器工作在抢占方式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器;否则,将保持Backup状态。

VRRP中master路由器的选举

vrrp是根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。优先级越高,则越有可能成为Master路由器。
初始创建的路由器工作在Backup状态,通过VRRP报文的交互获知虚拟路由器中其他成员的优先级:
1.如果VRRP报文中Master路由器的优先级高于自己的优先级,则路由器保持在Backup状态;
2.如果VRRP报文中Master路由器的优先级低于自己的优先级,采用抢占工作方式的路由器将抢占成为Master状态,周期性地发送VRRP报文,采用非抢占工作方式的路由器仍保持Backup状态;
3.如果在一定时间内没有收到VRRP报文,则路由器切换为Master状态

可以简单的理解vrrp的master选举就是互相之间发送vrrp报文
VRRP优先级的取值范围为0到255(数值越大表明优先级越高),可配置的范围是1到254,优先级0为系统保留给路由器放弃Master位置时候使用,255则是系统保留给IP地址拥有者使用。当路由器为IP地址拥有者时,其优先级始终为255。因此,当虚拟路由器内存在IP地址拥有者时,只要其工作正常,则为Master路由器。

VRRP报文发送过程–封装角度

同一个局域网中的VRRP路由器,源mac地址为自己本路由器的IP地址,目的mac地址为一个组播地址(MAC地址的第八位为1),源IP地址是自己的IP地址,目的IP地址是224.0.0.18(同一个局域网中,安装了keepalived软件的机器才会监听224.0.0.18,一个局域网中最多允许255个VRRP路由器)
在这里插入图片描述
通过科来抓包查看vrrp协议的内容:
在这里插入图片描述
源IP是本机的IP地址,源IP地址是224.0.0.18
源mac地址是虚拟机上vip绑定的那个网卡的mac地址,目的mac地址是第八位为0的一个广播地址
vrrp协议本身不知道从哪里来到哪里去,跟icmp协议一样,需要借助IP协议

通过tcpdump抓包查看vrrp协议

[root@lb ~]# tcpdump -i ens33 vrrp -vv -n
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
11:53:29.324225 IP (tos 0xc0, ttl 255, id 16688, offset 0, flags [none], proto VRRP (112), length 40)
    192.168.2.130 > 224.0.0.18: vrrp 192.168.2.130 > 224.0.0.18: VRRPv2, Advertisement, vrid 189, prio 200, authtype simple, intvl 1s, length 20, addrs: 192.168.2.189 auth "1111^@^@^@^@"
11:53:29.325248 IP (tos 0xc0, ttl 255, id 16688, offset 0, flags [none], proto VRRP (112), length 40)
    192.168.2.130 > 224.0.0.18: vrrp 192.168.2.130 > 224.0.0.18: VRRPv2, Advertisement, vrid 190, prio 200, authtype simple, intvl 1s, length 20, addrs: 192.168.2.190 auth "1111^@^@^@^@"

VRRP协议数据格式

在这里插入图片描述
其中:
version:版本,4位,在RFC3768中定义为2;
Type:类型,4位,目前只定义一种类类型: 通告数据 ,取值为1;
Virtual Rtr ID:虚拟路由器ID,8位
Priority:优先级,8位,具备冗余IP地址的设备的优先级为255;
Count IP Addrs:VRRP包中的IP地址数量,8位;
Auth Type:认证类型,8位,RFC3768中认证功能已经取消,此字段值定义0(不认证),为1,2只作为对老版本的兼容;
Adver Int:通告包的发送间隔时间,8位,单位是秒,缺省是1秒;
Checksum:校验和,16位,校验数据范围只是VRRP数据,即从VRRP的版本字段开始的数据,不包括IP头;
IP Address(es):和虚拟路由器相关的IP地址,数量由Count IP Addrs决定
Authentication Data:RFC3768中定义该字段只是为了和老版本兼容,必须置0。

接收数据时的必须检查
收到VRRP数据包时要进行以下验证,不满足的数据包将被丢弃:

  • TTL必须为255;
  • VRRP版本号必须为2;
  • 一个包中数据字段必须完整;
  • 校验和必须正确;
  • 必须验证在接收的网卡上配置了VRID值,而且本地路由器不是路由IP地址的拥有者
  • 必须验证VVRP认证类型和配置的一致;

安装配置keepalived软件

在负载均衡器1上:

[root@lb ~]# yum install keepalived -y
[root@lb ~]# cd /etc/keepalived/
[root@lb keepalived]# ls
keepalived.conf
[root@lb keepalived]# vim keepalived.conf
[root@lb keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
    
    
   notification_email {
    
    
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict        #修改1:注释掉
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    
    
    state MASTER    #修改2:一台lb设为master,所以master是可以指定的
    interface ens33    #修改3:改为自己机器上网的网卡名字
    virtual_router_id 51    #修改4:两台lb的这个数值要是一样的,这样证明在一个竞争的vrrp网内
    priority 200    #修改4:master的这个数值要比backup高
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.2.22    #修改5:两台lb设为同一个vip
    }
}
[root@lb keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@lb keepalived]# ps aux|grep keep
root       5162  0.0  0.1 123056  1404 ?        Ss   17:40   0:00 /usr/sbin/keealived -D
root       5163  0.0  0.2 127256  2452 ?        S    17:40   0:00 /usr/sbin/keealived -D
root       5164  0.0  0.2 127256  2460 ?        S    17:40   0:00 /usr/sbin/keealived -D
root       5174  0.0  0.0 112824   988 pts/1    R+   17:40   0:00 grep --color=auto keep
[root@lb keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7b:fb:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.43/24 brd 192.168.2.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.2.188/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7b:fb12/64 scope link 
       valid_lft forever preferred_lft forever
[root@lb ~]# ps aux|grep keep
root       5505  0.0  0.1 123056  1404 ?        Ss   05:33   0:01 /usr/sbin/keealived -D
root       5506  0.0  0.3 134024  3340 ?        S    05:33   0:01 /usr/sbin/keealived -D
root       5507  0.0  0.2 133896  2676 ?        S    05:33   0:07 /usr/sbin/keealived -D
root       7248  0.0  0.0 112824   988 pts/0    R+   10:21   0:00 grep --color=auto keep

keepalived没有具体监听哪个端口,因为vrrp是组播通信
在负载均衡器2上:

[root@lb2 ~]# yum install keepalived -y
[root@lb2 ~]# cd /etc/keepalived/
[root@lb2 keepalived]# ls
keepalived.conf
[root@lb2 keepalived]# vim keepalived.conf 
[root@lb2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
    
    
   notification_email {
    
    
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    
    
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.2.22
}
[root@lb2 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@lb2 keepalived]# ps aux|grep keep
root       5922  0.0  0.1 123056  1404 ?        Ss   17:41   0:00 /usr/sbin/keealived -D
root       5923  0.0  0.3 134024  3320 ?        S    17:41   0:00 /usr/sbin/keealived -D
root       5925  0.0  0.2 127256  2424 ?        S    17:41   0:00 /usr/sbin/keealived -D
root       5934  0.0  0.0 112824   988 pts/1    S+   17:41   0:00 grep --color=auto keep
[root@lb2 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3e:82:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.44/24 brd 192.168.2.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe3e:8258/64 scope link 
       valid_lft forever preferred_lft forever
[root@lb2 ~]# ps aux|grep keep
root       6161  0.0  0.1 123056  1408 ?        Ss   05:36   0:01 /usr/sbin/keealived -D
root       6162  0.0  0.3 134024  3348 ?        S    05:36   0:01 /usr/sbin/keealived -D
root       6163  0.0  0.2 133896  2684 ?        S    05:36   0:08 /usr/sbin/keealived -D
root       7813  0.0  0.0 112824   988 pts/0    R+   10:21   0:00 grep --color=auto keep

配置文件解析(主要是讲我修改的那一部分,因为没有用到负载均衡功能,所以我把配置文件中负载均衡功能的配置都删除了):

#vrrp_strict  注释掉,这个是严格遵守vrrp协议
vrrp_instance VI_1 {
    
           启动一个vrrp的实例 VI_1 实例名,可以自定义
    state MASTER        --》角色是master
    interface ens33      --》在哪个接口上监听vrrp协议,同时绑定vip到那个接口
    virtual_router_id 105 --》虚拟路由id(帮派) 0~255范围
    priority 120    ---》优先级  0~255
    advert_int 1  --》advert interval master宣告消息 时间间隔 1秒
    authentication {
    
       认证
        auth_type PASS   认证的类型是密码认证
        auth_pass 11112222   具体的密码,可以自己修改
    }
    virtual_ipaddress {
    
       --》vip的配置,vip可以是多个ip
        192.168.200.16 
        192.168.200.17
        192.168.200.18
    }
}

上面这种方式,我在两台负载均衡器上只配置了一个vrrp实例,一个为master一个为backup,那么为backup的那个负载均衡器就总是会坐冷板凳,没有利用起来。所以我们可以再设置一个vrrp实例,将原来master的负载均衡器设为新的vrrp实例的backup。由此实现了双vip,互为主备,利用率更高,更加符合高可用的理念。
负载均衡器1上:

[root@lb keepalived]# vim keepalived.conf 
[root@lb keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
    
    
   notification_email {
    
    
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    
    
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 200
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.2.22
    }
}
vrrp_instance VI_2 {
    
    
    state BACKUP
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.2.23
    }
}
[root@lb keepalived]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@lb keepalived]# ifup ens33
RTNETLINK answers: File exists
[root@lb keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7b:fb:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.43/24 brd 192.168.2.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7b:fb12/64 scope link 
       valid_lft forever preferred_lft forever
[root@lb ~]# ps aux|grep keep
root       5505  0.0  0.1 123056  1404 ?        Ss   05:33   0:01 /usr/sbin/keealived -D
root       5506  0.0  0.3 134024  3340 ?        S    05:33   0:01 /usr/sbin/keealived -D
root       5507  0.0  0.2 133896  2676 ?        S    05:33   0:07 /usr/sbin/keealived -D
root       7248  0.0  0.0 112824   988 pts/0    R+   10:21   0:00 grep --color=auto keep

负载均衡器2上:

[root@lb2 keepalived]# vim keepalived.conf 
[root@lb2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
    
    
   notification_email {
    
    
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    
    
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.2.22
    }
}
vrrp_instance VI_2 {
    
    
    state MASTER
    interface ens33
    virtual_router_id 55
    priority 200
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.2.23
    }
}
[root@lb2 keepalived]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@lb2 keepalived]# ifup ens33
RTNETLINK answers: File exists
[root@lb2 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3e:82:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.44/24 brd 192.168.2.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe3e:8258/64 scope link 
       valid_lft forever preferred_lft forever
[root@lb2 ~]# ps aux|grep keep
root       6161  0.0  0.1 123056  1408 ?        Ss   05:36   0:01 /usr/sbin/keealived -D
root       6162  0.0  0.3 134024  3348 ?        S    05:36   0:01 /usr/sbin/keealived -D
root       6163  0.0  0.2 133896  2684 ?        S    05:36   0:08 /usr/sbin/keealived -D
root       7813  0.0  0.0 112824   988 pts/0    R+   10:21   0:00 grep --color=auto keep

这样,无论你访问那个vip,都可以进行负载均衡,转发到后端的real server上去。如果一个vip的master挂掉了,那么这个vip会马上漂移到另外一个负载均衡器上去,这样有效的防治了单点故障。
你在任意一台机器上查看IP地址的时候都会发现,一块网卡上不仅有真实IP,还有vip,那么,为什么我们不能将vip设置的跟IP地址一样呢?
我们需要知道,vip的作用是对外提供服务的,你可以在两台负载均衡器前面加上一个DNS域名解析,将一个域名解析成这个两个vip,vip是专门对外提供服务的,也就是为用户提供服务的,并且不对外暴露真实机器的IP地址,也可以起到一个安全的作用。网卡上真正的IP地址,是虚拟机内部网络通信使用的,比如说虚拟路由器内部的master路由器要给backup路由器发送vrrp报文,就是通过双方机器的真实IP进行通信的;或者说你使用ssh/跳板机等对整个局域网进行管理时,使用的也是真实IP地址。

如果你还不理解,你可以想一个明星的艺名和本名,成龙大哥的艺名叫成龙,跟我们的vip一样,是对外提供服务的,但是他的本名叫什么,我们并不是很清楚

keepalived中的脑裂

脑裂:就是两台或者多台负载均衡器上都有同一个vip地址
原因:
1.防火墙阻止了keepalived的vrrp消息的通告,然后每个机器都收不到别人的vrrp消息,就都认为自己是唯一的keepalived,就都认为自己是master
2.virtual_router_id不一样,但是配了同一个vip

脑裂有危害吗? - 没有危害,因祸得福,反而还实现了一个负载均衡的功能
脑裂是否影响用户的访问? - 不影响,用户会选中一个vip的机器,让它做负载均衡然后转发,但是用户的选择,运维不可控制,会有随机性,这样就留下了安全隐患。用户访问到的负载均衡器是运维人员不可控制的,这样作为一个管理人员是不能接受的

外网的用户会一直访问其中的一台负载均衡服务器,另外一台会没有访问,但是这个决定不是运维人员可以做主的,而是给了出口的路由器来做决定,这样我们内网里选好的master和backup就没有意义了,所以虽然脑裂并没有造成什么实际损害,我们还是应该避免脑裂的产生

在这里插入图片描述
脑裂现象数据的走向:(也就是lb1和lb2上面都有一个vip:192.168.2.188)
请求过程数据的走向:user1—>LB1—>web1
user1:
  src mac:11
  dst mac:33 (dst mac的选择是随机的,是user发送请求到switch,然后switch会发送一个arp广播,lb1和lb2都会收到这个arp广播,谁先响应了switch,user就会选择谁的mac地址作为dst mac,所以这个会有随机性,可能这一次是lb1先响应,下一次请求就是lb2先响应了)
  src ip:192.168.2.1
  dst ip:192.168.2.188 (vip)
LB1:
  src mac:33
  dst mac:55
  src ip:192.168.2.3 (负载均衡转发请求的时候,会将vip对应的那块网卡上的真实IP作为转发数据的源IP,这个通过抓包可以看到)
  dst ip:192.168.2.10 (根据nginx的负载均衡策略轮询转发)
响应过程数据的走向也是:web1—>LB1—>user1

keepalived的健康检查

TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。

HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。
HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。

SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连接

MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
0) 检测成功
1) 检测失败,将从服务器池中移除
2-255)检测成功;如果有设置misc_dynamic,权重自动调整为 退出码-2,如退出码为200,权重自动调整为198=200-2。

SMTP_CHECK:用来检测邮件服务的smtp的

Nginx的健康检查

健康检查就是负载均衡器检测后端真实机器有没有挂了,分为主动检查和被动检查两种方式

主动检查:Active Health Checks 主动的健康检查,LB每隔一段时间就去检查下后端的real server的状态,不管是否有client发请求过来,都会去检查。
主动检查需要安装nginx.plus,需要购买

server {
    
    
    location / {
    
    
        proxy_pass http://backend;
        health_check;
    }
}

每隔10秒去检查一次后端的real server, 失败的次数到达3次的时候,就标识这台上游服务器不可用,如果连续2次又可用访问了,就标识这台上游的服务器为up(可用)
主动检查:默认的失败次数是1次,默认的时间间隔是5秒,默认只要能成功访问一次就认为服务器up 了

location / {
    
    
    proxy_pass   http://backend;
    health_check interval=10 fails=3 passes=2;
}

被动检查:Passive Health Checks 被动的健康检查: 当client发请求给LB,然后LB再去转发请求给后端的real server ,这个时候如果后端的服务器出现问题,LB就发现了。被客户机逼着去检查后端的real server

fail_timeout - 设置服务器被标记为不可用时必须发生若干次失败尝试的时间,以及服务器被标记为不可用的时间(默认为10秒)

max_fails - 设置在fail_timeout期间必须发生的失败尝试次数,以便服务器被标记为不可用(默认为1次尝试)

在下面的例子中,如果NGINX在30秒内向一个服务器发送3次请求失败或没有收到它的响应,它就会把该服务器标记为不可用

upstream backend {
    
    
    server backend1.example.com;
    server backend2.example.com max_fails=3 fail_timeout=30s;
}

backup 备份:当其他的服务器都不提供服务的时候,再启用这台服务器提供服务 --》备胎
slow_start 慢启动,服务器重启后,将某个服务器先设置为不可用,过了多少秒,再让这台服务器变为可用
down 将上游的服务器标识为不可用,不会再发送任何的请求给这台服务器

upstream backend {
    
    
    server backend1.example.com slow_start=30s;
    server backend2.example.com;
    server 192.0.0.1 backup;
}                                                                                                                                                                                                                                                                                                                                                                                                                

猜你喜欢

转载自blog.csdn.net/weixin_43880061/article/details/126293318