LVS+Keepalived之DR模式配置
理论基础
LVS直接配置DR模式,会存在一个问题,LVS负载均衡器是单点,容易发生单点故障,这样就会造成所有的服务都无法访问,这是不能容忍的。
解决单点故障的方法当然是一变多!但是入口的IP地址只能有一个,怎么变多?怎么实现多点?有2种形式:
- 主备模型:备用机要以最快的速度接管原来的VIP(virtual IP),只有主机对外提供服务,只有主机挂了的时候,备机才顶上去。
- 主主模型:所有的LVS都是主,现在要借用其他形式搞定只有一个的入口IP地址,比如动态DNS。主和主之间是协作的形式。
这里我们主要讨论主备模型,有两个点需要考虑:方向性、效率性。
怎么知道主机挂没挂?
- 可以由备机按照一定的时间间隔轮询主机,但是这样会对主或多或少造成一些压力。
- 可以由主机发广播到所有的备机,但是网络是不可靠的,所以有一种重试机制。
如果已经确定主机挂了,谁来作为新的主机?使用加权重的方式,为每个备设置不同的权重,当主挂了以后,权重大的备机成为新的主。
如果后台的某一个Real Server挂掉了,负载均衡服务器无法感知,还会对这台转发包,这样就会造成一部分人的业务请求异常,另一部分人的业务正常。
那么怎么知道Real Server挂了?可以用ping吗?不可以用ping命令,ping命令基于网络层的ICMP协议,只能检验网络能不能通,而web服务是位于应用层的,能ping通不能代表web服务正常可用。那怎么知道Real Server挂没挂?最简单的方式是“访问一下”,“访问一下”这个操作,它的底层验证的是应用层的HTTP协议,你发一个请求,返回的是200ok,就说明是可用的。
LVS内核中有模块:ipvs负载均衡模块。你想要检测各个RS是否可用的话,可以直接去修改模块的源码,也可以使用第三方实现。第三方可以是人,也可以是自动化(也就有了自动化运维)。
这个自动化的程序就是keepalived!它可以代替人工,实现自动运维。解决LVS单点故障,实现HA。
keepalived要干的活:
- 监控自己的LVS服务
- 处于Master角色的路由器会一直发送VRRP(Vritrual Router Redundancy Protocol)数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,如果Master挂了,一堆Backup推举选出一个新的Master。
- 不需要再手动配置VIP,添加LVS(ipvs模块)配置,只需要写到配置文件中即可。
- 对后端的Real Server做健康检查,及时剔除不可用的节点。
最后,keepalived不仅仅用来解决LVS单点故障问题,它是一个通用的环境,主要作为linux上的HA的实现。例如,当你并发量不大的时候,nginx可以作为公司的负载均衡来使用,此时nginx成为了单点故障,这个问题也可以用keepalived来解决。
实验配置
服务器IP及部署角色如下:
- node01:192.168.252.10,负载均衡器MASTER。
- node04:192.168.252.14,负载均衡器BACKUP。
- node02:192.168.252.11,Real Server,上面部署httpd,对外提供服务。
- node03:192.168.252.12,Real Server,上面部署httpd,对外提供服务。
- node02和node03的配置如下,并启动httpd服务。
#!/bin/bash
VIP=192.168.252.100
echo 1 > /proc/sys/net/ipv4/conf/ens32/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens32/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 $VIP netmask 255.255.255.255
- node01和node04安装keepalived,
yum install -y keepalived
。
修改/etc/keepalived/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协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址
#vrrp_strict # 这里一定要注释,否则keepalived会无法启动
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # node04这里改为BACKUP
interface ens32 # 网卡设置
virtual_router_id 51
priority 100 # 权重,node04设置为50,如果有多个备,要设置为不同的权重,当主挂了后,权重大的成功为主
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.252.100/24 brd 192.168.252.255 dev ens32 label ens32:1 # VIP
}
}
# ipvsadm -A -t 192.168.252.100:80 -s rr
virtual_server 192.168.252.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
# ipvsadm -a -t 192.168.252.100:80 -r 192.168.252.11
real_server 192.168.252.11 80 {
weight 1
HTTP_GET {
url { # keepalived监控http://192.168.252.11:80,返回状态码200说明keepalived还存活
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.252.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
验证步骤:
- 关闭node01的网络,这样lvs就不能提供服务,验证node04是否成为新的主机,
ifconfig ens32 down
。 - 启动node01的网络,这样lvs又能提供服务了,这时会发现node01又成为主了。
- 关闭node02中的httpd,这样会发现ipvsadm中关于node02的Real Server记录会被删除,所有的请求都会转发到node03。
- 启动node02中的httpd,ipvsadm中又有node02的Real Server记录,请求也能成功转发到node02。