Linux教程

Linux LVS 介绍

本文主要是介绍Linux LVS 介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

lvs介绍

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工作原理

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

LVS 系统架构

image

LVS 工作模式 及 调度算法

LVS 工作模式

  • lvs-nat:修改请求报文的目标IP,多目标的IP的DNSAT
  • lvs-dr: 为请求报文重新封装一个MAC首部进行转发。
  • lvs-tun: 在原请求报文之外新增加一个IP首部。
  • lvs-fullnat:修改请求报文的源和目标IP。

LVS 的 NAT 模式

NAT 模式本质是多目标IP的DNAT, 通过将请求报文中的目标地址和目标端口修改为某哥挑选出的RS和RIP实现转发。
特点:

  1. RIP 和 DIP 应在同一个IP网络,且应使用私网地址,RS的网关要指向DIP。
  2. 请求报文和相应报文都必须由 Director 转发。 Director 易于成为系统瓶颈。
  3. 支持端口映射,可修改请求报文的目标PORT。
  4. VS 必须是Linux系统,RS可以是任意OS系统。
    image

LVS 的 DR 模式

DR 模式即 Direct Routing,直接路由。LVS 默认模式, 应用最广泛,通过为请求报文重新封装一个MAC首部进行转发。源 MAC 是DIP 所在的借口MAC, 目标MAC是挑选出的RS的RIP所在的借口MAC地址,源IP/PORT,以及目标IP/PORT均保持不变。
特点:

  1. Direcotor 和 各RS都配置有VIP
  2. 确保前端路由器将目标IP为VIP的请求发往Director。
    1. 在前端网关做静态绑定VIP和Director的MAC地址
    2. 在RS上使用 arotables工具
      arptables -A IN -d $VIP -j DROP
      arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
    3. 在 RS 上修改内核参数限制 ARP 通告几应答级别。
      /proc/sys/net/ipv4/conf/all/arp_ignore
      /proc/sys/net/ipv4/conf/all/arp_announce
  3. RS 的 RIP 可以使用似网地址, 也可以是公网地址,RIP 与 DIP 在同一个IP网络,RIP的网管不能指向DIP,已确保报文不会经由Director。
  4. RS 和 Director 要在同一个物理网络。
  5. 请求报文要经由 Director, 但相应报文不经由 Director,而由Rs 直接发往 CLient。
  6. 不支持端口映射(端口不能修改)
  7. 无需开启 ip_forward
  8. Rs 可以使用大多数的OS系统。
    image

LVS 的 TUN 模式

隧道模式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP), 而在源IP报文之外在封装一个IP首部(源IP是DIP, 目标IP是RIP),将报文发往挑选出的目标RS,RS直接相应给客户端(源IP是VIP,目标IP是CIP)。
特点:

  1. RIP和DIP可以不在同一无力网络内,RS的网关一半不能指向DIP,且RIP可以和公网通信,也就是说集群节点可以跨互联网实现,DIP,VIP,RIP可以是公网地址。
  2. RealServer 的 Tun 接口上需要配置VIP地址,以便接收发过来的数据包,以及作为相应的报文源IP。
  3. Director 转发给 RealServer 时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而RealServer 相应给客户端的IP头部是根据隧道内层的IP头分析的到的。源IP是VIP,目标IP是CIP。
  4. 请求报文都要经过 Director, 但相应不经由 Director,响应由 RealServer 自己完成。
  5. 不支持端口映射。
  6. RS的OS必须支持隧道功能。
    应用场景

一般来说,TUN模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
LAN环境一般多采用DR模式,WAN环境虽然可以用TUN模式,但是一般在WAN环境下,请求转发更多的被haproxy/nginx/DNS等实现。因此,TUN模式实际应用的很少,跨机房的应用一般专线光纤连接或DNS调度
image

LVS 的 FULLNAT 模式

通过同时修改报文的源IP和目标IP进行转发。
CIP -->> DIP
VIP -->> RIP
特点:

  1. VIP 是公网地址,RIP 和 DIP 是私网地址,且通常在不同IP网络,因此RIP的网关一般不会指向DIP。
  2. RS 接收到的请求报文源地址是DIP,因此,只需相应给DIP, 但 Director 还要将其发往 CLient
  3. 请求和相应报文都经由 Director。
  4. 相对 NAT 模式,可以更好的实现 LVS-realServer间垮VLAN通信。
  5. 支持端口映射。
    image

总结

lvs-nat与lvs-fullnat:

  • 请求和响应报文都经由Director
  • lvs-nat:RIP的网关要指向DIP
  • lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信

lvs-dr与lvs-tun:

  • 请求报文要经由Director,但响应报文由RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

调度算法

静态调度算法

仅根据算法本身进行调度

  1. RR: roundrobin,轮询,
  2. WRR: Weighted RR, 加权轮询。
  3. SH: Source Hashing,实现 session sticky, 源IP 地址hash。将来自同一个IP地址的请求始终发往同一次挑选的RS,从而实现会话绑定。
  4. DH: Destination Hashing: 目标地址哈希, 第一次轮询调度至RS, 后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡。例如:Web缓存。
  5. FO(内核4.15)
    (Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未
    过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法

动态调度算法

主要根据每台 RS 当前的负载状态几调度算法进行调度 Overhead=value 较小的RS将被调度。

  1. LC: least connections 适用于长连接应用。
    活动连接表示正在传送数据
    非活动连接表示建立连接了,但是没有传送数据
    Overhead=activeconns*256+inactiveconns

  2. WLC: Weighted LC, 默认调度方法,
    WLC是默认调度方法
    这里如果是第一次连接,活动和非活动连接的值都是0.,这样同LC和WL的算法计算结果都是0,需要通过SED来解决这个问题。因为初始+1,就会有数值的对比
    Overhead=(activeconns*256+inactiveconns)/weight

  3. SED:Shortest Expection Delay, 初始连接高权重优先,只检查活动连接而不考虑非活动连接。
    Overhead=(activeconns+1)*256/weight

  4. NQ: Never Queue, 第一轮均匀分配,后续SED。
    解决了第一次分配不均匀的问题。使得所有的服务器都会执行一定的任务

  5. LBLC: Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理

  6. LBLCR: LVLC with Replication 带复制高恩那个的LBLC,解决LBLC负载不均问题,从负载重的复制到轻的RS, 实现WEb Cache等。

  7. OVF(内核4.15)
    (Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度
    到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服
    务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。,属
    于动态算法
    一个可用的真实服务器需要同时满足以下条件:

  • 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

LVS 周边

ipvsadm

  • Unit File: ipvsadm.service
  • 主程序:/usr/sbin/ipvsadm
  • 规则保存工具:/usr/sbin/ipvsadm-save
  • 规则重载工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config
  • ipvs调度规则文件:/etc/sysconfig/ipvsadm

防火墙标记

LVS 持久连接

这篇关于Linux LVS 介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!