一文带你深入理解负载均衡原理

一、背景

"远古时期",单机计算机处理性能很低,一般我们会通过扩容机器配置资源,以便更好承载我们的应用,例如:当时的个人电脑,如果你想玩大型游戏,我们最直接的做法就是替换更好的CPU,增加内存条,扩容磁盘等方式,而这种方式称为向上扩展(Scale Up)。

渐渐人们发现,向上扩展的方式虽然能解决问题,但是代价非常大,原因就在于成本,为了能让业务应用更好向外提供服务,企业不得不花费大价钱购买设备,而那时候的内存、磁盘等设备容量低,价格也很高。总的来说向上扩展这种方式性价比极低。

2004年,Google发布的MapReduce论文,以崭新的向外扩展(Scale Out)方式证明了其价值,简单来说,就是通过增加应用程序实例,将用户请求均匀分发到后端多个实例,从而提高服务数据处理能力。那怎样才能将请求均匀分发到后端呢?

最具有代表性的属2004年开源的Nginx,类似的软件还有Haproxy、Haproxy+keepalived、LVS等,当然有软件就有硬件,耳熟能详的F5就是硬件负载均衡的一种。

总之,负载均衡在现有的网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

一文带你深入理解负载均衡原理

二、四层和七层负载均衡

上面已经提到,目前主流的负载均衡软件有Nginx、LVS等,其中Nginx主要用于七层Loadbalance,也支持四层,LVS典型四层Loadbalance,那四层和七层有什么区别?

下面我们使用wireshark工具抓包分析说明:

一文带你深入理解负载均衡原理

  • Frame: 1层,物理层
  • Ethernet II:2层,数据链路层,Mac地址解封装,Arp广播寻址
  • Internet Protocal: 三层,网络层,IP地址解封装,通过路由器寻址
  • Transmission Control Protocol: 四层,传输层

通过上面四层报文信息,可以看到四层报文主要封装了端口信息;

一文带你深入理解负载均衡原理

  • Hypertext Transfer Protocol: 七层,应用层,主要封装了请求方法、url、请求头等信息

通过上面可以看出:四层负载,是通过IP+Port的负载均衡;七层负载,是基于web请求方法、url、请求头、端口、path等信息的负载均衡。

由上可知: 七层负载均衡针对web请求负载均衡时,可选维度丰富、灵活,当然Nginx需要解析web请求协议(HTTP, HTTPS, FastCGI, uwsgi, SCGI, gRPC, websocket等)

补充:url格式: scheme:://username:password@host:port/resource_path?query#fragment

三、Nginx 和 LVS

我们此次重点介绍一下Nginx的七层负载均衡和LVS四层负载均衡原理。

Nginx

下游服务: 一般指浏览器或者服务调用方;

上游服务: 后端服务,即被调用服务;

Nginx中通过upstream定义一组被反向代理服务,即定义后端被调用服务;

一文带你深入理解负载均衡原理

LVS

LVS工作模式有四种: DR、TUN、NAT、fullNAT,本节只介绍NAT模式,方便理解负载均衡底层实现。

LVS通过调用内核netfilter模块,其底层数据结构为HashMap,当负载均衡服务较大时,LVS比IPTABLES性能好,因为iptables需要从上到下依次match,时间负载度为O(n),而LVS采用Hash算法O(1)。

其网络数据链路如下:

NIC(网卡) ->eth0->XDP->alloc skb->TC ingress -> PREROUTING ->系统路由表->( | INPUT->OUTPUT )FORWARD ->POSTROUTING->TC egress->lxc0->eth0->NIC

一文带你深入理解负载均衡原理

四、负载均衡算法

在Nginx中我们我们通过upstream定义一组后端服务,但请求具体到达那个后端服务,往往需要根据业务需求进行负载均衡算法配置。

  • Round Robin

轮训算法,依次将请求分配到各个后台服务器中,一般为默认方式

  • Weight

根据权重来分发请求到不同的机器中,Weight与访问比率成正比,用于后端服务器性能不均、灰度发布场景

一文带你深入理解负载均衡原理

  • IP hash

根据请求者IP的hash值降请求发送到上游服务器中,可以解决session问题

一文带你深入理解负载均衡原理

  • Least connection

将新的链接请求分配到当前链接最小的服务器,上游服务器性能相近时采用此种为好。

一文带你深入理解负载均衡原理

以上,希望对您理解负载均衡有所帮助。码字不易,如果你觉得对你有所帮助,欢迎点赞评论加关注,后续还会出更多优质文章和回答。

上一篇:带你十天轻松搞定 Go 微服务系列(一)


下一篇:lvs学习记录-NO.1