一、背景
"远古时期",单机计算机处理性能很低,一般我们会通过扩容机器配置资源,以便更好承载我们的应用,例如:当时的个人电脑,如果你想玩大型游戏,我们最直接的做法就是替换更好的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
将新的链接请求分配到当前链接最小的服务器,上游服务器性能相近时采用此种为好。
以上,希望对您理解负载均衡有所帮助。码字不易,如果你觉得对你有所帮助,欢迎点赞评论加关注,后续还会出更多优质文章和回答。