十分钟理解负载均衡( 二 )


三、反向代理负载均衡 
这个肯定大家都有所接触 , 因为几乎所有主流的Web服务器都热衷于支持基于反向代理的负载均衡 。它的核心工作就是转发HTTP请求 。
相比前面的HTTP重定向和DNS解析 , 反向代理的调度器扮演的是用户和实际服务器中间人的角色:
1、任何对于实际服务器的HTTP请求都必须经过调度器
2、调度器必须等待实际服务器的HTTP响应 , 并将它反馈给用户(前两种方式不需要经过调度反馈 , 是实际服务器直接发送给用户)
特性:
1、调度策略丰富 。例如可以为不同的实际服务器设置不同的权重 , 以达到能者多劳的效果 。
2、对反向代理服务器的并发处理能力要求高 , 因为它工作在HTTP层面 。
3、反向代理服务器进行转发操作本身是需要一定开销的 , 比如创建线程、与后端服务器建立TCP连接、接收后端服务器返回的处理结果、分析HTTP头部信息、用户空间和内核空间的频繁切换等 , 虽然这部分时间并不长 , 但是当后端服务器处理请求的时间非常短时 , 转发的开销就显得尤为突出 。例如请求静态文件 , 更适合使用前面介绍的基于DNS的负载均衡方式 。
4、反向代理服务器可以监控后端服务器 , 比如系统负载、响应时间、是否可用、TCP连接数、流量等 , 从而根据这些数据调整负载均衡的策略 。
5、反射代理服务器可以让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器上(粘滞会话) , 这样的好处一是保持session的本地访问 , 二是防止后端服务器的动态内存缓存的资源浪费 。
四、IP负载均衡(LVS-NAT) 
因为反向代理服务器工作在HTTP层 , 其本身的开销就已经严重制约了可扩展性 , 从而也限制了它的性能极限 。那能否在HTTP层面以下实现负载均衡呢?
NAT服务器:它工作在传输层 , 它可以修改发送来的IP数据包 , 将数据包的目标地址修改为实际服务器地址 。
从linux2.4内核开始 , 其内置的Neftilter模块在内核中维护着一些数据包过滤表 , 这些表包含了用于控制数据包过滤的规则 。可喜的是 , Linux提供了iptables来对过滤表进行插入、修改和删除等操作 。更加令人振奋的是 , Linux2.6.x内核中内置了IPVS模块 , 它的工作性质类型于Netfilter模块 , 不过它更专注于实现IP负载均衡 。
想知道你的服务器内核是否已经安装了IPVS模块 , 可以

十分钟理解负载均衡

文章插图
有输出意味着IPVS已经安装了 。IPVS的管理工具是ipvsadm , 它为提供了基于命令行的配置界面 , 可以通过它快速实现负载均衡系统 。这就是大名鼎鼎的LVS(Linux Virtual Server , Linux虚拟服务器) 。
1、打开调度器的数据包转发选项
echo 1 > /proc/sys/net/ipv4/ip_forward
 
2、检查实际服务器是否已经将NAT服务器作为自己的默认网关 , 如果不是 , 如添加
route add default gw xx.xx.xx.xx
 
3、使用ipvsadm配置
ipvsadm -A -t 111.11.11.11:80 -s rr
 
添加一台虚拟服务器 , -t 后面是服务器的外网ip和端口 , -s rr是指采用简单轮询的RR调度策略(这属于静态调度策略 , 除此之外 , LVS还提供了系列的动态调度策略 , 比如最小连接(LC)、带权重的最小连接(WLC) , 最短期望时间延迟(SED)等)
ipvsadm -a -t 111.11.11.11:80 -r 10.10.120.210:8000 -mipvsadm -a -t 111.11.11.11:80 -r 10.10.120.211:8000 -m
 
添加两台实际服务器(不需要有外网ip) , -r后面是实际服务器的内网ip和端口 , -m表示采用NAT方式来转发数据包
运行ipvsadm -L -n可以查看实际服务器的状态 。这样就大功告成了 。
实验证明使用基于NAT的负载均衡系统 。作为调度器的NAT服务器可以将吞吐率提升到一个新的高度 , 几乎是反向代理服务器的两倍以上 , 这大多归功于在内核中进行请求转发的较低开销 。但是一旦请求的内容过大时 , 不论是基于反向代理还是NAT , 负载均衡的整体吞吐量都差距不大 , 这说明对于一睦开销较大的内容 , 使用简单的反向代理来搭建负载均衡系统是值考虑的 。


推荐阅读