• 项目二--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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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^@^@^@^@"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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 {
         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
       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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    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 {
         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
       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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

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

    #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
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    上面这种方式,我在两台负载均衡器上只配置了一个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 {
         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
       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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    负载均衡器2上:

    [root@lb2 keepalived]# vim keepalived.conf 
    [root@lb2 keepalived]# cat 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
       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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    这样,无论你访问那个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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    被动检查: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;
    }
    
    • 1
    • 2
    • 3
    • 4

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

    upstream backend {
        server backend1.example.com slow_start=30s;
        server backend2.example.com;
        server 192.0.0.1 backup;
    }                                                                                                                                                                                                                                                                                                                                                                                                                
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    【安全狗高危安全通告】GitLab远程代码执行漏洞
    HTML核心(9)- 列表元素
    深入浅出(五)JsonCpp库
    reg与wire的用法,证明reg可以在右边,wire型在左边,来作组合逻辑处理。
    巨子生物在香港上市:薇娅突击入股,范代娣、严建亚夫妇提前套现
    亚马逊云科技面向 macOS 的 Amazon 云服务器 EC2 M1 Mac 实例
    部署LAMP平台
    FLStudio21水果免费版本FL2023电音制作软件
    如何判断对象是否是垃圾
    【谷粒商城 - k8s、devOps专栏】
  • 原文地址:https://blog.csdn.net/weixin_43880061/article/details/126293318