lvs
LVS:
官网:http://www.linuxvirtualserver.org
Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,现在 LVS 已经是 Linux 内核标准的一部分。
使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储
负载均衡集群设计时要注意的问题:
- 是否需要会话保持。用于动态web站点,一般三种方式: 会话绑定、会话复制、会话共享
- 是否需要共享存储
lvs集群术语:
- vs: 前面的调度主机,别名为virtual server、director、dispatcher、balancer
- rs: 后端服务器,别名为real server、upstream server、backend server
- CIP:客户端的ip叫client ip
- VIP:vs其本身是虚拟的主机,面向客户端提供的ip地址也叫virtual ip
- DIP:vs面向rs端的ip叫director ip
- RIP:rs主机自己的ip叫RIP
ipstbales与netfilter:
iptables:用户空间的管理工具,实现snat、dnat
netfilter:内核空间的框架
LVS的组成:
由ipvs 和 ipvsadm。
- ipvs(ip virtual server):工作于内核空间的netfilter的INPUT钩子之上的框架
- ipvsadm:用户空间的命令行工具,ipvs规则管理器,用于管理集群服务及realserver
LVS工作原理
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
lvs集群类型:
- lvs-nat: 修改请求报文的目标ip。用于多目标ip的DNAT
- lvs-dr: 操纵封装新的mac地址
- lvs-tun: 在原来的请求ip报文之外新加一个ip首部
- lvs-fullnat: 修改请求报文的源和目标ip
lvs-nat:
与ipstables的dnat转发一样,但是lvs工作在input前面,有一个ipvs,接收到请求以后,强制跳转到POSTROUTING发出
通过请求报文中的目标地址、目标端口修改为挑出的rs的RIP和端口

注意:
- RIP和DIP必须在同一ip网络中,且应该使用私网地址,rs的网关要指向DIP
- 请求报文和响应报文都必须经由director转发,Director易于成为系统瓶颈
- vs必须是linux系统,rs可以是任意系统
- 支持端口映射,可修改请求报文的目标端口
lvs-dr: 直接路由
请求报文到达VS主机,vs或arp广播一遍,选出一个主机的ip和对应的mac地址,然后在请求报文的首部加上这个RS主机的mac地址,再由vs把请求叫给该主机,rs主机处理完后直接返回CIP
源mac是DIP的网卡mac,目标mac是RS的RIP网卡。源ip、端口和目标ip、端口不变,只变mac


注意:
- 确保前端路由器将目标IP以VIP的请求报文发往director。方法:
- 1)前端网关做静态绑定
- 2)在RS上使用arptables
- arptables -A IN -d vip地址 -j DROP
- arptables -A OUT -s vip地址 -j mangle --mangle-ip-s rip地址
- 3)在RS上修改内核参数以限制arp通告及应答级别
- arp_announce
- arp_ignore
- RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一网络,如果不在同一网络需要RIP单独走一个路由器接入外网;RIP的网关不能指向DIP,以确保响应报文不经过director
- RS跟director要在同一物理网络,Director和各RS都要配置使用VIP
- 请求报文要经过director,但响应报文不能,而是有RS直接发往客户端
- 不支持端口映射
实现
ARP:
通告:ARP会在开机时把所有的网卡,所有对应的网段都发出通告,说明自己的ip和mac
应答:有A、B、C三个网卡,应答时,别人请求的A网卡,问是否有B网卡mac地址,系统也会回应,并让B网卡去做应答
内核功能支持
arp_announce 内核arp通告参数,三个值:0、1、2
0 A网卡在向外部通告时,也会通告B、C网卡的ip、mac。默认配置
1 A网卡通告时,尽量不通告系统中还有B、C网卡
2 A网卡只会通告自己的ip、mac,不会通告别人,系统中还有B、C网卡
arp_ignore 内核arp应答参数,8个值:0、1、2、3、4-7、8
0 有人从A网卡,问B、C网卡的ip,系统会应答。默认配置
1 只会应答对应的网卡接口,从A网卡进入的请求,A网卡应答,B、C网卡不理会
4-7 保留,功能没有使用
8 全部不响应
lvs-tun:
转发方式:
不修改请求报文的ip首部(源为CIP,目为VIP),只是在原来的IP报文之外再加封装一个IP首部(源为DIP,目为RIP),将报文发往RS主机,RS再直接响应客户端(源为VIP,目为CIP)


注意:
- DIP、VIP、RIP都应该是公网IP
- RS的网关不能指向DIP
- 请求报文要经过Director,但响应报文不需要
- RS的os要支持隧道功能
- 不支持端口映射
lvs-fullnat:
通过同时修改请求报文的源ip地址和目标IP地址进行转发,响应报文相反转换:
- CIP<-->DIP
- VIP<-->RIP

注意:
默认不支持fullnat功能,要手动编译内核,加补丁
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一网络。因此,RIP的网关一般不会指向DIP
- RS收到的请求报文源地址是DIP,所以,只能响应给DIP,但director还要将其发送给客户端
- 请求和响应报文都经过Director
- 支持端口映射
ipvs schedule:
根据其调度时,是否考虑RS当前的负载均衡状态,共有12种算法,可分为静态方法和动态方法
静态方法:
一般短连接更合适
- RR(roundrobin): 轮询
- WRR(Weighted): 加权轮询
- SH(Source hashing): 实现session sticky,源IP和hash。将来自同一ip地址的请求发往第一次接入的RS,实现会话绑定
- DH(destination hash): 目标地址哈希,对同一个目标ip的请求,始终转达到第一次接入的RS,典型使用场景是正向代理缓存中的负载均衡
动态方法:
一般长连接更合适,权重越大,结果值越小,优先是用小的
- LC(least connections):最少连接数
Overhead=activeconns*256+inactiveconns - WLC(Weighted LC): 加权最少连接,默认算法,
Overhead=(activeconns*256+inactiveconns)/weight - SED(shortest expection delay): 调度延迟最小的,小者胜出
Overhead=(activeconns+1)*256/weight - NQ(Never Queue): 改进的sed,开局先轮询一遍,挑选还是sed算法
- LBLC(Locality Based LC): 动态的DH算法,基于本地代理主机的最少连接(用于cache,提高缓存命中率)
- LBLCR(LBLC with replication): 带复制功能的LBLC,,把对一个资源的缓存复制到其他RS,可功效缓存
- FO(Weighted Fail Over):遍历本地的RS记录表,找到还未过载的RS,根据权重进行调度,过载设置:
IP_VS_DEST_F_OVERLOAD - OVF((Overflow-connection):基于RS的活动链接数和权重的判断,请求到达时,先遍历本地RS记录表,找为过载的RS,根据RS权重最高发送,直到其 活动连接数 > 权重 ,就会把新请求发给下一个最高权重RS,条件如下:
- 未过载(未设置IP_VS_DEST_F_OVERLOAD状态的RS)
- RS主机的当前活动连接数 < 其权重
- 权重值不能为0
解释:
- Overhead: 当前的指标,负载值
- activeconns: 活动连接数,一个活动连接资源消耗大约等于256个非活动
- inactiveconns: 非活动连接数

浙公网安备 33010602011771号