关于负载均衡的一些总结
之前只了解Nginx相关的负载均衡,前段时间写RPC框架的时候涉及到LB这块,就去详细学习了些,在这里做个简单的总结。
参考资料:
- http://blog.51cto.com/virtualadc/591396
- http://www.jianshu.com/p/8a61de3f8be9
- http://blog.****.net/column/details/load-balancing.html
一、网络模型不同的层上的负载均衡
在LB这一块,我们常常会看到一些“四层负载均衡”、“七层负载均衡”之类的词。
这里的“层”对应着OSI七层模型,即:
二层负载均衡是通过改写报文的目标MAC地址为上游服务器MAC地址,源IP和目标IP地址不变,负载均衡服务器和真实服务器共享同一个VIP(Virtual IP),如LVS DR工作模式。
四层负载均衡,在接收到第一个来自客户端的SYN 请求时对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。如LVS NAT模式、HaProxy、Nginx TCP负载均衡。
七层负载均衡,先代理最终的服务器和客户端建立连接(三次握手)后,接受到客户端发送的真正应用层内容的报文后再根据该报文中的特定字段选择内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。如HaProxy、Nginx HTTP负载均衡。
七层应用负载的优点是更灵活, 更安全(比如DDoS攻击不会打到后台服务器上), 缺点是对代理机器的要求更高。
二、LVS三种工作模式
2.1 NAT(即Network Address Translation)
流程
原理
- 基于ip伪装MASQUERADES,原理是多目标DNAT。(
我的注释:利用端口做区分
) - 所有请求和响应都经由Director调度器。
LVS-NAT的优点与缺点
优点:
- 支持端口映射
- RS可以使用任意操作系统
- 节省公有IP地址。
- RIP和DIP都应该使用同一网段私有地址,而且RS的网关要指向DIP。
- 使用nat另外一个好处就是后端的主机相对比较安全。
缺点:
请求和响应报文都要经过Director转发;极高负载时,Director可能成为系统瓶颈。
2.2 TUN
流程
原理
- 基于隧道封装技术。在IP报文的外面再包一层IP报文。
- 当Director接收到请求的时候,选举出调度的RealServer
- 当接受到从Director而来的请求时,RealServer则会使用TUN接口上的VIP直接响应CIP。
- 这样CIP请求VIP的资源,收到的也是VIP响应。
- IP隧道原理可参考这篇文章
- 什么是TUN TAP接口
LVS-TUN的优点与缺点
优点:
- RIP,VIP,DIP都应该使用公网地址,且RS网关不指向DIP;
- 只接受进站请求,解决了LVS-NAT时的问题,减少负载。
- 请求报文经由Director调度,但是响应报文不需经由Director。
缺点:
- 不指向Director所以不支持端口映射。
- RS的OS必须支持隧道功能。
- 隧道技术会额外花费性能,增大开销。
2.3 DR(Direct Routing )
流程
原理
- Director接收到请求之后,通过调度方法选举出RealServer。
- Director将目标地址的MAC地址改为RealServer的MAC地址。
- 因为目标IP地址还是VIP,因此需要对RealServer做配置,让它可以接收到发往VIP的流量,可以通过把loopback接口配置为VIP来实现。
- RealServer处理请求之后则使用loopback接口上的VIP响应CIP。
什么是loopback接口: loopback 是一个特殊的网络接口(可理解成虚拟网卡),用于本机中各个应用之间的网络交互。可以看看这个
LVS-DR的优点与缺点
优点:
- RIP可以使用私有地址,也可以使用公网地址。
- 只要求DIP和RIP的地址在同一个网段内。
- 请求报文经由Director调度,但是响应报文不经由Director。
- RS可以使用大多数OS
缺点:
- 不支持端口映射。
- 不能跨局域网。
2.4 总结
三种模型虽然各有利弊,但是由于追求性能和便捷,DR是目前用得最多的LVS模型。
三、Nginx
(这里只说Nginx作为七层LB时的情况)
Nginx负载均衡算法
- Round Robin (RR): 轮询,默认的LB算法
- Weighted Round Robin (WRR): 指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。
- ip_hash:每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。
- hash key: 对某一个key进行哈希
- 一致性哈希: 参考这篇
- least_conn: 把请求负载均衡到最少活跃连接的上游服务器。
四、HAProxy
待填坑