02_高并发_02_LVS负载均衡这一节做的LVS负载均衡有以下几个缺点:
1. LVS单点故障;
2. RealServer故障的剔除和恢复后的重新注册需要人工干预
引入Keepalived来自动对LVS故障时做故障转移,启用备用的LVS;对RealServer进行健康检查,对RealServer实现自动故障剔除和恢复注册简介
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
工作原理
- VRRP协议(虚拟路由冗余协议) - Virtual Router Redundancy Protocol
- IP漂移:master宕机后,VIP自动转移到BACKUP上面
Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下: - Layer3:Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
- Layer4: Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
- Layer5:Layer5对指定的URL执行HTTP GET或SSL_GET,然后使用MD5算法对HTTP GET结果进行求和。
- MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。
作用
- 主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。
- 高可用web架构:LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)
根据上一节做的实验,进行改造,添加Keepalived和LVS_BACKUP
- 清除node01在上一节做的配置:VIP和ipvs负载
[root@node01 ~]# ifconfig ens33:0 down
[root@node01 ~]# ipvsadm -C
- 安装Keepalived
[root@node01 ~]# yum install keepalived -y -- 安装Keepalived
[root@node01 ~]# cd /etc/keepalived/ -- 备份配置文件
[root@node01 keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3598 7月 30 01:19 keepalived.conf
[root@node01 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@node01 keepalived]# ll
总用量 8
-rw-r--r-- 1 root root 3598 7月 30 01:19 keepalived.conf
-rw-r--r-- 1 root root 3598 8月 12 14:54 keepalived.conf.bak
[root@node01 keepalived]# vi keepalived.conf --编辑配置文件
- man 5 keepalived.conf 查看这个配置文件怎么配置
global_defs:全局配置,主要配置一些邮件通知
vrrp_instance:
- state:MASTER或BACKUP
- interface:配置网卡名称,用于发广播包,可以单独创建一个网卡,把数据网和管理网隔离
- priority:优先级,禅让制,越高越优先替换坏掉的MASTER
- virtual_ipaddress:配置vip,相当于上一节的ifconfig eth0:0 vip/24
virtual_server:配置LVS服务监听哪种请求包
相当于上一节的ipvsadm -A -t 192.168.80.100:80 -s rr
- lb_algo: 调度方式,rr
- lb_kind: 工作模式,DR
- persistence_timeout:持久化超时时间,实验时改为0方便看到效果
- real_server:配置RS服务器
相当于上一节的ipvsadm -a -t 192.168.80.100:80 -r 192.168.80.12 -g
配置完后的配置文件
! 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 #把这王八蛋注释掉,不然严格遵守vvrp协议,访问不了vip的
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.80.100/24 dev ens33 label ens33:0
}
}
virtual_server 192.168.80.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.80.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.80.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
把这个文件远程复制到node04
[root@node01 keepalived]# scp ./keepalived.conf root@192.168.80.14:/etc/keepalived/
The authenticity of host '192.168.80.14 (192.168.80.14)' can't be established.
ECDSA key fingerprint is SHA256:ssVmSpeO3/jYpEcQKbkczMO5SeStnq+VORyw8NnY9G4.
ECDSA key fingerprint is MD5:4f:80:d3:fa:e3:1a:8d:9a:98:1a:1c:e4:61:94:1b:ca.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.80.14' (ECDSA) to the list of known hosts.
root@192.168.80.14's password:
keepalived.conf 100% 1295 455.2KB/s 00:00
到node04修改state为BACKUP和priority为50
- 在node01启动Keepalived
service keepalived start -- 启动
ifconfig --查看keepalived自动添加了ens33:0,没看到多执行一两遍
ipvsadm -ln --查看keepalived自动添加了lvs监听和负载
scp /etc/keepalived/keepalived.conf root@192.168.80.14:/etc/keepalived/ --远程复制
- 在node04上修改keepalived.conf和启动
- 模拟LVS master不可用,把ens33网卡down掉,然后到node04观察ifconfig是不是自动装载子网卡,vip漂移到node04,浏览器访问是不是正常
- 模拟LVS master正常后,负载又恢复到node01,观察node04的子网卡被卸载,node01自动负载
- 如果直接kill掉node01的keepalived,会出现node04装载VIP子网卡,但是node01的VIP子网卡没有卸载,此时同一网络出现两个VIP,有可能造成一个通信过程,包发错,三次握手和四次分手的包打散了。反应了keepalived的简单性,没有互相通信,后期可以用zookeeper来替代。
遇到的问题
vip无法ping通
keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
映射端口无法访问
vip可ping通后,访问vip映射端口无法访问,直接访问real_server的ip和端口可访问。
解决这个问题需要对lvs相关知识进行初步了解,详见《LVS手册》http://www.linuxidc.com/Linux/2016-03/129233.htm
在keepalived.conf中对virtual_server配置有
lb_kind可以设置为NAT、DR、TUN。这个选项直接关系到你做的 virtual_server和real_server能否进行正确映射。
- 转发到node03的real server一直处于SYN_RECV状态,排查后发现没有node03没有在环回网口上配置vip,node03接收到转发过来的包,发现跟自己的ip不对应,把包丢弃了
[root@node01 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:53 SYN_RECV 192.168.80.1:59644 192.168.80.100:80 192.168.80.13:80
[root@node03 ~]# ifconfig lo:8 192.168.80.100 netmask 255.255.255.255
- 自己实验时,浏览器访问时发现很难实现快速轮询(修改后效果不佳)
参考https://blog.csdn.net/yanziguishi/article/details/7228700
通过"ipvsadm -Ln --timeout"可以查看tcp tcpfin udp的超时时间(默认:900 120 300)- persistence_timeout 可以通过"ipvsadm -p timeout" 来设置,或修改keepalived配置文件,在虚拟服务器配置下面加入persistence_timeout 60
- tcp tcpfin udp 可以通过"ipvsadm --set 对应超时时间"来设置,ipvsadm --set tcp tcpfin udp。建议:tcpfin的值最好小于persistence_timeout的值,这样比较方便计算,也有利于tcpfin回收