分布式系统架构技术分析(一)

电脑杂谈  发布时间:2019-08-10 03:03:36  来源:网络整理

分布式系统的架构_分布式计算架构_soa分布式架构

在 20 世纪 60 年代,小型主机凭借其强大的假设和 IO 处理能力还有在稳定性和安全性方面的杰出表现,在很长的一段时间里引领了计算机领域的发展。随着大型主机的发展,集中式的计算机功能构架也变成了主流。随着计算需求的同比和假设场景的多元化,集中式的处理模式越来越显得捉襟见肘,同样随着 PC 技术的成熟和普及,PC 机也步入各行各业,作为更容易获取的假设资源,但逐渐也造成了较多闲散的假设单元,网格计算的定义被逐渐提出,并随着计算机网络化和微型化的发展态势,不断演进发展。整个分布式计算的理论和实践也走向成熟,计算机功能也直到从集中式向分布式架构的变革。

在前一篇《集中式架构与分布式架构比较》中,我们早已对两种风格的构架进行了具体对比,显然分布式架构具有显著的劣势,在此不再赘述。本专题中将聚焦分析分布式架构的几个关键方面,在本文我们将谈谈分布式架构的主要组成因素及其运行制度。

分布式系统是其部件分布在连网的计算机上,模块之间通过传递消息进行通信和姿势协调的功能。一个标准的分布式系统在没有任何特殊业务观点约束的现象下,一般有以上几个特征:

分布性:一个分布式功能中的计算机在空间部署上是可以随意分布的,这种计算机应该处于不同的机柜上,不同的小城的机房中,如果是世界上任何一个角落。同时,机械的分布状况也会随时变动;

并发性:在一个计算机图片中,流程运行过程中的并发性操作是十分少见的行为,例如同一个分布式功能的多个结点,可能会并发地操作一些共享的资源,比如或分布式存储等,怎么精确并高效地协调分布式并发操作也变成了分布式功能构架与设计中最大的挑战之一;

缺乏大局指针:分布式功能中多个进程应该在空间上分布式在各处,进程之间通过交换消息来互相协作,紧密的协同通常取决于对流程动作发生的时间的共识。但在分布式功能中,各进程与指针同步所超过的准确性是有限的,即没有一个正确时间的大局定义;

故障独立性:组成分布式功能的所有计算机,都有可能发生任何形式的故障。单个组件的故障相对容易预知并设计应对逻辑,但分布式功能应该以新的方法出现故障。网络故障造成互连的计算机的隔离,但这些并不当然会停止运行,但是流程很难判断是图片故障虽然那么延迟。同样,当被图片隔离计算流程在异常中止时,其实不能马上通知与它通信的这些部件了解。系统的每位模块会单独地出现故障,而这些部件还在运行。

分布式功能还能实现高可用、高吞吐、大容量存储、海量计算、并行计算等出色能力,天然的分布性和可伸缩等特点,也打破了数学上单机的瓶颈,使其能不断支撑着业务的发展而演进,并推动了云计算、大数据、人工智能等行业的发展。但是就像每个都有两面,分布式功能的复杂性,也使其在设计、开发、运行、维护、安全性等方面都面临更多的挑战。

分布式服务

soa分布式架构_分布式计算架构_分布式系统的架构

分布式系统下结点间服务通讯有两种途径,一种是通过 RPC(Remote Procedure Call) 实现两点间通讯,可以设计成同步通讯,也可以是异步的;一种是通过消息中间件实现通信,一般是异步通讯手段。

RPC 调用

RPC 调用应该分布式环境下常用的通讯手段,有同步的模式,也是异步的模式。同步模式下,客户端发起调用并堵塞当前线程,直到服务端处理完毕回到响应才完成整个调用过程;异步模式下,客户端发起调用后马上离开,并记录目前请求,直到接收到服务端响应后才找出对应的请求进行结果的处理,并完成整个调用过程。

RPC 调用中一般只有两个角色:客户端和服务端,但在分布式环境下服务端可能有多台机械,你们共同组成一个集群,每台都提供一样的服务。这时就要有一种机制能让客户端将持续不断的请求均衡的分发到一切的服务端,一般将这些制度称为「负载均衡」。负载均衡可以在客户端实现,也可以通过专门的负载均衡装置实现。如果采用客户端负载均衡方案,需要让客户端感知所有服务端的机械地址和网关,需要引入一套「服务发现和集成的核心」,坏处是通讯是点对点的,比较高效,且不存在单点。如果使用专门负载均衡装置,则客户端只需感知负载均衡装置的地址分布式计算架构,由它来对接所有服务端,并均衡服务请求,这样模式比较简单,但存在性能单点,且延长了请求链路,稳定性也会受影响。无论是客户端还是专门设施做负载聚合,都可以按照不同的画面采用适合的负载均衡策略,常用的思路有随机(Random)、轮询(RoundRobin)、最快连接数(Fastest Connection)、最小连接数(Least Connection)等等。

消息中间件

消息中间件一般是独立部署的一组应用程序,负责消息的接收和投递。整个通讯过程是异步的,有传闻发布者、传闻中间件和传闻订阅者三个角色,传闻从发布端发出后,会被传闻中间件接收并做持久化,传闻的购物有两种常用的模式,一种是传闻中心主动投递的模式(推模式),一种是订阅者主动拉取的模式(拉模式)。在推模式下,发布者发布消息,传闻发到消息中心做持久化,然后被投递到订阅端集群,一般来说会选择在一切订阅者中随机选一台投递,在这样模式下,要求消息订阅者集群的传闻消费速度要能跟上发布消息是速率;在拉模式下,消费者根据队列里传闻数量来做均分,主动连上传闻中间件进行购物,对购物速度没有速度限制,但是一般拉模式的传闻中间件会提供更强的传闻扛积压能力。

由于消息被持久化,但是可以做到消息的可信投递,确保了分布式环境下通讯的可信达到。在分布式环境下分布式计算架构,一个系统可能会在一次事务操作中通过消息的方法去改变其他功能的状况(主要指存储的状况),为了能模拟类似事宜的一致性,异步消息可以借助 DB 的持久化来支持事务型消息。事务型消息指的是发布消息的使用功能在本地事务操作序列中发送的传闻。此类传闻的投递与事务状态维持一致,当事务状态是填写时,传闻会被投递到订阅者,当事务状态是回滚时,传闻不会被投递到订阅者,这应该分布式环境下消息中间件需要支持的独特情景。

分布式缓存

当传统面临数据访问时,硬盘 I/O 能力常常变成型号瓶颈,因而造成过高的号召延迟,而比较常见的提升性能的方式,是在使用和之间加入一层分布式缓存来提高数据访问功耗,分布式缓存将高速闪存也是数据对象的储存媒介,理想状况下可以获得内存级的读写性能,常用的缓存实现会借助 LRU 算法来缓存访问最多的数据,从而提高缓存效率。

soa分布式架构_分布式系统的架构_分布式计算架构

通过分布式缓存服务器集群,将缓存数据分布到集群多台服务器上可在一定程度上提高缓存的可用性,同样也能起到拓展缓存容量的效果,当一台缓存服务器宕机的时候,只有部份缓存数据丢失,再次从加载这部分数据不会对产生巨大影响。

分布式缓存还具备支持弹性扩展的能力,通过动态提升或增加节点,应对变化的数据访问负载,提供可分析的外观与扩展性,同样也能最大限度地增加资源利用率

分布式缓存比较典型应用画面涵盖:

使用对象缓存:缓存功能也是 ORM 框架的二级缓存对外提供服务,动机是减少的负载压力,加快使用访问;

状态缓存:缓存包含 Session 会话状态及使用横向拓展时的状况数据等,这类数据一般是难以恢复的,对可用性要求较高,多应用于高用集群;

并行处理:往往涵盖较多中间计算结果需要共享;

事件处理:分布式缓存提供了针对事件流的连续查询 (continuous query) 处理技术,满足实时性需求;

极限事务处理:分布式缓存为事务型应用提供高吞吐率、低延时的解决方案,支持高并发事务请求处理,多应用于铁路、地产服务和电等行业。

通过配置合理容量的分布式缓存,能在提高使用数据访问功耗的同时,提高整体拥有费用,所以架构设计上做到合理借助缓存,显得就越来越重要。

分布式系统的架构_soa分布式架构_分布式计算架构

分布式文件系统

分布式文件系统,是指允许文件通过图片在多台计算机中分散存储的共享文档功能,它通过图片将分布在不同区域的多台计算机相连在一起从而组合成体积更大,处理能力更强的分布式文件储存功能。分布式文件功能良好的解决单台计算机储存和处理能力存在上限的难题,具有大的存储容量和处理能力的扩展能力。

在分布式文件系统中,客户端并非直接访问底层存储,只是通过图片以特殊的通信协议和服务器沟通,从而完成文档储存操作,借由通信协议的设计,可以让客户端和服务器端都能按照访问控制清单或是授权,来限制对于文档功能的访问。由于分布式文件系统的图片接入特性,导致不同用户都能通过图片接入分布式文件系统,实现文档数据的共享,从用户视角看,分布式文件系统与单机文件功能看到的字段是一样的,应用方法也相近。

分布式文件系统除了能提供比单机文件功能更大的存储容量和处理能力外,通过数据复制与容错,也拥有了本地文件功能所无法具有的数据备份、数据安全等特点,也就是说,但是功能中有一小部份的结点脱机,总体来说系统一直可以持续运作而不会有数据损失。

分布式

随着数据量的高速增长,分布式技术也得到了迅速的发展,传统的关系型开始从集中式模型向分布式架构发展。分布式是指借助高速计算机图片将数学上分散的多个数据储存单元连接起来组成一个逻辑上统一的。分布式的完全精神是将竟然集中式中的数据分散存储到多个通过图片连通的数据储存节点上,以获取更大的储存容量和更高的并发访问量。

分布式可以按需提高、提高处理节点,良好地解决了单台的储存和处理能力上限问题;除此之外,分布式往往具有较强的容错能力,通过数据复制、副本冗余,当某个处理节点出现故障时,希望自动恢复,对使用者没有感知。最后,分布式底层采用昂贵服务器,相比传统单机使用的高端服务器和高端存储,利润大幅度降低。

在分布式中,客户端并非直接访问底层的储存功能,而是使用结构化查询语言(SQL语言)访问节点,再由节点的 SQL 引擎翻译成针对底层存储功能的操作。一套分布式往往会服务多个业务,分布式内部支持多个业务之间的隔离,当某个业务出现异常时,只会影响该业务,不会对其他业务产生影响。蚂蚁的 OceanBase 是一个典型的分布式。使用分布式,将大大降低单库故障的发生概率,并精简单库故障的恢复机制。再结合分布式数据中间件在业务维度数据分片和路由、数据源动态调整、使用平方可用容灾、异构数据源适配等能力,将能较好的实现分布式环境下 DB 的高性能访问和高可用。

分布式数据中间件

分布式计算架构_分布式系统的架构_soa分布式架构

关系型是经典的持久化解决方案,但在海量业务场景下也会碰到单表的体积瓶颈和单库的外观瓶颈。按照分布式的精神,数据也要拆分,让集中在单点的读写访问分布到多个 DB 服务器上,因而获得容量和外观上的韧性延伸能力。根据业务场景可分为垂直切分(按业务)、水准拆分(按请求/用户做哈希,如果做区间拆分)、读写拆分等。

根据垂直拆分后的数据会导致原本单库事务变成跨库事务,很难通过传统的制度来确保 ACID,需要引入一种应用层的,基于服务的事宜协调制度。这个下文会有专门阐述。按照水平拆分的数据,需要根据这些业务维度将数据拆分到不同的库表,因而解决数据水平扩张的难题,也提高了总体的 QPS,使数据层具有 TB+/天 的喷吐能力。数据拆分后,每次数据访问需要根据分库分表的规则进行路由,实质上是通过规则对原始 SQL 进行重写,拆分成多条 SQL,并分发给链接多个库的数据源去执行,并汇总结果。由于整个过程都在应用层进行,为屏蔽复杂性,需要将此类观点封装一层中间件类库中,并通过标准 JDBC 接口对外暴露接口,让业务透明的完成整个的访问过程。

通过一层统一的分布式数据中间件,让业务通过标准 SQL 和标准 JDBC 接口就会访问一组理论容量「无限大」的关系型集群,所以具备良好的外观。同时,通过这层中间件,也能实现一切参数的动态调整、路由规则动态调整、分片权重的调整,因而在使用层实现访问的高可用,且不依赖于高可用机制,甚至提供更灵活强大的故障容忍能力。此外,标准 SQL 和 JDBC 屏蔽了上层的实现,使使用具有透明对接异构数据源的能力,实现繁杂场景的业务访问和一些双写双读的需求。

传统关系型的事宜模型必须遵循 ACID 原则。在单模式下,ACID 模型能有效保障数据的完整性,所以在分布式环境下,单库无法承载高并发和海量数据,但是数据会被通过垂直拆分或水平拆分到不同的 DB 中,一个业务通常会跨过多个。在 JavaEE 规范中使用 2PC (2 Phase Commit, 两阶段提交) 来处理跨 DB 环境下的事宜问题,所以 2PC 是反可伸缩模式,也就是说,在事务处理过程中,参与者需要始终持有资源直到整个分布式事务结束。这样,当业务体量超过千万级以上时,2PC 的局限性就越来越明显,功能可伸缩性会显得很差。基于 BASE 的精神可以仿造 2PC 的方法,在使用层来实现分布式环境下多个事务协调一致。 在充分保障分布式环境下高可用性、高可靠性的同时兼具数据一致性的要求,其最大的优点是确保数据最后一致 (Eventually consistent)。

在分布式事务中,可以简单分成事务发起方和事务参与者两个角色。发起方负责启动分布式事务,触发创建主事务记录。发起方是分布式事务的整体协调者,负责读取参与者的服务,记录相应的事宜日志,并感知整个分布式事务状态来决定整个事宜是 COMMIT 还是 ROLLBACK。参与者是分布式事务中的一个原子单位,所有参与者都必须定义 prepare、commit、rollback 3个基本接口,并确保其业务数据的幂等性,也必须确保 prepare 中的数据操作还能被递交 (COMMIT) 或者回滚 (ROLLBACK)。

整个协调过程从发起方开启一个本地事务开始,过程中参与者会显式调用参与方的业务方式,这种显式调用的方式即为一阶段的 prepare 方法,一般参与方会在该方式内锁定资源。这些方式读取可以采用第一小节提到的「传闻中间件」,也可以采用「RPC 通讯」。一旦这次本地事务成功,则本地事务提交,发动方会调用第二阶段的真正 commit 方法,来让所有参与方的事宜完成第二阶段的提交。本地事务提交失败或者在这之前某个观点中失败(应该是本地逻辑异常,也应该参与方一阶段失败),则本地事务失败,发动方会负责完成一阶段的一切回滚操作,防止出现不一致现象。

在分布式环境下,单点故障是个常态,但是无论是发起方还是参与方都可能在任何一刻不需用,此时需要一个第三方的恢复功能来感知一切的事宜状态,并通过定期轮询来发现异常状况的事宜记录,并将其恢复至最后一致。分布式事务的具体介绍可以参考《分布式事务综述》

在下一篇《分布式功能构架技术分析(二)》中,将从分布式功能构架的体积规划和容灾管控两个方面进行分析,帮助读者更好的认知分布式功能构架。

缓存分布式存储消息中间件


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-118686-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...