当前位置: 首页 > 科技观察

为什么lvs不能完全取代DNS轮询

时间:2023-03-14 19:26:56 科技观察

之前的文章《一分钟搞懂负载均衡的一切》引起了很多同学的关注。评论里大家争论的技术点之一就是接入层负载均衡技术有同学持这样的观点:1)在nginx前端加入lvs和keepalived可以替代“DNS轮询”2)F5可以处理高可用,扩展性,以及接入层的负载均衡,是否可以替代“DNS轮询”和“DNS轮询”“查询”是否是过时的技术,是否可以被其他解决方案替代,以及接入层架构技术的演进等问题在这篇文章中详细介绍。1、问题域nginx、lvs、keepalived、f5、DNS轮询。每当提到这些技术时,往往会在接入层讨论以下问题:1)可用性:任何一台机器挂了,服务不会受到影响。影响2)可扩展性:是否可以通过增加机器来扩展系统的性能3)反向代理+负载均衡:请求是否均匀分布到后端的运行单元去执行2、以上的术语是什么意思?因为每个技术人的背景和知识领域都不一样。以上简称(运维同学再熟悉不过了),或者花1分钟简单解释一下(具体请自行“百度”):1)nginx:一个高性能的web-server和Softwarethat实现反向代理2)lvs:LinuxVirtualServer,利用集群技术,在linux操作系统层面实现一个高性能、高可用、负载均衡的服务器3)keepalived:用于检测服务状态存活性的软件,常用于高可用4)f5:一个高性能、高可用、负载均衡的硬件设备(听起来有点像lvs的功能?)5)DNS轮询:通过在DNS-server上为一个域名设置多个ips进行解析,扩展web-server性能,实现负载均衡技术3.接入层技术演进【裸奔时代(0)单机架构】裸奔时代的架构图如上:1)浏览器解析域名为ip2通过DNS-server)浏览器通过ip访问web-server缺点:1)可用性不高,web-server挂了整个系统就挂了2)扩展性差,当吞吐量达到web-server的上限时,它不能扩展注:单机不涉及负载均衡的问题【简单扩展方案(一)DNS轮询】假设tomcat的吞吐量为每秒1000次,当系统总吞吐量达到3000时,如何扩容是首先要解决的问题。DNS轮询是一件容易的事情我想到的解决方案:此时的架构图如上:1)多部署几台web-server,1台tomcat可以抗1000,部署3台tomcat可以抗30002)在DNS-serverlevel,域名每次解析到不同的ip优点:1)零成本:只需在DNS-server上多配置几个IP,功能不收费2)部署简单:只需多部署几个web-servers,原有的系统架构不需要做任何修改。3)LoadBalanced:变成多机,但负载基本均衡。缺点:1)不高可用:DNS-server只负责域名解析ip。DNS-server不保证这个ip对应的服务是否可用。假设有一台网络服务器宕机,一些服务会受影响2)扩容不实时:DNS解析有有效期3)外网IP暴露太多【简单扩容解决方案(二)nginx】tomcat性能差,nginx性能好由于反向代理比较强,假设在线运行达到1w,比tomcat高10倍,可以利用这个特性进行扩展:此时的架构图如上:1)一个反向代理层是添加在站点层和浏览器层之间,使用高性能nginx作为反向代理2)nginx将http请求分发到后端的多个web-server优点:1)DNS-server不需要移动2)负载均衡:由nginx保证3)只暴露一个外网ip,nginx->tomcat使用内网访问4)实时扩展:nginx内部可控,随时添加web-server,随时实时扩展time5)site层的availability可以guaranteed:如果有tomcat挂了,nginx可以将流量迁移到其他tomcat的缺点:1)延迟增加+架构更复杂:中间加了一个反向代理层2)反向代理层变成单点,不高可用:tomcat挂了不影响服务,nginx挂了怎么办?【高可用方案(三)keepalived】为了解决高可用问题,keepalived出现了(之前的文章《使用shadow-master保证系统可用性》有详细介绍):此时:1)make两个Nginx组成一个集群,分别部署keepalived,设置为同一个虚拟IP,保证nginx的高可用2)当一个nginx挂了,keepalived可以检测到,自动将流量迁移到另一个nginx。对调用者透明优点:1)解决高可用问题缺点:1)资源利用率只有50%2)nginx还是单点访问,如果访问吞吐量超过nginx的性能限制怎么办,比如qps达到五万?【纵向扩展方案(四)lvs/f5】nginx毕竟是软件,性能比tomcat要好,但总有一个上限。如果超过上限,还是处理不了lvs则不同,它是在操作系统层面实现的;f5的性能更好,它是在硬件层面实现的;它们的性能比nginx好很多,比如可以抗每秒10w,所以可以用它们来扩容,常见的架构图如下:此时:1)如果可以通过nginx扩展多个tomcat,可以通过lvs扩展多个nginx2)keepalived+VIP的方案可以保证99.9999%的可用性公司可以通过这一步基本解决接入层的高可用、扩展、负载均衡问题。这样可以吗?有没有潜在的问题?那么不管你用lvs还是f5,这些都是scaleup的解决方案。从根本上说,lvs/f5还是会有性能限制的,假设它每秒可以处理10w个请求,一天只能处理80亿个请求(10w秒吞吐量*8w秒),如果系统每天的PV超过80亿怎么办?(嗯,很少有公司要考虑这个问题)【Scaleout扩展方案(五)DNS轮询】在上一篇文章中提到,水平扩展是解决性能问题的根本,通过增加机器来扩展性能的方案有最好的可扩展性。Facebook、谷歌、百度的PV是否超过80亿?难道他们的域名只对应一个ip,终点也是起点,所以还是需要通过DNS轮询进行扩容:此时:1)通过DNS轮询线性扩容入口lvslayer2的表现)通过keepalived保证高可用3)通过lvs扩展多个nginx4)使用nginx做负载均衡,业务七层路由4.结论说了这么多,我简单总结一下:1)需要考虑的问题领域接入层架构是:高可用、可扩展、反向代理+扩展平衡2)nginx、keepalived、lvs、f5可以很好的解决高可用、可扩展、反向代理+扩展平衡问题3)水平扩展scaleout是根本解决方案可扩展性问题。DNS轮询不能完全被nginx/lvs/f5替代。上一篇有同学留言问58家用的什么方案,而58家目前部署在阿里云上,前端购买了SLB服务(可以大致认为是lvs的高可用负载均衡服务+keepalived),后端是nginx+tomcat。5.接入层说了这么多,下一章要说的是服务层的“异构服务负载均衡”(强大的机器应该分配更多的流量,怎么办?)。希望大家有所收获。转发一篇文章只需3秒,求3秒。文章转载自微信公众号《建筑师之路》