当前位置: 首页 > 科技观察

详解:如何设计高可用的分布式架构?

时间:2023-03-18 18:36:37 科技观察

本文作者将与大家分享当前主流的分布式架构,分布式架构中常用的理论,以及如何设计高可用的分布式架构。在分布式架构中,SOA和微服务架构是最常见的两种分布式架构,服务网格的概念也越来越流行。让我们从这些常见的架构开始。SOA架构分析SOA的全称是:ServiceOrientedArchitecture,中文解释为“面向服务的架构”。它是一种由多个服务组成的设计理念,这些服务相互依赖以提供一套完整的功能。每个服务通常以独立的形式部署和运行,通过网络调用服务。架构图如下:和SOA比肩的还有ESB(EnterpriseServiceBus)。简单的说,ESB就是一个管道,用来连接各个服务节点。ESB的存在就是基于不同的协议来集成不同的服务。ESB完成了消息转换、解释和路由的工作,使不同的服务可以互联互通。随着我们的业务变得越来越复杂,我们会发现越来越多的服务。在SOA架构下,他们的调用关系会变成如下:很明显,这不是我们想要的,那么这个时候如果引入ESB的概念,项目调用就很清晰了,如下:SOA的核心问题想要解决的是:系统之间的集成:从系统的角度来说,首先要解决各个系统之间的通信问题。目的是将原来分散的、无计划的网络结构组织成规则的、易于管理的星型结构。这一步的实现往往需要引入一些概念和规范。比如ESB、技术规范、服务管理规范;这一步要解决的核心问题是【有序】。系统服务化:从功能的角度,我们需要将业务逻辑抽象为可重用、可组装的服务,通过服务编排实现业务的快速再生。目的是将原有固有的业务功能抽象为通用的业务服务,实现业务逻辑的快速复用;这一步要解决的核心问题是【复用】。业务服务化:站在企业的角度,要想将企业功能抽象成可重用、可组装的服务,就必须将原有的功能性企业架构转变为面向服务的企业架构,从而进一步提升企业的对外能力服务。“前两步是从技术层面解决系统调用和系统功能复用的问题。”而这一步就是将一个业务单元封装成一个带有业务驱动的服务。要解决的核心问题是【高效率】。微服务(Microservices)架构分析微服务架构与SOA架构非常相似。微服务是SOA的升华,但微服务架构强调“业务需要完全组件化和服务化”,将原来单一的业务系统拆解为多个可独立开发、设计、部署和部署的小应用跑步。这些小应用通过服务完成交互和集成。一个部件代表一个可以独立更换和升级的单元,就像PC中的CPU、内存、显卡、硬盘一样。它是独立的,可以在不影响其他单元的情况下进行更换和升级。如果我们把PC中的每一个组件都构建成一个服务,那么这台PC只需要维护主板(可以理解为ESB)和一些必要的外部设备。CPU、内存、硬盘等都以组件的形式提供服务。例如PC需要调用CPU进行计算处理,只需要知道CPU组件的地址即可。微服务的特点:通过服务实现组件化根据业务能力划分服务和开发团队去中心化的基础设施自动化(DevOps,自动化部署)SOA和微服务架构的区别微服务不再强调传统SOA架构较重的方面ESB是企业服务总线,并且同时以SOA的思想进入单体业务系统,实现真正的组件化。Docker容器技术的出现为微服务提供了非常便利的条件,比如更小的部署单元,每个服务可以通过SpringBoot或Node.js等技术独立运行。还有一点大家应该可以分析一下。SOA侧重于系统集成,而微服务侧重于完全分离。ServiceMesh架构分析2017年底,非侵入式ServiceMesh技术逐渐成熟。ServiceMesh,中文意思是“服务网格”,作为服务间通信的基础设施层存在于系统中。如果要用一句话来解释什么是ServiceMesh,我们可以把它比作应用程序或微服务之间的TCP/IP,负责服务之间的网络调用、熔断、限流和监控。我们都知道,程序员在编写应用程序(比如提供HTTP协议的Restful应用程序)时,一般不需要关心TCP/IP层。同样,如果我们使用ServiceMesh,我们不需要关心那些原本由应用程序或其他框架实现的服务之间的事情(熔断、限流、监控等),现在我们只需要交给它转到服务网格。ServiceMesh架构图如下:目前流行的ServiceMesh开源软件包括:Linkerd、Envoy和Istio。近日,Buoyant(Linkerd开源公司)发布了基于Kubernetes的ServiceMesh开源项目Conduit。关于微服务和服务网格的区别,我是这样理解的:微服务更注重服务之间的生态,注重服务治理等,而服务网格更注重服务之间的通信,更好地与DevOps结合等特点。ServiceMesh:应用间通信的中间层轻量级网络代理应用无感知解耦应用重试/超时、监控、跟踪和服务发现分布式架构的基础理论是CAP、BASE理论在此之前,我们需要了解问题分布式一致性。对于不同的业务服务,我们对数据一致性的要求是不同的。比如要求数据严格一致性的12306,不能卖票给用户发现没有座位。另一个例子是银行转账。当我们通过银行转账时,通常会收到提示:转账申请将在24小时内到达。其实这个场景满足的是最后转钱成功,同时如果钱没发出来,又要保证资金不会丢失。因此,用户在使用不同的服务时,对数据一致性的要求是不同的。分布式系统要解决的一个很重要的问题就是数据复制。在我们日常的开发经验中,相信大部分开发者都遇到过这样一个问题:在数据库读写分离的场景下,假设客户端A将系统中的一个值V从V1修改为V2。但是客户端B并不能马上读取到V的***值,需要过一段时间再读取。这是完全正常的,因为数据库复制之间存在延迟。所谓分布式一致性问题,是指在分布式环境中引入数据复制机制后,不同数据节点之间可能出现的数据不一致,无法通过计算机应用自身解决的问题。简单来说,数据一致性就是在更改一个副本的数据时,必须保证其他副本也可以更新,否则不同副本之间的数据会不一致。那么如何解决这个问题呢?按照正常的思路,我们可能会认为既然问题是网络延迟引起的,那么我们就阻塞同步动作,用户2必须等待数据同步完成才能进行查询。但是这种方案会极大地影响性能。如果同步的数据量很大或者很频繁,阻塞操作可能会导致整个新系统无法使用。因此,我们没有办法找到既能满足数据一致性又不影响系统性能的解决方案,于是诞生了一种一致性级别:强一致性:这种级别的一致性对大多数用户来说是直观的,它需要写什么系统也必须阅读。用户体验是好的,但是实现往往对系统的性能有很大的影响。弱一致性:该级别的一致性在写入成功后对系统进行约束。它不保证写入的值能立即被读取,也不保证数据在多长时间内保持一致,但会尽可能保证一定的时间级别。(如二级),数据可以达到一致状态。最终一致性:最终一致性实际上是弱一致性的一种特例。系统会保证数据在一定时间内是一致的。之所以在这里提出最终一致性,是因为它是弱一致性中备受推崇的一致性模型,也是目前业界广泛用于大规模分布式系统中数据一致性的一致性模型。CAP理论CAP理论是经典的分布式系统理论。它告诉我们分布式系统不可能满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partitiontolerance)三个基本要求,最多只能满足其中两个同时。CAP理论在互联网界享有盛誉,又称“帽子理论”,是EricBrewer教授在2000年举办的ACM研讨会上提出的著名猜想。Consistency,Availability,andPartition-tolerancecannotsatisfied在分布式系统中同时存在,最多满足两个:一致性:所有节点上的数据始终保持同步。可用性:无论响应成功还是失败,每个请求都能收到响应。分区容错:系统应该继续提供服务,即使系统内部(节点分区)有消息丢失。比如交换机出现故障,网站网络被分成几个子网,形成脑裂,服务器出现网络延迟或崩溃,导致部分服务器与集群内其他机器失去联系。分区是导致分布式系统可靠性问题的固有特征。从本质上讲,CAP理论的准确描述不应该是三个特征中的二选一,只能被迫适应,根本没有选择。CAP不是普遍适用的原则和指导思想。只适用于原子读写的NoSQL场景,不适用于数据库系统。BASE理论从前面的分析我们知道,CAP理论不适用于分布式前提下的数据库事务(数据库分片或分存的多实例)。由于更新了一些错误的数据而导致的失败,无论采用何种高可用方案,都是徒劳的,因为数据存在不可纠正的错误。另外,XA事务虽然保证了数据库在分布式系统中的ACID(原子性、一致性、隔离性、持久性)特性,但也带来了一定的性能成本,对并发和响应时间的要求比较高。对于电商平台来说,很难接受。eBay采用了完全不同的方法,放宽了数据库事务的ACID要求,并提出了一套名为BASE的新指南。BASE的全称是BasiclyAvailable(基本可用)、Softstate(软状态)、Eventuallyconsistent(最终一致性)三个词组的缩写。与CAP相比,大大降低了我们的系统要求。BasicallyAvailable(基本可用)是指当分布式系统发生不可预知的故障时,允许瞬时部分可用:比如我们在淘宝上搜索商品,正常情况下查询结果在0.5s内返回,但是由于后端系统故障查询响应时间变为2s。又比如数据库采用了分片的方式,100万用户数据分为5个数据库实例。如果一个实例被销毁,可用性仍然是80%,即80%的用户可以登录,系统仍然可用。电商推广期间,为应对访问量激增,部分用户可能会被引导至降级页面,服务层可能仅提供降级服务。这就是失去部分可用性的体现。Soft-state(软状态)是指系统中的数据存在一个中间状态,这个中间状态的存在不会影响系统整体的可用性,即意味着系统允许数据副本之间进行数据同步的不同节点。小时。比如一个订单的状态,如果有待支付、支付中、支付成功、支付失败,那么支付就是一个中间状态。支付成功后,支付表中的状态同步到订单状态之前,中间会有一个中间状态。随着时间的推移不一致。最终一致性(datafinalconsistency)是指所有的数据副本经过一段时间的同步后最终可以达到一致的状态,所以最终一致性的本质就是保证数据最终一致,不需要实时保证系统数据一致性强。BASE理论的核心思想是:即使不能实现强一致性,各个应用也可以根据自己的业务特点采用合适的方法使系统达到最终一致性。分布式架构下的高可用设计避免单点故障:负载均衡技术(failover/选址/硬件负载/软件负载/分散软件负载(gossip(redis-cluster)))双机热备(LinuxHA)多机高可用机房(同城容灾、异地容灾)应用:故障监控(系统监控(CPU、内存)/链路监控/日志监控)自动预警应用的容错设计,(服务降级、限流)自我保护capabilities数据量(数据分片,读写分离)分布式架构下的可扩展设计:垂直扩展提升硬件能力,水平扩展增加静态内容访问的服务器加速。CDNCDN全称ContentDeliveryNetwork,中文定义为内容分发网络。CDN的作用是将用户需要的内容分发到离用户最近的地方进行响应,使用户能够快速获取到自己需要的内容。CDN本质上是一种网络缓存技术,可以把一些相对稳定的资源放到更靠近终端用户的地方。一方面可以节省整个广域网的带宽消耗,另一方面也可以提高用户的访问速度,提高用户访问。经验。在实际系统中,我们通常会将静态文件(图片、脚本、静态页面等)放在CDN中:当用户访问网站页面上的内容URL时,会被本地DNS系统解析,而DNS系统最终会将域名的解析权交给CDN。CNAME指向的CDN的专用DNS服务器。CDN的DNS服务器将CDN的全局负载均衡器IP地址返回给用户。用户向CDN的全局负载均衡设备发起内容URL访问请求。CDN全局负载均衡设备根据用户的IP地址和用户请求的内容URL选择用户所属区域的区域负载均衡设备,告知用户向该设备发起请求。区域负载均衡器会选择合适的缓存服务器为用户提供服务。选择的依据包括:根据用户的IP地址判断距离用户最近的服务器。根据用户请求的URL中携带的内容名称,判断哪个服务器有用户需要的内容;查询当前各服务器的负载情况,判断哪台服务器具备服务能力。区域负载均衡设备根据以上条件综合分析后,将缓存服务器的IP地址返回给全局负载均衡设备。全局负载均衡设备将服务器的IP地址返回给用户。用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户需要的内容返回给用户终端。如果这台缓存服务器上没有用户想要的内容,但是区域平衡器还是分配给了用户,那么这台服务器就会向它的上级缓存服务器请求该内容,直到可以追溯到该内容包含内容。原始服务器并在本地拉取内容。什么时候使用CDN?最适合的是那些不经常变化的,比如图片,JS文件,CSS文件。图像文件包括程序模板中的CSS文件中使用的背景图像、作为网站内容一部分的图像等。即使我们的应用在灰度发布时经过了测试部门的测试,仍然很难完全覆盖用户的使用场景。为了保证万无一失,我们在发布的时候一般采用灰度发布,即分批发布新的应用,逐步增加新应用在整个集群中的比例,直到部署完成。灰度发布意味着新应用完全不了解用户体验。灰度发布系统的作用是可以根据自身的配置,将用户的流量引导至新上线的系统,快速验证新功能。而且一旦出现问题,可以立即回滚发布。简单的说就是一套A/BTest体系:总结完这篇文章,我们分析了主流的SOA架构,微服务架构,服务网格架构。然后了解了分布式架构中的几个基本理论,然后分析了如何设计一个高可用的分布式架构。