LVS+Nginx负载均衡限速实战

本文详细介绍了如何对基于LVS+Nginx的负载均衡系统进行流量限速,确保每个客户获得承诺的带宽。通过Linux TC命令在LVS和Nginx的网络命名空间下配置QDISC、CLASS和FILTER,实现了入口和出口的流量控制。出流量限速优化策略是通过在Nginx命名空间下添加策略路由,将出流量转回LVS进行统一限速。

概要:对基于LVS+Nginx的负载均衡进行流量限速,保证对每个客户提供承诺的带宽值。

1 简介


负载均衡的基本功能为根据配置规则进行流量分发,提高整个系统并发度和可靠性。负载均衡整机系统规格是确定的,特别是像带宽这种受限于硬件网卡的规格,当多个客户的负载均衡器在同一负载均衡设备上面运行时会出现资源争抢的问题。为了保证对每个客户提供承诺的带宽值,需要对每个负载均衡器进行流量限速处理。

2 LVS+Nginx负载均衡流量模型

本文中所述负载均衡使用LVS+Nginx实现,LVS完成四层流量转发,Nginx完成七层流量分发。LVS和Nginx分别在各自网络命名空间下运行,相互之间可以通过各自网络命名空间下macvlan虚拟网卡通信。为了提高负载均衡转发能力和可靠性,每个LVS配置两个Nginx后端,同时LVS自身采用主备方式工作。

业务流程图

LVS采用VS/DR(Virtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。具体的报文转发方法为VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户。这种方式是三种负载调度机制中性能最高的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。

流量模型图

3 Linux TC说明


对LVS+Nginx负载均衡进行流量限速处理有两种方法:第一种是修改LVS内核模块,增加流量限速处理功能;第二种是借助LVS和Nginx所在网络命名空间下macvlan虚拟网卡,使用Linux TC命令进行相关限速配置来实现流量限速功能。鉴于第一种方法代码实现难度较大而且不利于后期维护,本文采用第二种方法来实现负载均衡流量限速,第二种方法相对来说配置简单,而且比较灵活。
下面对Linux TC命令进行简要介绍,方便后面理解流量限速的相关配置。


基本原理
报文分组从输入网卡(入口)接收进来,经过路由的查找,以确定是发给本机的,还是需要转发的。如果是发给本机的,就直接向上递交给上层的协议,比如TCP,如果是转发的,则会从输出网卡(出口)发出。网络流量的控制通常发生在输出网卡处,Linux内核中由TC(Traffic Control)实现。TC是利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现流量控制。

流量控制对象
流量控制对象 :QDISC(排队规则),CLASS(类别),FILTER(过滤器)
QDISC(排队规则)
流量控制的一个基本概念是队列(Qdisc),每个网卡都与一个队列(Qdisc)相联系。每当内核需要将报文分组从网卡发送出去,都会首先将该报文分组添加到该网卡所配置的队列中,由该队列决定报文分组的发送顺序。因此可以说,所有的流量控制都发生在队列中。
CLASS(类)
某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。
FILTER(过滤器)
Filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDISC有关。需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。


配置步骤
◆ 为网卡配置一个队列;
◆ 在该队列上建立分类;
◆ 根据需要建立子队列和子分类;
◆ 为每个分类建立过滤器。

4 流量限速


流量限速分为上下行两个方向,由流量模型图可以看出上行即入口流量限速需要在LVS网络命名空间下网卡配置;下行即出口流量限速需要在Ngnix命名空间下网卡配置。

1 入流量限速
配置qdisc
qdisc类型为ingress类型,可以用于限制入方向流量。
# ip netns exec ns-lvs tc qdisc replace dev lan-lvs ingress

配置class
ingress类型的qdisc属于无类别的,不需要配置class

配置filter
假设需要限制入流量为200mbit,并且为了避免其他入流量影响限速准确性,只对目的IP为VIP的报文进行限制,下面配置中VIP为192.168.188.127
# ip netns exec ns-lvs tc filter replace dev lan-lvs parent ffff: handle 0x1 protocol ip prio 10 u32 match ip dst 192.168.188.127 police rate 200mbit burst 10mb mtu 1m drop
parent参数固定为ffff:,表示是ingress类型的qdisc
主要参数是rate、burst和mtu,rate值即为速率,burst需要根据rate来变化,正常为0.1*rate,mtu值默认都使用1m即可。

2 出流量限速
配置qdisc
qdisc类型为htb类型,可以用于限制出方向流量。
# ip netns exec ns-nginx tc qdisc add dev lan-nginx root handle 1: htb default 10
handle为1: 用于后面的class和filter配置时指定parent
default 10表示未做归类的流量分类到1:10类别里

配置class
class配置中设置了限速值,修改限速时只需要修改class的配置,qdisc和filter的配置不需要修改。
# ip netns exec ns-nginx tc class replace dev lan-nginx parent 1: classid 1:1 htb rate 100mbit burst 64K
parent 1: 指定类别归属的qdisc
classid 1:1 类别标识,后面的filter通过flowid归类
rate 100mbit 速率为100mbit/s
burst突发数据大小,目前此值对出口速率影响较小,可以使用默认的或者使用一个适当的固定值,如64k

配置filter
出流量限速应该只对返回给客户端的流量进行限制,即只对源IP为VIP的报文进行限制,下面配置中VIP为192.168.188.127
# ip netns exec ns-nginx tc filter replace dev lan-nginx parent 1: handle 0x1 protocol ip prio 10 u32 match ip src 192.168.188.127 flowid 1:1
parent 1: 指定过滤器归属的qdisc
prio 10 设置优先级为10,数字越小优先级越高
flowid 1:1 归类为1:1,即流经网卡的流量按class 1:1来进行限流

3 出流量限速优化
由于出方向流量限速是在Nginx网络命名空间下进行的,而一个负载均衡器有两个Nginx,那么出方向流量会出现加倍的问题。但是DR模式时流量是从Nginx直接返回给客户端的,为了进行流量的统一控制,需要在Nginx命名空间下添加一条策略路由,将出流量转回LVS,这样就可以在LVS网络命名空间下进行出流量统一限制了。当然这样将流量强行转回LVS会一定程度影响负载均衡器的转发性能。
在Nginx命名空间下添加策略路由将出流量转回LVS后,流量模型如下:

优化后流量模型图

添加策略路由
# ip netns exec ns-nginx ip route add table 100 default via 192.168.188.53 dev lan-nginx
# ip netns exec ns-nginx ip rule add from 192.168.188.127 table 100
其中192.168.188.53为RIP,192.168.188.53为VIP

LVS网络命名空间下复制上述在Nginx网络命名空间下的出流量限速配置即可实现出流量统一限速了。

5 总结


基于LVS+Nginx实现的负载均衡正常可以满足一些并发要求较小的场景,通过在标准Linux系统服务器上面进行LVS和Nginx的相关配置就可以实现。本文中所述的限速方案也同样是通过Linux TC命令这样通用的方式来实现的,具有配置简单灵活的特性。
如果需要高并发和高性能的负载均衡,那么LVS+Nginx显然是满足不了的,这时候可以考虑DPVS或者硬件F5这样的方案,当然成本和系统复杂度也会相应的提升了。

参考资料:
使用LVS+Nginx实现负载均衡
使用LVS+Nginx实现负载均衡_天高任鸟飞,海阔凭鱼跃-优快云博客_lvs nginx
图解LVS的工作原理
图解LVS的工作原理_粥同学的学习笔记-优快云博客_lvs原理
Linux流量整形工具:tc的实现原理
Linux流量整形工具:tc的实现原理_qq_42270373的博客-优快云博客
Traffic Control HOWTO
Traffic Control HOWTO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值