LVS: Linux Virtual Server, 负载调度器,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux2.6内核中已经集成,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
LVS 时全球最流程的四层负载均衡开源软件。
LVS 官网:http://www.linuxvirtualserver.org/
阿里云SLB简介:https://developer.aliyun.com/article/1803
整个SLB系统由3部分构成:四层负载均衡,七层负载均衡 和 控制系统,如下图所示;
四层负载均衡,采用开源软件LVS(linux virtual server),并根据云计算需求对其进行了定制化;该技术已经在阿里巴巴内部业务全面上线应用2年多详见第3节;
七层负载均衡,采用开源软件Tengine;该技术已经在阿里巴巴内部业务全面上线应用3年多;参见第4节;
控制系统,用于 配置和监控 负载均衡系统;
LVS 根据报文的目标IP和目标协议及端口将其调度转发至某RS, 根据调度算法来挑选RS,LVS是内核级高恩那个, 工作在INPUT链上,将发往INPUT的流量进行处理。
ubuntu加载lvs
root@ops101:~# for i in $(ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i; done ip_vs_dh ip_vs_fo ip_vs_ftp ip_vs ip_vs_lblc ip_vs_lblcr ip_vs_lc ip_vs_mh ip_vs_nq ip_vs_ovf ip_vs_pe_sip ip_vs_rr ip_vs_sed ip_vs_sh ip_vs_wlc ip_vs_wrr root@ops101:~# ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*" >> /etc/modules root@ops101:~# lsmod | grep ip_vs ip_vs_wrr 20480 0 ip_vs_wlc 16384 0 ip_vs_sh 16384 0 ip_vs_sed 16384 0 ip_vs_rr 20480 0 ip_vs_pe_sip 16384 0 nf_conntrack_sip 45056 1 ip_vs_pe_sip ip_vs_ovf 16384 0 ip_vs_nq 16384 0 ip_vs_mh 16384 0 ip_vs_lc 16384 0 ip_vs_lblcr 24576 0 ip_vs_lblc 20480 0 ip_vs_ftp 20480 0 nf_nat 53248 1 ip_vs_ftp ip_vs_fo 16384 0 ip_vs_dh 16384 0 ip_vs 192512 30 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_ovf,ip_vs_fo,ip_vs_nq,ip_v_lblc,ip_vs_pe_sip,ip_vs_wrr,ip_vs_lc,ip_vs_mh,ip_vs_sed,ip_vs_ftp nf_conntrack 184320 3 nf_nat,nf_conntrack_sip,ip_vs nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs libcrc32c 16384 6 nf_conntrack,nf_nat,btrfs,xfs,raid456,ip_vs root@ops101:~# grep -i ip_vs /boot/config-5.4.0-91-generic CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_FO=m CONFIG_IP_VS_OVF=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_MH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m CONFIG_IP_VS_SH_TAB_BITS=8 CONFIG_IP_VS_MH_TAB_INDEX=12 CONFIG_IP_VS_FTP=m CONFIG_IP_VS_NFCT=y CONFIG_IP_VS_PE_SIP=m
NAT 模式本质是多目标IP的DNAT, 通过将请求报文中的目标地址和目标端口修改为某哥挑选出的RS和RIP实现转发。
特点:
DR 模式即 Direct Routing,直接路由。LVS 默认模式, 应用最广泛,通过为请求报文重新封装一个MAC首部进行转发。源 MAC 是DIP 所在的借口MAC, 目标MAC是挑选出的RS的RIP所在的借口MAC地址,源IP/PORT,以及目标IP/PORT均保持不变。
特点:
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
隧道模式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP), 而在源IP报文之外在封装一个IP首部(源IP是DIP, 目标IP是RIP),将报文发往挑选出的目标RS,RS直接相应给客户端(源IP是VIP,目标IP是CIP)。
特点:
一般来说,TUN模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
LAN环境一般多采用DR模式,WAN环境虽然可以用TUN模式,但是一般在WAN环境下,请求转发更多的被haproxy/nginx/DNS等实现。因此,TUN模式实际应用的很少,跨机房的应用一般专线光纤连接或DNS调度
通过同时修改报文的源IP和目标IP进行转发。
CIP -->> DIP
VIP -->> RIP
特点:
lvs-nat与lvs-fullnat:
lvs-dr与lvs-tun:
仅根据算法本身进行调度
主要根据每台 RS 当前的负载状态几调度算法进行调度 Overhead=value 较小的RS将被调度。
LC: least connections 适用于长连接应用。
活动连接表示正在传送数据
非活动连接表示建立连接了,但是没有传送数据
Overhead=activeconns*256+inactiveconns
WLC: Weighted LC, 默认调度方法,
WLC是默认调度方法
这里如果是第一次连接,活动和非活动连接的值都是0.,这样同LC和WL的算法计算结果都是0,需要通过SED来解决这个问题。因为初始+1,就会有数值的对比
Overhead=(activeconns*256+inactiveconns)/weight
SED:Shortest Expection Delay, 初始连接高权重优先,只检查活动连接而不考虑非活动连接。
Overhead=(activeconns+1)*256/weight
NQ: Never Queue, 第一轮均匀分配,后续SED。
解决了第一次分配不均匀的问题。使得所有的服务器都会执行一定的任务
LBLC: Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
LBLCR: LVLC with Replication 带复制高恩那个的LBLC,解决LBLC负载不均问题,从负载重的复制到轻的RS, 实现WEb Cache等。
OVF(内核4.15)
(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度
到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服
务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。,属
于动态算法
一个可用的真实服务器需要同时满足以下条件: