公司动态
【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第五节:伸缩性思考-负载均衡
【架构师从入门到进阶】第五章DNSCDN网关优化思路——第五节伸缩性思考-负载均衡DNS反向代理http重定向IP层的负载均衡数据链路层的负载均衡本篇文章我们来学习伸缩性的思考。通过前面的知识呢。我们来看一看伸缩性怎么做。在前面我们讲过了DNS、CDN还有正反向的代理这些和网站的伸缩性有一定的关系。所谓的网站的伸缩性是指。不需要改变网站的软硬件设计仅仅通过改变部署的服务器的数量就可以扩大或者缩小网站的服务处理能力。一些特别大的网站都经过购买很多服务器用来应对流量洪峰的情况。我们前面讲过演化的原则大型的网站不是一开始就是大型的网站它也是从小型网站逐步演化而来的在这个渐进式的演演化过程中用到的最重要的技术手段就是使用服务器集群通过不断的向服务器集群中添加机器来增强整个系统的处理能力。这个增机器的过程就是伸的过程。然后呢只要加入机器的数量和集群的处理能力呈线性的关系那么你越加机器整体系统的处理能力就越强那么网站就可以以此手段不断的提升自己的规模。也就是说网站的规模和服务器的规模总是在不断的扩大。通常情况下一个经常需要缩的网站也就是说经常需要减服务器的网站有可能是经营不好。但是也不一定比如说阿里在过了双11之后就需要缩因为当时的流量很大平时的流量并没有那么大过了双11这个峰值之后就用不了那么多服务器那么他们就可以把那个服务器释放出来供其他服务调用或者说通过阿里云卖出去OK。前面我们讲过的几个方面都跟伸缩性有关比如说我们讲过DNS、讲过反向代理都跟我们的伸缩性是有关系的。DNS反向代理http重定向IP层的负载均衡数据链路层的负载均衡这些都都可以去做伸缩性。DNS用DNS做伸缩性其实就是利用DNS进行域名解析请求的同时进行负载均衡的一种处理方案。在DNS服务器上我们讲过可以配置多个A记录就是每次域名解析都会根据负载均衡算法计算一个不同的IP地址返回来。也就是说有多个A记录可以配置比如说一个域名映射到abcd四个每次来一个请求DNS都会根据负载均衡算法从四个里选取一个IP返回给客户端然后客户端拿着它再去进行请求。这样的话A记录中配置的多个服务器就构成了一个集群就可以实现负载均衡。用户的浏览器是用户请求域名解析的第一步它去找我们的DNS服务器然后DNS服务器给它一个IP地址。拿到这个IP之后用户的浏览器就拿着这个IP去请求服务器。DNS域名解析的优点就是将负载均衡的工作交给DNS省掉了网站管理员维护负载均衡服务器的麻烦同时许多DNS服务器还支持地理位置的域名解析也就是说它会将域名解析成距离用户地理最近的一个服务器的地址这样可以加快用户访问的速度改善性能。但是有一个缺点我们原来提过DNS不是一台服务器它会有很多很多台。当我们下线一个服务时DNS不一定会及时更新最新的记录有可能在解析的时候将请求分发到一个已经下线的服务器上造成请求访问失败。事实上很多大型的网站利用域名解析做第一级的负载均衡即后面还有做负载均衡的其他的方案通过DNS将请求解析到一台机器上而这台机器并不是实际提供Web服务的机器而是同样提供负载均衡的服务器它再进行转发到真实的服务器上这就是我们后面所讲的反向代理。反向代理通过DNS的解析拿到反向代理服务器的地址这台服务器其实不提供Web服务它只是一个反向代理服务器然后由它再解析到后面的多台机器上这就引出了我们的反向代理。我们知道可以通过返向代理服务器代理后面很多台服务反向代理也可以作为我们前面说过的负载均衡服务器的位置。事实上绝大多数反向代理服务器同时提供负载均衡的功能管理一组WEB服务器它将根据负载均衡算法将请求转发到不同的WEB服务器上。WEB服务器处理完响应也需要经过反向代理服务器返回给用户。在这种情况下有的公司采取一种措施就是说WEB服务器不直接提供对外访问的服务都是通过代理服务器进行中转这样WEB服务器就不需要外网的IP。这样的话反向代理服务器就需要配置外网和内网两套IP地址。这种负载均衡的优点是它可以和反向代理功能一起增加服务器的集群能力并且部署简单。缺点就是说反向代理服务器是所有请求和响应的必经之路就是我请求得经过反向代理服务器转发给WEB服务器然后响应也得通过反向代理返回给浏览器的用户。它会成为一个中转站它性能不高的话就会成为整个请求的瓶颈。http重定向我们来看一下http重定向。http重定向服务器可以是一台普通的应用服务器其唯一的功能就是根据用户的HTTP请求计算一台真实的WEB服务器的地址并将该地址写入http重定向的响应中注意此时它的状态码是302并且把它返回给客户端用户浏览器。然后用户浏览器再根据拿到的重定向后的IP然后再去请求。那么这种方式的优点也是比较简单你做一个WEB服务器放着只要它返回一个302就可以。我们应该在最初学JAVA web基础的时候会学过服务的转发有请求转发还有一个就是重定向重定向就是会在浏览器的地址栏中会改变它的请求地址。转发是请求到了服务器之后服务器自动把它转走但是重定向不是重定向是我请求一个地址这个地址回来给我一个状态码是302再给我一个新的请求地址我通过浏览器再去请求新的地址这是http的重定向。然后缺点就是浏览器需要两次请求服务器才能完成一次访问浏览器第一次得请求这个服务器然后拿到地址之后再请求另外一个服务器性能会比较差重定向服务器自身的处理能力有可能成为瓶颈也有可能就是这台服务器性能不行然后导致所有的浏览器都去请求它的时候会卡顿这样的话由于它性能的问题会限制整个集群伸缩性的规模。然后还有一个就是使用302的这个响应码做重定向的话有可能使搜索引擎判断为SEO的作弊来降低搜索排名因此实战中通过这种方式去做负载均衡并不多也不提倡。IP层的负载均衡下一个是IP层的负载均衡。为什么叫IP层的负载均衡呢这种方案是在网络层通过修改请求目标地址进行负载均衡。IP层负载均衡属于网络层的负载均衡它是通过中间去修改一次网络地址进行负载均衡。我们画个图好了这里面就会有一个问题真实的WEB服务器的响应数据是如何返回给负载均衡服务器的它只改变了请求的目标地址但是对b来说还以为是a浏用户浏览器做的请求因为请求来源是用户a嘛请求中有来源地址。有一种方案负载均衡服务器在修改目的地址IP的同时需要把原地址进行修改将数据包的来源地址也改成自身的IP。像SNAT这样web服务器的就会将响应再给到负载均衡服务器。这种方式负载均衡是在操作系统的内核中完成的数据的分发比http重定向分发的性能更好也就是说。它减少了网络传输。那么集群的最大的响应数据的吞吐量就不得不受制于负载均衡服务器的网卡带宽。什么意思就是说如果说它的带宽不够那么如果要去做一些大文件的传输比如说下载一些文件或者说一些视频那这个就难以满足需求了。那么基于它的缺点我们是不是想如果响应不走负载均衡服务器直接给到浏览器或者调用方。这就是我们下面所说的数据链路层的负载均衡。数据链路层的负载均衡那么数据链路层的负载均衡是怎么一回事呢顾名思义就是在数据链路层做负载均衡。它的意思是在数据链路层进行MAC地址的修改来进行负载均衡。这种传输的方式又称作三角传输模式。负载均衡服务器和真正提供web应用的服务器的对外的IP地址是一样的我们要将集群中所有WEB服务器的IP地址和负载均衡服务器的IP地址配置一样。从而达到不修改数据包的原地址和目标地址就可以进行数据分发的目的。这种方式中不像IP层负载均那样衡请求的目标地址和原来不一样就是不改变它的目标地址。这种方式中请求的IP地址和真实的WEB服务器的IP地址是一致的IP地址是一致的所以就可以将响应数据直接返回给调用方。那这个时候的怎么能决定访问哪台服务器呢就是修改他的MAC地址。每个机器的网卡都有一个唯一固定的MAC地址。虽然他们对外的IP一样但是负载均衡服务器在数据链路层把MAC地址改了改成某个web服务器的MAC地址最后响应的数据从web服务器就直接返回给用户。这样的话就避免了负载均衡服务器这块成为瓶颈。这种方式又称作直接路由的方式也叫DR。这种方式是在大型网站中使用最广的一种负载均衡手段在linux平台上最好的链路层的负载均衡产品大家肯定都比较熟悉就是LVS。