LVS是什么
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一,现已被收录linux内核代码,所以我们现在可以很容易的配置lvs,无论怎么说这都是国内开源软件的先驱。
LVS为了干什么
随着大业务的爆发,我们从IT时代过渡到了DT时代,随着业务量迸发,C10K问题一直都是计算机专家思考的问题,当基础设备资源已经无法满足业务的快速增长的时候,我们会面对的是两种扩容,垂直扩容和纵向扩容,而垂直扩容往往面对的高昂的硬件设备,而效果往往还是达不到预期效果,所以我们这里首选的应该是纵向扩容,那么接下来的负载均衡集群是我们首先需要面对的,如何让纵向扩展的每台机器高效运转。
在这个power by open source的时代,负载均衡的集群有许多解决方案,然而lvs我认为这是最能代表这个集群工具的解决方案,具有人测试,如果将lvs优化到极限,lvs的并发量可以到达400w,但是lvs的缺点也很明显,它工作在第四层(传输层),无法处理一些七层的高级应用,而后我还是会介绍些七层负载均衡的产品。
LVS的工作模型
从图中我们可以知道,lvs工作在netfilter的input链上,配置的规则都是作用在input链上,属于内核空间工作的工具。
lvs也跟iptables一样:
ipvsadm/ipvs
- ipvsadm: 用户空间的命令工具,用户管理集群服务及集群服务上的RS
- ipvs: 工具与内核上的netfilter的INPUT钩子之上的程序,可根据用户定义的集群实现请求转发
LVS的专业术语
- CIP:client ip
- VIP:virtual server ip
- DIP:director ip
- RIP:real server ip
LVS的集群模型
LVS-NAT
多目标的DNAT,通过将请求报文中的目标地址和目标端口修改为挑选出的RS的RIP和PORT来实现转发
- (1)RIP和DIP必须在同一个IP网络,且应该使用私有地址;RS的网络要指向DIP(保证响应报文必须经由VS)
- (2)请求报文和响应报文都经由Director转发,较高负载下,Director易于成为系统性能瓶颈
- (3)支持端口转发
- (4)vs必须是linux,RS可以是任意os
- (5)基于连接状态追踪机制,本身转发能力受到制约
LVS-DR
RIP为公网地址,VIP与为公网地址,DIP为公网地址
RIP为私网地址,VIP为公网地址,DIP为私网地址
通过请求报文的重新封装一个mac地址进行转发;源mac是dip所在的接口的mac,目标mac是挑选出某rs的rip所在接口的mac地址,ip首部不会放生变化(cip<==>vip)
- (1)确保前端路由器将目标ip为vip的请求报文发向director:
解决发案: - 在路由器上静态绑定vip和director的mac地址
禁止rs响应vip的arp请求,禁止rs的vip进行通告
- 在路由器上静态绑定vip和director的mac地址
- (1)arptables
- (2)修改rs的内核参数,并把vip绑定lo的别名上
arp_ignore,arp_announce
- (2)修改rs的内核参数,并把vip绑定lo的别名上
- (2)rs的rip可以使用私有地址,也可以使用公网地址
- (3)rs跟director必须在同一个物理网络
- (4)请求报文必须由director调度,但响应报文必须不能经由director
- (5)不支持端口衍射
- (6)rs可以使用大多数的os
- (7)是真正能够实现大并发的模型
LVS-TUN
转发方式:不修改请求报文的ip首部(源ip为cip,目标为vip),而是原ip首部之外再封装一个ip首部(源ip为dip,目标ip为挑选的rip);
- (1)rip,dip,vip全是公网地址
- (2)rs网关不能指向也可能指向dip
- (3)请求报文经由director转发,但是响应报文将直接发往cip
- (4)不支持端口衍射
- (5)rs的os必须支持隧道功能
LVS-FUALLNAT
通过同时修改报文的源ip地址(cip->dip)和目标ip地址(vip->rip)进行转发
- (1)vip是公网地址,rip和dip是私网地址,且通常不在同一网络中,但是需要经由路由器互通
- (2)rs收到的请求报文源ip为dip,因此响应报文将直接响应给dip
- (3)请求和响应报文都经由director
- (4)支持端口衍射
LVS SCHEDULER
根据其调度时是否考虑后端主机的当前负载,可分为静态方法和动态方法两种:
- 静态方法:仅根据算法本身进行调度
- RR:Round Robin,轮询
- WRR:Weighted RR,加权轮询
- SH:Source Hashing,源地址hash
目的保持会话 - DH:Destination Hashing,目标地址hash
正向web代理,负载均衡内网用户对外部服务器的请求,hash的事目标地址
- 动态方法:根据算法及各RS当前的负载状态进行调度
根据Overhead来进行RS的选择,Overhead越小越优先被选中
- LC:least connection,最少连接
Overhead=Active*256+inactive - WLC:Wegihted LC 加权最少连接 默认的算法
Overhead=(Active*256+Inactive)/Weight - SED:Shortest Expections Delay
Overhead=(Active+1)*256/weight - NQ:Nerver Queue
SED的优化,SED会导致起初有的RS没有得到请求空闲,NQ就是不管SED每台机器都先发一遍请求,在进行SED - LBLC:Locality-Based LC
动态DH算法,破坏了缓存命中率,提高了负载均衡性 - LBLCR:LBLC with Replication
带复制功能的LBLC,复制缓存服务器