1.1.1. 简介
首先介绍下单机、集群、分布式部署这几个概念:
单机:一个业务系统部署在一台服务器上(一个人做一件或多件事情)。
集群:同一个业务,部署在多个服务器上(多个人在一起做同样的事)。
分布式:一个业务拆分为多个子业务,部署在多个服务器上(将一件事拆分成多件小事,交给多个人做)。
1.1.2. 单机部署
什么是单机部署?
顾名思义就是一台机器部署一个业务系统,一个业务量很小的系统,所有的代码都放在一个项目中,然后这个项目部署在一台服务器上。整个项目所有的服务都由这台服务器提供,这就是单机结构。
单机结构的优缺点:
优点:单机架构的优点就是部署简单,适合测试环境或者非关键业务。
缺点:单机的处理能力是有限的,当业务增长到一定程度的时候,单机的硬件资源将无法满足业务需求。
1.1.3. 集群架构
什么是集群架构?
单机处理到达瓶颈的时候,就把单机复制几份,这样就构成了一个“集群”。集群中每台服务器就叫做这个集群的一个“节点”,所有节点构成了一个集群。每个节点都提供相同的服务,那么这样系统的处理能力就相当于提升了好几倍(有几个节点就相当于提升了多少倍)。
提供集群架构方案中最重要的角色是什么?没错,就是负载均衡服务器,例如web集群中会经常使用nginx作为负载均衡服务器。
例:nginx实现负载均衡代码
负载均衡服务器可以实现集群节点的扩展,根据节点负荷情况进行调度,也可以根据业务协议、属性来做负载分发。根据业务场景的不同,负载均衡器又可以分为3,4,7层负载。
三层负载均衡
三层负载均衡服务器对外提供一个VIP(虚IP),但集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。
四层负载均衡
四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。
七层负载均衡
七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、DNS等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
对于一般的应用来说,有了Nginx就够了。Nginx可以用于七层负载均衡。但是对于一些大的网站,一般会采用DNS轮询+四层负载+七层负载的方式进行多层次负载均衡。
负载均衡服务器的选择?
开源软件:nginx,lvs
Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP、HTTPS,、SMTP、POP3、IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存,Nginx主要用来做七层负载均衡。
LVS(Linux Virtual Server),也就是Linux虚拟服务器,是一个由章文嵩博士发起的自由软件项目。使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能,LVS主要用来做四层负载均衡。
商用:F5,A10,深信服等。
集群架构的优缺点分析:
优点:服务器的并发量提高,容错性提高(具有高可用性)。
缺点:如果访问的业务是携带session状态属性的,可能会出现问题,例如我在访问一个业务的时候会带有账户信息session属性,如果此时当集群进行切换或者没有保持,则账户可能需要重新登陆或session丢失的情况,这种情况对用户体验非常不友好。不过目前很多专业的负载均衡器已经带有session保持功能,默认情况下开启即可。
1.1.4. 分布式架构
集群结构的好处就是系统易于扩展。如果随着系统业务的发展,当前的系统又支撑不住了,那么给这个集群再增加节点就行了。但是,当业务发展到一定程度的时候,会产生一个问题—无论怎么增加节点,整个集群性能的提升效果并不明显了。
举个例子:上班路上,有一辆车,只需要一条马路就可以正常通行,有100辆车,为了增加效率开了2个车道,有1000辆车,再增加一些车道,当车子数量达到十万百万时,再增加车道可能微乎其微。这时可能需要加入地铁、高铁、飞机等方案来解决交通问题,这就是分布式架构。
分布式结构就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统。在分布式结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在 web 容器中,它们之间通过 RPC 方式通信。
假设需要开发一个在线商城。按照分布式的思想,需要按照功能模块拆分成多个独立的服务,如:用户服务、产品服务、订单服务、后台管理服务、数据分析服务等等。这一个个服务都是一个个独立的项目,可以独立运行。如果服务之间有依赖关系,那么通过 RPC 方式调用。
从单机结构到集群结构,业务代码基本不需要作任何修改,工程师要做的仅仅是多部署几台服务器,每台服务器上运行相同的代码就行了。但是,从集群结构演进到分布式结构,之前的代码就需要发生较大的改动。所以对于新系统,系统设计之初就采用分布式架构,这样后期运维的成本更低。但如果一套老系统需要升级成分布式结构的话,那就得对代码大动干戈了。所以,对于老系统而言,究竟是继续保持集群模式,还是升级成分布式架构,这需要架构师深思熟虑、权衡投入产出比。
分布式架构优点:
系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试,系统与系统之间的边界非常明确,排错也变得相当容易,开发效率大大提升。
系统之间的耦合度降低,从而系统更易于扩展,可以针对性地扩展某些服务。假设商城要搞大促,下单量可能会大大提升,因此可以针对性地提升订单系统、产品系统的节点数量,而对于后台管理系统、数据分析系统而言,节点数量维持原有水平即可。
服务的复用性更高。比如,将用户系统作为单独的服务后,该公司所有的产品都可以使用该系统作为用户系统,无需重复开发。
小结:
1)集群主要的使用场景是为了分担请求的压力,也就是在几个服务器上部署相同的应用程序,来分担客户端请求。但集群并非适用所有场景,例如当压力进一步增大的时候,例如数据库业务,mysql无法面对很多的写压力。因为在mysql做成集群之后,主要的写压力还是在master的机器上面,其他slave机器无法分担写压力。
2)分布式的主要应用场景是单机或集群已经无法满足这种性能的要求,必须要融合多个节点,并且节点之间是有交互的。相当于在写mysql的时候每个节点存储部分数据,也就是分布式存储的由来。在存储一些非结构化数据:静态文件、图片、pdf、小视频…这些也就是分布式文件系统的由来。