引言

在上一篇文章<<​​如何选择合理的负载均衡算法​​>>中我介绍了负载均衡分为基于请求的负载均衡和基于数据的负载均衡,写下那篇文章的原因是因为在学习数据的分片的时候第一次认识到了选择合理负载均衡算法的条件,那篇文章也稍偏向于基于数据的负载均衡,说白了就是数据如何合理的分片,但随后我自己对于基于请求的负载均衡也并未深究.经过一段时间我发觉这个洞得补上,不然这个知识点可能很长时间我也不会再去理会了,对于如此重要的知识点来说不得不说是一件非常遗憾的事情,遂在学习后记录这篇文章,以帮助有同样需求的朋友参考.

负载均衡如何运用

再识负载均衡_nginx
以上结构是一般的分布式架构的组成,所有标记红点的位置就是我们可以运用负载均衡的地方,显然在用户的请求和应用之间我们需要一个反向代理来实现负载均衡,这里一般是七层负载均衡.还有一些地方只是需要简单的修改IP来达到负载均衡,想象这样一个场景,就是所有的用户对于一个公司只是知道一个IP,但是向这个IP发起请求显然不会只落在一个服务器上,这里就会出现修改IP,这里我们不需要知道包的内容,这样的过程一般称为四层负载均衡.

这里说的几层是什么意思呢?其实就是七层网络模型的数字,七层就是基于应用层的,四层基于传输层.
再识负载均衡_服务器_02
上面提到了四层和七层,这两种负载均衡策略也是最为常见的两种,一般的,也存在两层负载均衡和三层负载均衡:二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址.三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址.

这里值得一提的是一般来说四层负载均衡我们只需要建立一次TCP连接,而七层负载均衡需要建立两次TCP连接.

技术区别

四层负载均衡其实就是基于IP+端口的负载均衡,因为负载均衡器的IP是所谓的VIP,即虚拟IP,也就是说在负载均衡器上我们需要修改IP和端口已达到负载均衡,这样的话我们就不必建立连接,直接转发SYN报文即可,所以我们只需要做一次TCP连接,也就是负载均衡器只是起到了一个转发的作用,所有又被称作四层交换机.

七层负载均衡需要我们对包的内容进行分析,所以要求用户先于负载均衡器做连接,以保证负载均衡器能够分析包的内容,根据其中的内容和内置的选择策略为客户端分配不同的服务器,然后进行连接.这样看来其实这在功能上类似于一个反向代理服务器.显然这相比于四层交换机对机器的要求更高.

应用

这时我们平时所熟知的负载均衡算法才派上了用场,诸如轮询,加权轮询,随机等方法,显然这些方法都运用在前面我们所说的负载均衡服务器上,这样看来就有了一种豁然开朗的感觉.那么这些多种多样的方法如何运用呢?这里因为贫穷不谈诸如F5的硬件负载均衡,就暂且说一说软件.最经典的大概就是基于Nginx的L7负载均衡:
再识负载均衡_服务器_03
这其实就是做一个反向代理服务器.在Nginx中我们就可以非常灵活,可以根据我们的需求去设置,在Nginx中负载均衡策略的缺省值是轮询.

下面是一种更优的架构方式,确实在不考虑存储(数据一致性)的情况下可以做到无限扩展,就是使用L4负载均衡器对平衡对Nginx的请求,Nginx负责正常的转发:
再识负载均衡_负载均衡_04

总结

负载均衡显然是一个大坑,说浅,每个人都知道轮询,加权轮询;说深,这涉及到太多安全和性能上的考虑,可以说有访问的地方就有负载均衡存在.对于我们而言要学习到什么境界呢?我的建议是先浅尝辄止,知道技术原理,待用时再深入了解.学无止境,保持一颗上进与敬畏的心才可.

参考: