分布式架构的发展和演进之路

Posted 程序仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式架构的发展和演进之路相关的知识,希望对你有一定的参考价值。

1、为什么要使用分布式架构

1946年,世界上第一台电子计算机在美国的宾夕法尼亚大学诞生,它的名字是:ENICAC ,这台计算机的体重比较大,计算速度也不快,但是而代表了计算机时代的到来,再以后的互联网的发展中也有基础性的意义。

计算机的组成是有五部分完成的,分别是:输入设备,输出设备,存储器,CPU里面有运算器和控制器,有一个冯诺依曼的模型非常形象的对象计算机的组成进行了描述,不过计算机也是有数据流,指令流,控制流来进行计算的和正常运转的。如图:

ENIAC之后,电子计算机进入到了IBM主导的大型机的时代, 在1946年第一台IBM大型机SYSTEM/360诞生,这使得IBM在20世纪50~60年代统治了整个大型计算机的工业,在大型主机时代,计算机架构向两个方向发展CISC(微处理器执行的计算机语言指令集)CPU为架构的价格便宜的个人PC和RISC(精简指令集计算机)价格高的小型UNIX服务器。

大型主机的出现,凭借着计算能力和处理能力,高的稳定性和安全性,在很长的一段时间内引领到计算领域的发展。但是集中式的计算机系统来带来了一些问题,来越来越不能满足用户的需求比如说:

1)大型的主机非常贵,一般的小企业用不起。

2)大型主机比较复杂,培养人才的成本比较高。

3)单点问题,如过大型机出现故障,整个系统都挂掉,运行不了,使企业的损失非常大。

4)随着技术的进步,个人PC电脑的性能越来越高,成本也越来越低。

我们都知道一个成熟的大型网站的系统架构并非一开始就设计的非常完美,也没有一开始就具备高性能、高并发、高可用、安全性等特性,而是随着用户量的增加、业务功能的扩展逐步演变过来的,慢慢的完善的。在这个过程中,开发模式、技术架构等都会随着迭代发生非常大的变化。而针对不同业务特征的系统,各自都会有自己的侧重点。

例如

像淘宝这类的网站,要解决的重点问题就是海量商品搜索、下单、支付等问题。

像腾讯这类的公司,要解决的是数亿级别用户的实时消息传输。

像百度这类的公司,要解决的又是海量数据的搜索。

每一个种类的业务都有自己不同的系统架构。


2、分布式基本概念

在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:

2.1 高可用

系统中部分节点失效时,其他节点能够接替它继续提供服务,则可认为系统具有高可用性。

2.2 集群

一个特定领域的软件部署在多台服务器上并作为一个整体提供一类服务,这个整体称为集群。如Zookeeper中的MasterSlave分别部署在多台服务器上,共同组成一个整体提供集中配置服务。在常见的集群中,客户端往往能够连接任意一个节点获得服务,并且当集群中一个节点掉线时,其他节点往往能够自动的接替它继续提供服务,这时候说明集群具有高可用性。

2.3 负载均衡

请求发送到系统时,通过这些方式把请求均匀分发到多个节点上,使系统中每个节点能够均匀的处理请求负载,则可认为系统是负载均衡的。

2.4 分布式

系统中的多个模块在不同的服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署在不同的服务器上,或两个相同功能的Tomcat 分别部署在不同的服务器上。

2.5 正向代理和反向代理

系统内部要访问外部网络时,统一通过一个代理服务器把请求转发出去,在外部网络看来就是代理服务器发起的访问,此时代理服务器实现的是正向代理。

当外部请求进入系统时,代理服务器把该请求转发到系统中的某台服务器上,对外部请求来说,与之交互的只有代理服务器,此时代理服务器实现的是反向代理。

简单来说,正向代理是代理服务器代替系统内部来访问外部网络的过程,反向代理是外部请求访问系统时通过代理服务器转发到内部服务器的过程。


2.6 集群与分布式,SOA与微服务区别和联系

2.6.1 分布式与集群

集群:相同的人干同样的事

分布式:不同的人配合干同一件事

2.6.2 SOA与微服务

分布式架构的发展和演进之路

2.6.3 分布式和微服务

分布式:分散压力

微服务:分散能力

PS:本身没有严格的区别和关系,一般来说大型的互联网项目都是基于微服务的分布式架构


3、分布式架构演进之路

3.1 单体应用架构

最开始的应用架构,是一台服务器,开着一个web服务,一个数据库服务。这时候的应用性能受服务器性能影响,web服务跟数据库服务共享一个cpu,承受并发有限。当应用服务已经无法承受当前流量时,先将web服务与数据库拆分到不同的服务器,能有效的提高web并发和数据库的并发能力。

分布式架构的发展和演进之路

单体应用架构演变:

这个阶段的系统架构如下图所示,应用服务器和数据库服务器完全隔离开来,相互互不影响,大大减少了网站宕机的风险

分布式架构的发展和演进之路


这样的话,web服务和数据库因为单独使用一台服务器,受压能力提升。但是比如当流量进一步提升时,web服务首先承受不住压力,要么提升服务器配置(垂直扩展),要么多台服务器进行负载均衡(水平扩展)。这时候需要有个分发请求的负载均衡器。


3.2 垂直架构

这个阶段,随着访问量的继续不断增加,单台应用服务器已经无法满足我们的需求。假设我的数据库服务器还没有遇到性能问题,那我们可以通过增加应用服务器的方式来将应用服务器集群化,这样就可以将用户请求分流到各个服务器中,从而达到继续提升系统负载能力的目的。此时各个应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务。

分布式架构的发展和演进之路

系统架构发展到这个阶段,各种问题也会接踵而至:

  • 用户请求交由谁来转发到具体的应用服务器上(谁来负责负载均衡)

  • 用户如果每次访问到的服务器不一样,那么如何维护session,达到session共享的目的。

那么此时,系统架构又会变成如下方式:

分布式架构的发展和演进之路

缓存用于缓存数据,能够缓解数据库压力,这时候就需要对数据库进行水平扩展(读写分离):

分布式架构的发展和演进之路

因为关系型数据库的吞吐上限太小,随着业务量增加,访问量继续增加,我们会引入搜索引擎和缓存来提升服务性能:

分布式架构的发展和演进之路


整个系统能承受的并发高了,但是发现每个系统可扩展性不高,web服务到底还是一个单一的系统,当系统庞大起来时,难于维护。这时候就需要服务化了。


3.3 分布式架构(独立子系统)

基础服务化后,各个功能比较明细,系统的扩展性比较高,当需要服务时,添加服务,当某个服务承受不住压力时,可以新增该服务。

这样拆分以后,可能会有一些相同的代码,比如用户操作,在商品和交易都需要查询,所以会导致每个系统都会有用户查询访问相关操作。这些相同的操作一定是要抽象出来,否则就是一个坑。所以通过走服务化路线的方式来解决。


3.4 分布式架构(通信子系统,微服务)

那么服务拆分以后,各个服务之间如何进行远程通信呢? 通过 RPC 技术,比较典型的有:dubbowebservicehessianhttpRMI 等等。前期通过这些技术能够很好的解决各个服务之间通信问题,但是, 互联网的发展是持续的,所以架构的演变和优化也还在持续。


4、分布式架构带来的问题

我们基于网络构建分布式系统,将多个系统连接起来,就要面临我们使用单体架构时不会遇到的问题。

4.1 网络延迟:性能、超时

同机房的网络IO还是比较块的,但是跨机房,尤其是跨IDC(互联网数据中心),网络IO就成为不可忽视的性能瓶颈了。并且,延迟不是带宽,带宽可以随便增加,千兆网卡换成万兆,只是成本的问题,但延迟是物理限制,基本不可能降低。

这带来的问题就是系统整体性能的降低,会带来一系列的问题,比如资源的锁住,所以系统调用一般都要设置一个超时时间进行自我保护,但是过度的延迟就会带来系统的RPC调用超时,引发一个令人头疼的问题:分布式系统调用的三态结果:成功、失败、超时。不要小看这个第三态,这几乎是所有分布式系统复杂性的根源。


4.2 网络故障:丢包、乱序、抖动

这个可以通过将服务建立在可靠的传输协议上来解决,比如TCP协议。不过带来的是更多的网络交互。因此是性能和流量的一个条件交换。这个在移动互联网中更需要考虑。


4.3 一致性问题

分布式系统中的一致性指应用系统的一致性和数据的一致性。多个系统之间互相通信,就有可能遇到例如:

(1) 调用超时:系统A调用系统B超时,系统A得到超时反馈,但不确定系统B是否已经处理结束,就会造成不一致。

(2) 掉单:系统A和系统B分别为对方的上下游,如果系统A中存在一个订单,而系统B中不存在,就会导致掉单。

(3) 缓存与数据库的不一致:面对海量的访问请求,我们经常会需要在数据库前加一层缓存,这个缓存与数据库之间如何保证一致性。

我们解决一致性模型主要分三种:

  • Strong Consistency(强一致性):新的数据一旦写入,在任意副本任意时刻都能读到新值。比如:文件系统,RDBMSAzure Table都是强一致性的。

  • Week Consistency(弱一致性):不同副本上的值有新有旧,需要应用方做更多的工作获取最新值。

  • Evantual Consistency(最终一致性):一旦更新成功,各副本的数据最终将达到一致。如:订单支付

从这三种一致型的模型上来说,我们可以看到,WeakEventually一般来说是异步冗余的,而Strong一般来说是同步冗余的(多写),异步的通常意味着更好的性能,但也意味着更复杂的状态控制。同步意味着简单,但也意味着性能下降。


4.4 CAP定理

CAP定理,指的是在一个分布式系统中,Consistency(一致性)Availability(可用性)Partition tolerance(分区容错性),最多实现两点,三者不可兼得。CAP定理主要是针对分布式系统各节点之间的通信提出的定理。

一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。

可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的请求。

分区容错性(P):分布式系统中的节点之间的通信有可能失败,在这种情况下,系统要能够容纳这种错误。

分布式系统中必然存在着分区,而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容错性是我们必须需要实现的。那么根据CAP定理,C与A我们只能择其一实现。那么为什么实现P的情况下,C与A不可兼得呢,我们来分析一下:

假设节点A与节点B,它们中的数据是一致的,然后我们发起请求,修改了节点A中的数据,节点B中的数据也要相应的更改,但是出现了网络延迟等问题,节点B中的数据没有更改,依然是旧数据。这时,请求节点B中的数据,但是数据还没有同步,那怎么办呢?如果我们要满足一致性,就应阻塞这次请求,等节点B中的数据得到更改,这样可用性就无法满足;而如果我们要满足可用性,那么我们就要返回节点B中的旧的数据,这样一致性就无法满足。所以我们就需要结合实际情况,做出取舍,是满足一致性还是满足可用性。


以上是关于分布式架构的发展和演进之路的主要内容,如果未能解决你的问题,请参考以下文章

阿里巴巴代码平台架构的演进之路

淘宝高并发分布式架构演进之路

1年时间业务量疯长40倍,谈人人车的平台架构演进之路

服务端搭建高并发分布式架构演进之路

分布式架构的演进

服务端高并发分布式架构演进之路