接入层的架构渐进历程,反向代理层,DNS轮询

反向代理层有什么用?架构师实现时要注意什么?

1.作为服务端唯一入口,屏蔽后端web集群细节,代表整个web集群

2.保证web集群的扩展性,nginx后端可随时增加web实例

3.保证web集群的高可用,任何一个web实例挂了,服务都不受影响

4.注意自身高可用,防止一台nginx挂了,服务端统一入口受影响

反向代理层存在什么问题?

反向代理层自身的扩展性问题并没有得到很好的解决,例如当nginx成为系统瓶颈的时候,无法扩容。

DNS轮询如何解决反向代理层的扩展性问题?

通过再DNS-server上对一个域名设置多个IP解析,能够增加入口nginx实例个数,起到水平扩展的作用,解决反向代理层的扩展性问题。

单机架构

裸奔时代的结构图如上:

(1)浏览器通过DNS-server,域名解析到ip

(2)浏览器通过ip访问web-server

缺点:

(1)非高可用:web-server挂了整个系统就挂了

(2)扩展性差,当吞吐量达到web-server上限时,无法扩容;

ps:单机不涉及负载均衡的问题

简易扩容方案(2)DNS轮询

假设tomcat的吞吐量时1000次/s ,当系统吞吐量达到3000时,如何扩容是首先解决的问题,DNS轮询是一个很容易想到的方案。

此时的架构图如上:

(1)多部署几份web-server,1个tomcat抗1000,部署3个tomcat就能抗3000

(2)在DNS-server层面,域名每次解析到不同的ip

优点:

(1)0成本:在DNS-server上配几个ip即可,功能也不收费

(2)部署简单:多部署几个web-server即可,原系统架构不需要做任何改造。

(3)负载均衡:变成了多机,负载也是均衡的。

缺点:

(1)非高可用:DNS-server只负责域名解析ip,这个ip对应的服务是否高可用,DNS-server是不保证的,假设有一个web-server挂了,部分服务会受到影响。

(2)扩容非实时:DNS解析有一个生效周期

(3)暴露了太多的外网ip

简易扩容方案(3)反向代理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实时扩容

(5)能够保证站点层的可用性:任何一台tomcat挂了,nginx可以将流量迁移到其他tomcat

缺点:

(1)时延增加+架构更复杂了:中间多加了一个反向代理层

(2)反向代理层成了单点:非高可用,tomcat挂了不影响服务,nginx挂了怎么办?

高可用方案(4)keepalived

为了解决高可用的问题,keepalived出场了

keepalived:

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

架构如上

(1)做两台nginx组成一个集群,分别部署上keepalived,设置成相同的虚拟ip,保证nginx的高可用

(2)当一台nginx挂了,keepalived能够探测到,并将流量自动迁移到另一台nginx上,整个过程对调用方透明

 

优点:

(1)解决了高可用的问题

画外音:反向代理的高可用也解决了

缺点:

(1)资源利用率只有50%%

(2)nginx仍然是接入单点,如果接入吞吐量超过的nginx的性能上限怎么办,例如qps达到了50000

scale up扩容方案(5)lvs/f5

nginx是应用软件,性能比tomcat好,但总有个上限,超出了上限,还是扛不住

lvs就不一样了,它实施在操作系统层面;f5的性能又更好了,它实施在硬件层面;

它们性能比nginx好很多,例如每秒可以抗10w,这样可以利用他们来扩容,常见的架构图如下:

lvs:Linux Virtual Server,使用集群技术,实现在linux操作系统层面的一个高性能、高可用、负载均衡服务器

f5:一个高性能、高可用、负载均衡的硬件设备

(1)如同nginx可以扩展多个tomcat一样,可以通过lvs来扩展多个nginx

(2)通过keepalived+VIP的方案可以保证高可用

99.9999%的公司到这一步基本就结束了,解决了接入层高可用,扩展性,负载均衡的问题

ps:上游再加一层扩充性能

还有什么问题?

不管是使用lvs还是f5,这些都是scale up的方案,根本上,lvs/f5还是会有性能上限,假设每秒能处理10w的请求,一天也只能处理80亿的请求(10w吞吐量*8w秒),那万一系统超过80亿怎么办呢?

scale out扩容方案(6)DNS轮询

水平扩展,才是解决性能问题的根本解决方案,能通过加机器扩充性能的方案才具备最好的扩展性

ps:DNS轮询解决扩展性问题

(1)通过DNS轮询来线性扩展入口lvs层的性能

(2)通过keepalived来保证高可用

(3)通过lvs来扩展多个nginx

(4)通过nginx来做负载均衡,业务七层路由

总结:

(1)接入层架构要考虑的问题为:高可用,扩展性,反向代理,负载均衡

(2)nginx,keepalived,lvs,f5可以很好的解决高可用,扩展性,反向代理,负载均衡的问题

(3)水平扩展scale out是解决扩展性问题的根本方案,DNS轮询是不能完全被nginx/lvs/f5所代替的。

发布了47 篇原创文章 · 获赞 39 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_28119741/article/details/105225377