分布式架构中关于正向代理反向代理面试提问
引言
面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确实了解了。
接下来又开始问我网络相关的知识,但不是直接问HTTP三次握手,TCP,UPD这些,因为这些基础已经在一面问完了,这一面只围绕分布式系统相关的网络概念,从最基本的代理开始。
1、面试官:完看你简历提到使用过Nginx做代理,你是如何理解“正向代理”,“反向代理”的?
问题分析: 即使作为业务开发人员也会经常遇到需要配置Nginx或其他负载均衡的问题,比如你做了一个文件上传服务,上线后发现文件被拦截了,看看报错信息一看是被Nginx 代理拦截了,Nginx限制了文件大小,这个时候代理的概念是啥怎么看明白这个问题呢?
答:
正向代理: 代理用户端请求服务端,相对于服务器用户端是匿名的,比如单位内网使用了正向代理软件,所有员工都访问百度,但是百度看到的只有一个IP地址,百度也不知道到底是哪个员工访问的。
反向代理: 代理服务端提供服务,相对于用户服务端是匿名的,同样是访问www.baidu.com,所有用户输入的都是一个网站或者一个IP,但是百度背后有成千上万的服务器,你也不知道你访问的是哪一个。
2、面试官:那服务端为什么要使用代理?有啥好处?
问题分析: 面试官点点头,对我理解的代理表示认可,随后问我使用代理有什么用,考察代理技术的原理。
答:比如用 Nginx 做代理,这样就可以开buffer,Nginx 可以把 Request 请求和 Response 在读取完整之前 buffer 住,好比饭店服务员,所有顾客要什么菜和一个服务员说一下就行了,不会直接找厨师,一个服务员接待10个顾客,最后把点的20道菜分发给5个厨子做就行了,厨子好比服务器,这样厨子就可以专心做菜了,接待这种事就有Nginx代理做,同时,还可以根据顾客数量多增加或者减少厨师数量,把任务均匀分给每个厨师,这就是负载均衡的作用,Nginx 就可以有效分发流量。
总的来说:
- 让IO和服务器分离,突破IO性能,提高服务器吞吐能力。
- 控制流量分发,管理服务集群,起到负载均衡作用。
- 安全性和匿名性:通过拦截前端服务器的请求,反向代理服务器可以保护其身份,并可以抵御安全攻击。它还确保可以从单个记录定位器或URL访问多个服务器,而不管服务端网络的结构如何。
3、面试官:那你知道哪些负载均衡算法?
问题分析: 聊到了负载面试官要继续深挖算法了。
答:
轮询算法:简单的理解就好比性感荷官在线发牌,从左到右依次发牌,最后每个人获得的纸牌张数一样,轮询算法就是将多个用户请求按顺序依次分发到1-10号机器上,目的就是让每台机器承受相同的压力,100W次查询理论上每台机器分摊了10W次查询。
加权轮询算法:轮询算法和加权轮询算法有什么区别?想象一下,如果10台服务器的配置不相同,8台机器是8核32G,剩下两台是4核16G,如果按照算法1轮询,每台机器分担10W次请求,那两台低配的服务器说我扛不住呀,你们配置比我好,这不公平,我要宕机休息一下,加权轮询算法就是为了应对这种情况,设置不同机器的权重不同,10台同配置机器分别均摊10%的流量,如果机器性能不同,那让两台低配的权重降低,只承担5%的流量,这样就公平了,能者多劳。每台机器都不闲着发挥自己最大的性能。
随机算法:随机算法和轮询算法类似,让所有请求随机分配到不同的机器上,请求越多最后分散在每台机器上的请求数约接近相等。
加权随机算法:和加权轮询算法道理相似,这里不多说了。
最小连接数算法:最小链接数就是请求分发以前,先看当前10台机器谁最清闲,谁当前处理的链接数最少那就把活分给谁,最后的分工也相对公平。
Hash 算法:前5种算法有一个问题,就是同一个用户的请求多次,可能每次都会被分配到不同机器上,这样有什么不好?如果服务器缓存了用户 Session,那每次请求不同服务器都需要保存用户的 Session,最坏的结果就是用户请求10次,10台服务器都缓存了同一个用户的 Session,这显然是浪费服务器资源。这个时候 Hash 算法就出现了,如果读者还不知道 Hash,建议先 Google 下 Hash,hash(client:ip) % N,N就是服务器的数量,只要用户的 IP不变,最后 Hash 取余的结果就不会变,这样就能保证同一个用户每次请求都会在同一台机器上,这里的IP还可以是用户的其他唯一ID。
一致性Hash:hash(client:ip) % N 上面的公式中如果N变了怎么办?比如一台服务器断电了,那最后 Hash 取余的结果就全变了,所有用户会被分配到哪台机器需要全部重新计算,这对有 Session 状态的服务就是一场灾难,一致性Hash 就是为了解决这个问题。
深入分析
负载均衡几乎是各大互联网公司搭建系统必用的技术了,也会有初学者学习分布式系统时会问我,什么是负载均衡,为什么要使用负载均衡,多加一层负载均衡会让服务调用变慢吗?带着这些问题学习一下这一章。
先看下没有负载均衡的网站架构
不知道你有没有发现,如果服务端是单台服务器,直接通过网络就可以链接。为什么说负载均衡几乎是各大互联网公司搭建系统必用的技术,除了个人网站,比如我的博客还是单体服务器以外,相信没有哪家互联网公司的服务敢这样,一台机器如果宕机怎么办?让用户等一会儿吗?那估计这家公司离倒闭就不远了。
那怎么解决单机故障的问题,再看下面的图。
可以看出,多台服务器的情况,增加了一层负载均衡。
什么是负载均衡
负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群、网络连接、CPU、磁碟驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个伺服器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。
? ——— 维基百科
简单地理解负载均衡的作用就是流量分发,将大量用户请求分发到不同服务器上分担压力,如果有机器宕机,负载均衡服务器会负责把故障机器自动摘除。
常用的负载均衡框架
Nginx
:NGINX | High Performance Load Balancer, Web Server, & Reverse Proxy ,来自俄罗斯的软件,不光可以用作负载均衡,反向代理,还是出色的web服务器,使用广泛,所以也是面试常问的知识点。如果英文不错可以参考。
LVS
:The Linux Virtual Server Project - Linux Server Cluster for Load Balancing ,Linux Virtual Server的缩写,一个Linux下的开源服务器集群系统,章?文嵩博?士于1998年5月创立。
HAProxy
:http://www.haproxy.org/ ,一款高可用http/TCP负载均衡。
F5
:F5 | Multi-Cloud Security and Application Delivery 硬件负载均衡。
上述都是常见负载均衡,在企业里具体使用哪种框架并不是绝对的,主要取决于系统的需求和工程师对每个框架的了解程度。
一个框架能存活下来一定是具有自己的优点,没有最好,适合自己的就是最好的。
比如F5,性能出色价格昂贵而出名,从十几万到上百万不等,有强大的售后和技术支持,我工作多年只有工作第一年参加国家电网项目上使用过F5,当时还给了我们一台测试用的机器,后来辞职后面试别的公司,面试官问我以前的项目组是使用的什么负载均衡,我说F5,面试官感叹国家队果然财大气粗,我那个时候不了解还有什么其他解决方案,表示F5很奇怪吗?面试完回家才慢慢了解,原来有很多解决方案,阿里使用LVS,也使用Nginx,美团最初使用Nginx + LVS,以及后来独立研发的MGW。
有人会问,怎么一个负载均衡就这么多种算法,心好累,企业开发里能用这么多算法吗?真正到企业开发中,一般都只用一种,如果负责的服务器没有带状态的 Session,也不存在机器配置不相同的情况,那就可以用轮询或随机算法,工程师根据实际情况选择最合适自己的算法。
正向代理&反向代理
正向代理
生活中的正向代理,打个比方,你想去俄罗斯旅行,需要去使馆办理签证,手续麻烦,你完全不知道从何下手,这个时候你想到找旅行社,有专门的导游可你帮你代办,你只需提供资料就在家等着拿签证就可以了,你是客户端,俄罗斯使馆是服务端,导游就是代理端。
正向代理就是代理客户端,服务端不知道客户端是谁。
反向代理
互联网不够发达的时候,我们都打过10086,有事儿就找客服,全国31个省都有自己的客服中心,每个客服中心都有上百个客服小哥小姐姐,我们不关心给你分配的是谁,只需要接通10086后会自动给你分配客服给你,这就是反向代理。
反向代理就是代理服务端,客户端不知道服务端是谁。
反向代理服务器可以充当“交通警察”,如上图,位于后端服务器(baidu)前面,并以最大化速度和容量利用率的方式在一组服务器上分发客户端请求,同时确保没有一个服务器过载,可以降低性能。如果服务器出现故障,负载均衡器会将流量重定向到其它正常的服务器上。
总结
这一节主要讲了负载均衡在网站后台建设中的应用和代理的概念,负载均衡算法和正/反向代理的概念也是面试中容易碰到的基础问题,是初学者必须掌握的概念。