世界上最快乐的事,莫过于为理想而奋斗。
——苏格拉底
05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确实了解了。
接下来又开始问我网络相关的知识,但不是直接问HTTP三次握手,TCP,UPD这些,因为这些基础已经在一面问完了,这一面只围绕分布式系统相关的网络概念,从最基本的代理开始。
问题分析: 即使作为业务开发人员也会经常遇到需要配置Nginx或其他负载均衡的问题,比如你做了一个文件上传服务,上线后发现文件被拦截了,看看报错信息一看是被Nginx 代理拦截了,Nginx限制了文件大小,这个时候代理的概念是啥怎么看明白这个问题呢?
我:
正向代理: 代理用户端请求服务端,相对于服务器用户端是匿名的,比如单位内网使用了正向代理软件,所有员工都访问百度,但是百度看到的只有一个IP地址,百度也不知道到底是哪个员工访问的。
反向代理: 代理服务端提供服务,相对于用户服务端是匿名的,同样是访问www.baidu.com,所有用户输入的都是一个网站或者一个IP,但是百度背后有成千上万的服务器,你也不知道你访问的是哪一个。
问题分析: 面试官点点头,对我理解的代理表示认可,随后问我使用代理有什么用,考察代理技术的原理。
我:
比如用 Nginx 做代理,这样就可以开buffer,Nginx 可以把 Request 请求和 Response 在读取完整之前 buffer 住,好比饭店服务员,所有顾客要什么菜和一个服务员说一下就行了,不会直接找厨师,一个服务员接待10个顾客,最后把点的20道菜分发给5个厨子做就行了,厨子好比服务器,这样厨子就可以专心做菜了,接待这种事就有Nginx代理做,同时,还可以根据顾客数量多增加或者减少厨师数量,把任务均匀分给每个厨师,这就是负载均衡的作用,Nginx 就可以有效分发流量。
总的来说:
问题分析: 聊到了负载面试官要继续深挖算法了。
我:
负载均衡几乎是各大互联网公司搭建系统必用的技术了,也会有初学者学习分布式系统时会问我,什么是负载均衡,为什么要使用负载均衡,多加一层负载均衡会让服务调用变慢吗?带着这些问题学习一下这一章。
不知道你有没有发现,如果服务端是单台服务器,直接通过网络就可以链接。为什么说负载均衡几乎是各大互联网公司搭建系统必用的技术,除了个人网站,比如我的博客还是单体服务器以外,相信没有哪家互联网公司的服务敢这样,一台机器如果宕机怎么办?让用户等一会儿吗?那估计这家公司离倒闭就不远了。
可以看出,多台服务器的情况,增加了一层负载均衡。
负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群、网络连接、CPU、磁碟驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个伺服器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。
——— 维基百科
简单地理解负载均衡的作用就是流量分发,将大量用户请求分发到不同服务器上分担压力,如果有机器宕机,负载均衡服务器会负责把故障机器自动摘除。
上述都是常见负载均衡,在企业里具体使用哪种框架并不是绝对的,主要取决于系统的需求和工程师对每个框架的了解程度。
一个框架能存活下来一定是具有自己的优点,没有最好,适合自己的就是最好的。
比如F5,性能出色价格昂贵而出名,从十几万到上百万不等,有强大的售后和技术支持,我工作多年只有工作第一年参加国家电网项目上使用过F5,当时还给了我们一台测试用的机器,后来辞职后面试别的公司,面试官问我以前的项目组是使用的什么负载均衡,我说F5,面试官感叹国家队果然财大气粗,我那个时候不了解还有什么其他解决方案,表示F5很奇怪吗?面试完回家才慢慢了解,原来有很多解决方案,阿里使用LVS,也使用Nginx,美团最初使用Nginx + LVS,以及后来独立研发的MGW。
有人会问,怎么一个负载均衡就这么多种算法,心好累,企业开发里能用这么多算法吗?真正到企业开发中,一般都只用一种,比如我负责的服务器没有带状态的 Session,也不存在机器配置不相同的情况,那就可以用轮询或随机算法,工程师根据实际情况选择最合适自己的算法。
正向代理
生活中的正向代理,打个比方,你想去美国旅行,需要去使馆办理签证,手续麻烦,你完全不知道从何下手,这个时候你想到找旅行社,有专门的导游可你帮你代办,你只需提供资料就在家等着拿签证就可以了,你是客户端,美国使馆是服务端,导游就是代理端。服务器架构中正向代理也很容易理解,如果想使用Google,需要用的一些“科学上网”的工具,这就是一个典型的正向代理。
正向代理就是代理客户端,服务端不知道客户端是谁。
反向代理
互联网不够发达的时候,我们都打过10086,有事儿就找客服,全国31个省都有自己的客服中心,每个客服中心都有上百个客服小哥小姐姐,我们不关心给你分配的是谁,只需要接通10086后会自动给你分配客服给你,这就是反向代理。
反向代理服务器可以充当“交通警察”,如上图,位于后端服务器(baidu)前面,并以最大化速度和容量利用率的方式在一组服务器上分发客户端请求,同时确保没有一个服务器过载,可以降低性能。如果服务器出现故障,负载均衡器会将流量重定向到其它正常的服务器上。
这一节主要讲了负载均衡在网站后台建设中的应用和代理的概念,负载均衡算法和正/反向代理的概念也是面试中容易碰到的基础问题,是初学者必须掌握的概念。