-->

后端面试38讲_27_24_负载均衡架构如何用10行代码实现一个负载均衡服务

你好,我是李智慧。

负载均衡呢是互联网系统架构中必不可少的一个技术。

通过负载均衡,我们可以将高并发的用户请求分发到多台应用服务器组成的一个服务器集群上,利用更多的服务器资源处理高并发下的计算压力。

那么,负载均衡是如何实现的?如何将不同的请求分发到不同的服务器上呢?早期实现负载均衡,需要使用专门的负载均衡、硬件设统,这些硬件通常比较昂贵。

随着互联网的普及,越来越多的企业需要部署自己的互联网应用系统。

而这些专用的负载均衡硬件对他们来说,成本太高于,是出现了各种通过软件实现负载均衡的技术方案。

Http重定向负载均衡是一种比较简单的负载均衡,实现技术来自用户的HTTP请求。

到达负载均衡服务器以后,负载均衡服务器根据某种负载均衡算法计算,得到一个应用服务器的地址。

通过负TTP状态码三零二重定向响应,将新的IP地址发送给用户浏览后,用户浏览器收到重定向响应后,重新发送请求,到真正的应用服务器,以此来实现负载均衡。

这种负载均衡实现方法比较简单,如果用java开发的话,只需要在select代码中调用响应重定向方法就可以了。

在简化的情况下,只需要不到十行代码,就可以实现一个HTTP重定向负载均衡。

Http重定向负载均衡的优点是设计比较简单,但是它的缺点也非常明显。

一方面,用户完成一次访问,需要请求两次数据中心一次请求负载均衡服务器一次请求应用服务器请求处理性能会受到很大的影响。

另一个问题是因为响应要重定向到真正的应用服务器,所以需要把应用服务器的IP地址暴露给外部用户,这样可能会带来安全性方面的问题。

负载均衡服务器通常不部署,应用代码,也会关闭不必要的访问端口,设置比较严格的防火墙权限,通常安全性会更好一点。

因此,一个互联网系统通常只将负载均衡服务器的IP地址对外暴露供用户访问。

而应用服务器则提供内网IP微部访问者无法直接连接应用服务器,但是使用HTTP重定向负载均衡应部访问器不得不使用公网IP微部访问者可以直接连接到应用服务器,系统的安全性会降低,因此HTTP重定向负载均衡在实践中很少使用另一种负载均衡,实现技术呢是DNS负载均衡。

我们知道浏览器或者APP应用访问数据中心的时候,通常是用域名进行访问。

而HTTP协议则必须要知道IP地址才能够建立起通讯连接。

那么域名是如何转换成IP地址的呢?就是通过DNNS域名服务器来完成的当用户。

从浏览器发起HTTP请求的时候,首先要到DNS域名服务器进行域名解析解析,得到IP地址以后,用户才能够根据IP地址建立起HTTP连接访问真正的数据中心的应用服务器。

这时候就可以在DNS域名解析的时候进行负载均衡。

也就是说,不同用户进行域名解析的时候,返回不同的IP地址,从而实现负载均衡。

文章中有一张架构图,我们可以看到DNS负载均衡和HTTP重定向负载均衡是否很像。

那么DNS会不会有性能问题和安全性问题呢?首先,和HTP重定向负载均衡不同,用户不需要每次请求都进行DNS域名解记。

第一次解析以后,域名和IP都缓冲在本机后面,较长一段时间都不会再进行域名解析了,因此性能方面不会是问题。

其次,如果如图中所示,域名解析直接得到应用服务器的IP地址,确实会存在安全性的问题。

但是,大型互联网应用通常不直接通过DNS解析得到应用服务器的IP地址,而是解析得到负载均衡服务器的IP地址。

也就是说呢,大型互联网应用需要进行两次负载均衡,一次通过DNS负载均衡用户请求访问数据中心负载均衡服务器集群的某台机器,然后由这台负载均衡服务器再进行一次负载均衡,将用户请求分发到应用服务器集群的某台服务器上。

通过这种方式,应用服务器不需要将公网IP暴露给外部访问者,避免了安全问题。

Dns域名解析是域名服务商提供的一项基本服务,几乎所有的域名服务商都支持域名解析,负载均衡只需要在域名服务上的控制台进行一下配置,不需要开发代码进行部署,就可以拥有DNS负载均衡服务了。

目前大型的互联网应用,淘宝、百度、google等全部都使用DNS负载均衡。

如果用不同的电脑拼淘宝,点com就可以看到不同的电脑,得到的IP地址是不同的。

我在缓冲架构一篇中提到用户请求到达数据中心以后,最先到达的就是反向代理服务器。

反向代理服务器查找本机是否有请求的资源。

如果有,就直接返回资源。

如果没有呢,就将请求发送给后面的应用服务器继续处理。

事实上,发送请求给应用服务器的时候就可以进行负载均衡,将不同的用户请求分发到不同的服务器上面去。

比如NGX这样的HTTP服务器,就会同时提供反向代理和负载均衡的功能。

反向代理服务器是工作在HTTP协议层上的,所以它代理的也是HTTP的请求和响应。

作为互联网应用层的一个协议,HTTP协议相对来说比较重,效率比较低。

所以反向代理负载均衡通常用在小规模的互联网系统上,只有几台或者十几台服务器的规模。

反向代理负载均衡因为是工作在应用层协议上的负载均衡,所以也叫应用层负载均衡。

应用层负载均衡之下的负载均衡方法是在TCPAP协议的IP层进行负载均衡。

Ip层是网络通信协议的网络层,所以有时候也叫网络层负载均衡。

它的主要工作原理呢,当用户的请求到达负载均衡服务器以后,负向均衡服务器会对网络层的数据包的IP地址进行转换,修改IP地址,将其修改为应用服务器的IP地址。

然后把数据包重新发送方法,所求数据就会到达应用务均衡AP负载均衡不需要在HPP协议层工作,可以在操作系统内核直接修改IP数据包的地址。

因此,效率比应用层的反向代理负载均衡要高得多。

但是它依然有一个缺陷,才管是请求还是响应的数据包,都要通过负载均衡服务器进行IP地址转换,才能够正确的把请求数据分发到应用服务器,或者正确的将响应数据包发送给用户端程序。

请求的数据通常都比较小,一个UL或者一个简单的表单。

但是响应的数据,不管是HTML还是图片或者是JSCSS,这样的资源文件通常都会比较大。

因此负载均衡服务器会成为响应数据的流量瓶颈。

链路层负载均衡可以解决响应数据量大而导致的负载均衡服务器输出带宽不足的问题。

也就是说啊,负载均衡服务器并不修改数据包的IP地址,而是修改数据链路层里的网卡mac地址,在数据链路层实现负载均衡。

而应用服务器和负载均衡服务器都使用相同的虚拟IP地址,这样IP路由就不会受到压力。

但是网卡会根据自己的mac地址选择负载均衡,服务器发送到自己网卡的数据包就给对应的应用程序去处理。

处理结束以后,到把响应的数据包发送到网络上的时候,因为IP地址没有被修改过,所以这个响应会直接到达用户的浏览器,而不会再经过负载均衡服务器。

因据层负载均衡避免响应数据。

在经过负载均衡服务器,因而可以承受较大的数据传输压力。

所以目前大型互联网应用基本都使用链路层负载均衡,linux上实现a p负载均衡和和链路层负载均衡的技术是LVS.目前LVS功功已经集集成,lininx x通过linux可以直接配置,这两种负载均衡即可以配置技术。

在早刚均衡现的时候,设备昂贵,使复杂杂,有大企业才用用得、起用得。

但是到了今天,随着互联网技术的发展与普及,负载均衡已经是非常常见的分布式技术之一了。

不用也非常简单。

如果使用云计计平平台,需要在控制台台击器器器即可配置置实一一个负载均衡了。

即使是自己部署一个负载均衡服务器管管,直接接用云inx,还是用用n景x也不是很复杂。

我在这里主要描述的是负均均衡的网络技术架构。

事实实实现一负均均衡衡,需需要注负负均均衡算法。

也就是说啊,当一个请求到达负载均衡服务器的时候,使用用均衡服务器,该选择集群中的哪一个应用服务器将请求发送给它呢?目前主要的负载均衡算法轮轮随随机,少连接几种轮询,就是将请求轮流发送给应用服务器,随机就是将请求随机发送给任何一台应应服务器,而而少连接接则是根据应用服务器当前正在处理的连接数,将请求分发给最少连接的服务器,使用HTTP重定项,只需要很少的代码,就可以完成一个简化的负载均衡。

能否利用你熟悉的编程语言言写一简简化的HTTB重定向负均均的demo呢?欢迎你在评评论区写下你答答案,我会和你一起流流。

欢迎把这篇文章分享给你的朋友,或者同事一起交流一下。