超详细!一文详解负载均衡原理
Posted 高效运维
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超详细!一文详解负载均衡原理相关的知识,希望对你有一定的参考价值。
负载均衡由来
使用负载均衡可以给我们带来的几个好处:
提高了系统的整体性能;
提高了系统的扩展性;
提高了系统的可用性;
负载均衡类型
(一)DNS 实现负载均衡
-
服务器故障切换延迟大,服务器升级不方便。我们知道 DNS 与用户之间是层层的缓存,即便是在故障发生时及时通过 DNS 修改或摘除故障服务器,但中间经过运营商的 DNS 缓存,且缓存很有可能不遵循 TTL 规则,导致 DNS 生效时间变得非常缓慢,有时候一天后还会有些许的请求流量。 -
流量调度不均衡,粒度太粗。DNS 调度的均衡性,受地区运营商 LocalDNS 返回 IP 列表的策略有关系,有的运营商并不会轮询返回多个不同的 IP 地址。另外,某个运营商 LocalDNS 背后服务了多少用户,这也会构成流量调度不均的重要因素。 -
流量分配策略太简单,支持的算法太少。DNS 一般只支持 rr
的轮询方式,流量分配策略比较简单,不支持权重、Hash 等调度算法。 -
DNS 支持的 IP 列表有限制。我们知道 DNS 使用 UDP 报文进行信息传递,每个 UDP 报文大小受链路的 MTU 限制,所以报文中存储的 IP 地址数量也是非常有限的,阿里 DNS 系统针对同一个域名支持配置 10 个不同的 IP 地址。
(二)硬件负载均衡
F5
和
A10
。
-
功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法。 -
性能强大:性能远超常见的软件负载均衡器。 -
稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高。 -
安全防护:还具备防火墙、防 DDoS 攻击等安全功能,以及支持 SNAT 功能。
-
价格贵; -
扩展性差,无法进行扩展和定制; -
调试和维护比较麻烦,需要专业人员;
(三)软件负载均衡
nginx
、
HAproxy
、
LVS
。其中的区别:
-
Nginx
:七层负载均衡,支持 HTTP、E-mail 协议,同时也支持 4 层负载均衡; -
HAproxy
:支持七层规则的,性能也很不错。OpenStack 默认使用的负载均衡软件就是 HAproxy; -
LVS
:运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务。
软件负载均衡的优点:
-
易操作:无论是部署还是维护都相对比较简单; -
便宜:只需要服务器的成本,软件是免费的; -
灵活:4 层和 7 层负载均衡可以根据业务特点进行选择,方便进行扩展和定制功能。
负载均衡LVS
软件负载均衡主要包括:Nginx、HAproxy 和 LVS,三款软件都比较常用。四层负载均衡基本上都会使用 LVS,据了解 BAT 等大厂都是 LVS 重度使用者,就是因为 LVS 非常出色的性能,能为公司节省巨大的成本。
LVS,全称 Linux Virtual Server
是由国人章文嵩博士发起的一个开源的项目,在社区具有很大的热度,是一个基于四层、具有强大性能的反向代理服务器。
它现在是标准内核的一部分,它具备可靠性、高性能、可扩展性和可操作性的特点,从而以低廉的成本实现最优的性能。
Netfilter基础原理
通俗点讲,就是 netfilter 提供一种机制,可以在数据包流经过程中,根据规则设置若干个关卡(hook 函数)来执行相关的操作。netfilter 总共设置了 5 个点,包括:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
-
PREROUTING
:刚刚进入网络层,还未进行路由查找的包,通过此处 -
INPUT
:通过路由查找,确定发往本机的包,通过此处 -
FORWARD
:经路由查找后,要转发的包,在POST_ROUTING之前 -
OUTPUT
:从本机进程刚发出的包,通过此处 -
POSTROUTING
:进入网络层已经经过路由查找,确定转发,将要离开本设备的包,通过此处
LVS基础原理
当用户访问 www.sina.com.cn 时,用户数据通过层层网络,最后通过交换机进入 LVS 服务器网卡,并进入内核网络层。
LVS 是工作在 INPUT 链上,会根据访问的
IP:Port
判断请求是否是 LVS 服务,如果是则进行 LVS 主流程,强行修改数据包的相关数据,并将数据包发往 POSTROUTING 链上。
-
DR
模式 -
NAT
模式 -
Tunnel
模式
FullNAT
,这个模式在开源版本中是模式没有的。这个模式最早起源于百度,后来又在阿里发扬光大,由阿里团队开源,代码地址如下:
-
https://github.com/alibaba/lvs
DR 模式实现原理
(一)实现原理过程
CIP
,目的 IP 是新浪对外的服务器 IP 地址,也就是 VIP;此时源 MAC 地址是
CMAC
,其实是 LVS 连接的路由器的 MAC 地址(为了容易理解记为 CMAC),目标 MAC 地址是 VIP 对应的 MAC,记为
VMAC
。
② 数据包经过链路层到达 PREROUTING 位置(刚进入网络层),查找路由发现目的 IP 是 LVS 的 VIP
,就会递送到 INPUT 链上,此时数据包 MAC、IP、Port 都没有修改。
RMAC
,目的 MAC 是下一跳(路由器)的 MAC 地址,记为 CMAC(为了容易理解,记为
CMAC
)。然后数据包通过 RS 相连的路由器转发给真正客户端,完成了请求响应的全过程。
(二)优缺点和使用场景
DR 模式的优点
响应数据不经过 lvs,性能高
对数据包修改小,信息保存完整(携带客户端源 IP)
DR 模式的缺点
lvs 与 rs 必须在同一个物理网络(不支持跨机房)
服务器上必须配置 lo 和其它内核参数
不支持端口映射
DR 模式的使用场景
NAT 模式实现原理
(一)实现原理与过程
-
NAT 模式优点
能够支持 windows 操作系统
支持端口映射。
如果 rs 端口与 vport 不一致,lvs 除了修改目的 IP,也会修改 dport 以支持端口映射。
NAT 模式缺点
后端 RS 需要配置网关
双向流量对 lvs 负载压力比较大
NAT 模式的使用场景
如果你是 windows 系统,使用 lvs 的话,则必须选择 NAT 模式了。
(一)实现原理与过程
⑤ 后端服务器收到数据包后,ipip 模块将 Tunnel 头部卸载,正常看到的源 ip 是 cip,目的 ip 是 vip,由于在 tunl0 上配置 vip,路由查找后判定为本机 ip,送往应用程序。应用程序 nginx 正常响应数据后以 vip 为源 ip,cip 为目的 ip 数据包发送出网卡,最终到达客户端。
Tunnel 模式具备 DR 模式的高性能,又支持跨机房访问,听起来比较完美。不过国内运营商有一定特色性,比如 RS 的响应数据包的源 IP 为 VIP,VIP 与后端服务器有可能存在跨运营商的情况,很有可能被运营商的策略封掉,Tunnel 在生产环境确实没有使用过,在国内推行 Tunnel 可能会有一定的难度吧。
(二)优点、缺点与使用场景
Tunnel 模式的优点
单臂模式,对 lvs 负载压力小
对数据包修改较小,信息保存完整
可跨机房(不过在国内实现有难度)
Tunnel 模式的缺点
需要在后端服务器安装配置 ipip 模块
需要在后端服务器 tunl0 配置 vip
隧道头部的加入可能导致分片,影响服务器性能
不支持端口映射
Tunnel 模式的使用场景
理论上,如果对转发性能要求较高,且有跨机房需求,Tunnel 可能是较好的选择。
![超详细!一文详解负载均衡原理](https://image.cha138.com/20210424/decd38a47c2347ce94d8103c51466f0d.jpg)
近期好文:
投稿邮箱:jiachen@greatops.net,或添加联系人微信:greatops1118.
以上是关于超详细!一文详解负载均衡原理的主要内容,如果未能解决你的问题,请参考以下文章
详解通过Nginx 实现Tomcat 负载均衡环境(图文并茂,超详细)