LVS简介
-
LVS是Linux Virtual Server的缩写,其主要的功能是实现负载均衡。其可用性=可用时间/(可用时间+故障恢复时间),通常用百分比来表示;99.9%表示一年的故障时间少于8小时;99.99%表示一年的故障时间少于53分钟;99.999%表示一年的故障时间小于5分钟。
-
核心组件:
lp_vs:linux内核功能模块,工作在内核,依赖该内核模块实现负载均衡功能。lp_vs:linux内核功能模块,工作在内核,依赖该内核模块实现负载均衡功能。
ipvsadm:应用层程序,可与lp_vs通信实现对负载均衡的管理和控制。 -
LVS的工作模式
lvs有四种工作模式分别为DR模式、NET模式、TUNNEL模式、FULLNET模式。
*DR模式直接路由
原理:用户先向DNS服务器发送域名解析,DNS向用户返回解析结果此结果为代理服务器的ip地址和mac地址,用户正式向代理服务器发送请求,代理服务器接受请求后会重新分装该请求,通过预先设定的算法找出一个后端的web服务器的mac地址将数据包的目标mac地址改为此mac地址;然后在内网中广播,后端的web服务器接收数据包后会判断其目标mac地址与自己的mac地址是否相同,如果相同就会处理该数据包,处理完成后直接发送给用户;如果不相同则丢弃该数据报。
*NAT模式
原理:用户先向DNS发送域名解析,DNS将解析结构返回给用户,这里的返回结果是代理服务器上的一个虚拟ip,我们称之为vip;用户向vip发送数据报这时代理服务器会接收此数据报;然后通过预先设定的算法找出一个后端节点的真实ip我们称之为RIP,代理服务器重新封装数据包将目标ip改为RIP;web服务器收到代理服务器的转发数据包后,处理数据包,处理完成后将处理结果返回给代理服务器,再由代理服务器转发给用户。
*TUNNEL模式
这里我们不做详细介绍,TUNNEL会在原有的报文基础上添加一个新的ip报头。
*FULLNAT模式
是NAT模型的扩展代理服务器和web服务器可以不在同一网段。 -
LVS的调度算法分为两大类静态算法和动态算法
*静态算法:无视后端节点的负载情况,按照固定的方式给后端节点分配用户请求。
- rr:Round Bobin 轮询,将用户请求交替分配给后端节点。
- wrr:Weighted Round Bobin:加权轮询,按照不同的比例分配给后端节点。
- dh:Destination Hashing目标地址哈希调度,基于用户的地址做哈希表。将相同地址的用户的请求调度到同一个后端主机上。
- sh:Source Hashing原地址哈希调度,基于用户的ip地址做哈希表。将同一客户调度到同一后端节点。
*动态算法:代理服务器会监测后端的节点的负载情况,将新用户的请求调度到一个负载较少的后端节点。 - lc:Least Connection最小连接数调度。
- wlc:Weighted Least Connection加权最小连接数
- SED:是wlc的补充,为了降低overhead出现重复的情况
- NQ:Never Queue基本和SED相同,为了避免性能较差的后端节点长时间空闲
- lblc:基于目标地址的最小连接数调度
- lblcr:带有复制功能的lblc
Keepalived
keepalived最初是为LVS负载均衡设计的,用来管理并监控LVS集群中各个节点的状态,后加入了实现高可用的VRRP功能。VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,是为了解决静态路由中的单点故障问题,VRRP是一种基于优先级的竞选机制来完成处理,竞选出的主节点会一直发送广播包,备用节点一直监听这些广播包,当备用节点无法接受到主节点发出的广播包时就会再次竞选出一个新的主节点来提供服务,保证服务的高可用。
keepalived的配置文件说明
keepalived对RS做健康检查的方式
- HTTP_GET:向后端的RS发送http请求,如果请求成功,说明后端节点正常(RS是web服务的时候比较常用)
- TCP:尝试与后端RS建立TCP连接,如果成功,说明后端节点正常【仅仅是检查RS系统是否正常工作,不能检查具体的业务】
- SMTP:对邮件服务器做健康检测
- MISC:通过脚本的方式实现健康检测
-
TCP健康检测方式举例
TCP_CHECK { # 通过TcpCheck判断RealServer的健康状态
connect_timeout 10 # 连接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 3 # 重连时间间隔
connect_port 80 # 检测端口
} -
HTTP_GET健康检测方式举例
HTTP_GET {
url {
path check/t.html # 检查的uri地址
digest 1362a91278f0 # 用keepalived自带的genhash生成
connect_timeout 3 # 链接超时时间
nb_get_retry 3 # 重连次数
delay_before_retry 3 # 重连时间间隔
connect_port 6500 # 检测端口
} -
MISC健康检测方式举例
MISC_CHECK {
misc_path “/tmp/check.sh http://1.2.3.4:80/c/200.jsp” # 调用外部程序或者脚本的路径和参数
misc_timeout 10 # 脚本执行的超时时间
misc_dynamic # 动态权重标志。
# 脚本返回0 则检测成功,权重不变
# 返回1表示失败,权重设置为0
}check.sh脚本示例
#!/bin/bash if [ $# -ne 1 ]; then echo "Warning: command param error." exit 1 else CHECK_URL=$1 CMD=/usr/bin/curl -I ${CHECK_URL} 2>/dev/null | grep "200 OK" | wc -l` if [ ${CMD} -eq 1 ]; then echo "Succ: Check proxy ${CHECK_URL} is succeed." exit 0 else echo "Fail: check proxy ${CHECK_URL} is failed." exit 1 fi fi