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的进程,你会发现他有三个进程,无论你有几个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看管,两个子进程各自负责自己的事
正如前面所提到的,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是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性,它工作在网络层
1.简化网络管理。在局域网中,借助VRRP能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。
2.适应性强。VRRP报文封装在IP报文中,支持各种上层协议。
3.网络开销小。VRRP只定义了一种报文——VRRP通告报文,并且只有处于Master状态的路由器可以发送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路由器或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路由器,源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^@^@^@^@"
其中:
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数据包时要进行以下验证,不满足的数据包将被丢弃:
在负载均衡器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
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
配置文件解析(主要是讲我修改的那一部分,因为没有用到负载均衡功能,所以我把配置文件中负载均衡功能的配置都删除了):
#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 {
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
负载均衡器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
这样,无论你访问那个vip,都可以进行负载均衡,转发到后端的real server上去。如果一个vip的master挂掉了,那么这个vip会马上漂移到另外一个负载均衡器上去,这样有效的防治了单点故障。
你在任意一台机器上查看IP地址的时候都会发现,一块网卡上不仅有真实IP,还有vip,那么,为什么我们不能将vip设置的跟IP地址一样呢?
我们需要知道,vip的作用是对外提供服务的,你可以在两台负载均衡器前面加上一个DNS域名解析,将一个域名解析成这个两个vip,vip是专门对外提供服务的,也就是为用户提供服务的,并且不对外暴露真实机器的IP地址,也可以起到一个安全的作用。网卡上真正的IP地址,是虚拟机内部网络通信使用的,比如说虚拟路由器内部的master路由器要给backup路由器发送vrrp报文,就是通过双方机器的真实IP进行通信的;或者说你使用ssh/跳板机等对整个局域网进行管理时,使用的也是真实IP地址。
如果你还不理解,你可以想一个明星的艺名和本名,成龙大哥的艺名叫成龙,跟我们的vip一样,是对外提供服务的,但是他的本名叫什么,我们并不是很清楚
脑裂:就是两台或者多台负载均衡器上都有同一个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
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的
健康检查就是负载均衡器检测后端真实机器有没有挂了,分为主动检查和被动检查两种方式
主动检查: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;
}