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

  • 时间:2018-07-10 23:22 作者:中盈互联 来源:中盈互联 阅读:730
  • 扫一扫,手机访问
摘要:“本文作者将与大家分享目前主流的分布式架构、分布式架构中常见理论以及如何才可以设计出高可使用的分布式架构。在分布式架构中,SOA 和微服务架构是最常见的两种分布式架构,而且目前服务网格的概念也越来越火了,我们就先从这些常见的架构开始。SOA 架构解析SOA 全称是:Service Oriented

本文作者将与大家分享目前主流的分布式架构、分布式架构中常见理论以及如何才可以设计出高可使用的分布式架构。

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

在分布式架构中,SOA 和微服务架构是最常见的两种分布式架构,而且目前服务网格的概念也越来越火了,我们就先从这些常见的架构开始。

SOA 架构解析

SOA 全称是:Service Oriented Architecture,中文释义为 “面向服务的架构”。

它是一种设计理念,其中包含多个服务,服务之间通过相互依赖最终提供一系列完整的功可以。

各个服务通常以独立的形式部署运行,服务之间通过网络进行调使用,架构图如下:

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

跟 SOA 相提并论的还有一个 ESB(企业服务总线),简单来说 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 容器技术的出现,为微服务提供了非常便利的条件,比方更小的部署单元,每个服务能通过相似 Spring Boot 或者者 Node 等技术独立运行。

还有一个点大家应该能分析出来,SOA 注重的是系统集成,而微服务关注的是完全分离。

服务网格(Service Mesh)架构解析

2017 年年底,非侵入式的 Service Mesh 技术慢慢走向了成熟。Service Mesh ,中文释义“服务网格”,作为服务间通信的基础设备层在系统中存在。

假如要使用一句话来解释什么叫 Service Mesh,我们能将它比作是应使用程序或者者说微服务间的 TCP/IP,负责服务间的网络调使用、熔断、限流和监控。

我们都知道在编写应使用程序时程序猿一般都毋庸关心 TCP/IP 这一层(比方提供 HTTP 协议的 Restful 应使用)。

同样假如用服务网格我们也就不需要关心服务间的那些原来是由应使用程序或者者其余框架实现的事情(熔断、限流、监控等),现在只需交给 Service Mesh 即可以了。

服务网格架构图如下:

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

目前流行的 Service Mesh 开源软件有:Linkerd、Envoy 和 Istio。而最近 Buoyant(开源 Linkerd 的公司)又发布了基于 Kubernetes 的 Service Mesh 开源项目 Conduit。

关于微服务和服务网格的区别,我这样了解:微服务更注重服务之间的生态,专注于服务治理等方面,而服务网格更专注于服务之间的通信,以及和 DevOps 更好的结合等。

服务网格的特征:

  • 应使用程序间通讯的中间层
  • 轻量级网络代理商
  • 应使用程序无感知
  • 解耦应使用程序的重试/超时、监控、追踪和服务发现

分布式架构的基本理论

在说 CAP、BASE 理论之前,我们先要理解下分布式一致性的问题。对于不同业务的服务,我们对数据一致性的要求是不一样的。

例如 12306,它要求数据的严格一致性,不可以把票卖给使用户以后却发现没有座位了。

再比方银行转账, 我们通过银行转账的时候,一般都会收到一个提醒:转账申请将会在 24 小时内到账。

实际上这个场景满足的是最终钱只需转账成功了就可,同时假如钱没汇出去还要保证资金不丢失。

所以说,使用户在用不同的服务的时候对数据一致性的要求是不一样的。

关于分布式一致性问题

分布式系统中要处理的一个非常重要的问题就是数据的复制。

在我们的日常开发经验中,相信大多数开发人员都遇过这样的问题:在做数据库读写分离的场景中,假设用户端 A 将系统中的一个值 V 由 V1 变更为 V2。

但用户端 B 无法立即读取到 V 的最新值,而需要在一段时间之后才可以读取到。这再正常不过了,由于数据库复制之间是存在延时的。

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

所谓分布式一致性的问题,就是指在分布式环境中引入数据复制机制后,不同数据节点之间可可以会出现的、且无法依靠计算机应使用程序自身处理的数据不一致的情况。

简单来说, 数据一致性就是指在对一个副本数据进行变更的时候,必需确保也可以够升级其余的副本,否则不同副本之间的数据将出现不一致。

那么如何去处理这个问题呢?按照正常的思路,我们可可以会想到既然是网络推迟导致的问题,那么我们就把同步动作进行阻塞,使用户 2 在查询的时候必需要等数据同步完成以后再来做。

但这个方案会非常影响性可以。假如同步的数据比较多或者比较频繁,那么阻塞操作可可以会导致整个新系统不可使用。

故我们没有办法找到一种既可以够满足数据一致性、 又不影响系统性可以的方案,所以就诞生了一个一致性的级别:

  • 强一致性:这种一致性级别是最符合使用户直觉的,它要求系统写入的是什么,读出来的也要是什么,使用户体验好,但实现起来往往对系统的性可以影响较大。
  • 弱一致性:这种一致性级别束缚了系统在写入成功后, 不保证立就可以读到写入的值,也不保证多久之后数据可以够达到一致,但会尽可可以地保证到某个时间级别(如秒级别)后,数据可以够达到一致状态。
  • 最终一致性:最终一致性其实是弱一致性的一个特例,系统会保证在肯定时间内,可以够达到数据一致的状态。
  • 这里之所以将最终一致性单独提出来,是由于它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上使用的比较多的一致性模型。

CAP 理论

CAP 理论是一个经典的分布式系统理论。它告诉我们:一个分布式系统不可可以同时满足一致性(C:Consistency)、可使用性(A:Availability)及分区容错性(P:Partition tolerance) 这三个基本要求,最多只可以同时满足其中两项。

CAP 理论在互联网界有着广泛的知名度,也被称为“帽子理论”,它是由 Eric Brewer 教授在 2000 年举行的 ACM 研讨会提出的一个著名猜想。

一致性(Consistency)、可使用性(Availability)、分区容错 (Partition-tolerance)三者无法在分布式系统中被同时满足,并且最多只可以满足两个:

  • 一致性:所有节点上的数据时刻保持同步。
  • 可使用性:每个请求都可以接收一个响应,无论响应成功或者失败。
  • 分区容错:系统应该持续提供服务,即便系统内部(某个节点分区)有消息丢失。
  • 比方交换机失败、网址网络被分成几个子网,形成脑裂、服务器发生网络推迟或者死机,导致某些 server 与集群中的其余机器失去联络。

分区是导致分布式系统可靠性问题的固有特性,从本质上来看,CAP 理论的精确形容不应该是从 3 个特性中选取两个,所以我们只可以被迫适应,根本没有选择权。

CAP 并不是一个普适性原理和指导思想,它仅适使用于原子读写的 NoSQL 场景中,并不适使用于数据库系统。

BASE 理论

从前面的分析中我们知道:在分布式(数据库分片或者分库存在的多个实例上)前提下,CAP 理论并不适合数据库事务。

由于升级少量错误的数据而导致的失败,无论用什么高可使用方案都是徒劳的,由于数据发生了无法修正的错误。

此外 XA 事务尽管保证了数据库在分布式系统下的 ACID (原子性、一致性、隔离性、持久性)特性,但同时也带来了少量性可以方面的代价,对于并发和响应时间要求都比较高的电商平台来说,是很难接受的。

eBay 尝试了另外一条完全不同的路,放宽了数据库事务的 ACID 要求,提出了一套名为 BASE 的新原则。

BASE 全称为 Basically Available(基本可使用),Soft state(软状态),和 Eventually consistent(最终一致性)三个短语的缩写。相对于 CAP 来说,它大大降低了我们对系统的要求。

Basically Available(基本可使用)

表示在分布式系统出现不可预知的故障时,允许瞬时部分可使用性:

  • 比方我们在淘宝上搜索商品,正常情况下是在 0.5s 内返回查询结果,但是因为后台的系统故障导致查询响应时间变成了 2s。
  • 再比方数据库采使用分片模式,100W 个使用户数据分在 5 个数据库实例上,假如破坏了一个实例,那么可使用性还有 80%,也就是 80% 的使用户都能登录,系统依然可使用。
  • 电商大促时,为了应对访问量激增,部分使用户可可以会被引导到降级页面,服务层也可可以只提供降级服务。这就是损失部分可使用性的表现。

Soft-state(软状态)

表示系统中的数据存在中间状态,并且这个中间状态的存在不会影响系统的整体可使用性,也就是表示系统允许在不同节点的数据副本之间进行数据同步过程中存在延时。

比方订单状态,有一个待支付、支付中、支付成功、支付失败,那么支付中就是一个中间状态,这个中间状态在支付成功以后,在支付表中的状态同步给订单状态之前,中间会存在一个时间内的不一致。

Eventually consistent(数据的最终一致性)

表示的是所有数据副本在一段时间的同步后最终都可以达到一个一致的状态,因而最终一致性的本质是要保证数据最终达到一致,而不需要实时保证系统数据的强一致。

BASE 理论的核心思想是:即便无法做到强一致性,但每个应使用都能根据自身业务特点,采使用适当的方式来使系统达到最终一致性。

分布式架构下的高可使用设计

避免单点故障:

  • 负载均衡技术(failover/选址/硬件负载/ 软件负载/去中心化的软件负载(gossip(redis- cluster)))
  • 热备(Linux HA)
  • 多机房(同城灾备、异地灾备)

应使用的高可使用性:

  • 故障监控(系统监控(CPU、内存)/链路监控/日志监控) 自动预警
  • 应使用的容错设计、(服务降级、限流)自我保护可以力
  • 数据量(数据分片、读写分离)

分布式架构下的可伸缩设计:

  • 垂直伸缩
  • 提升硬件可以力
  • 水平伸缩
  • 添加服务器

加速静态内容访问速度的 CDN

CDN 全称是 Content Delivery Network,中文释义是内容分发网络。

CDN 的作使用是把使用户需要的内容分发到离使用户最近的地方进行响应,这样使用户可以够快速获取所需要的内容。

CDN 本质上就是一种网络缓存技术,可以够把少量相对稳固的资源放到距离最终使用户较近的地方,一方面能节省整个广域网的带宽耗费,另外一方面也能提升使用户的访问速度、改善使用户体验。

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

现实系统中我们一般会把静态的文件(图片、脚本、静态页面等)放到 CDN 中:

  • 当使用户访问网站页面上的内容 URL,经过本地 DNS 系统解析,DNS 系统最终会将域名的解析权交给 CNAME 指向的 CDN 专使用 DNS 服务器。
  • CDN 的 DNS 服务器将 CDN 的全局负载均衡设施 IP 地址返回使用户。
  • 使用户向 CDN 的全局负载均衡设施发起内容 URL 访问请求。
  • CDN 全局负载均衡设施根据使用户 IP 地址,以及使用户请求的内容 URL, 选择一台使用户所属区域的区域负载均衡设施,告诉使用户向这台设施发起请求。
  • 区域负载均衡设施会为使用户选择一台合适的缓存服务器提供服务。选择的依据包括:根据使用户 IP 地址,判断哪一台服务器距离使用户最近。
  • 根据使用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有使用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器上有服务可以力。
  • 基于以上条件的综合分析之后,区域负载均衡设施会向全局负载均衡设施返回一台缓存服务器的 IP 地址。
  • 全局负载均衡设施把服务器的 IP 地址返回给使用户。使用户向缓存服务器发起请求,缓存服务器响应使用户请求,将使用户所需内容返回到使用户终端。
  • 假如这台缓存服务器上并没有使用户想要的内容,而区域均衡设施仍然将它分配给了使用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直到追溯到包含该内容的源服务器并将内容拉到本地。

什么情况下使用 CDN?

最适合的是那些不会经常变化的内容,比方图片,JS 文件,CSS 文件。图片文件包括程序模板中 CSS 文件中使用到的背景图片,还有就是作为网站内容组成部分的那些图片等等。

灰度发布

我们的应使用即便经过了测试部门的测试,也依然很难全面覆盖使用户的用场景。

为了保证万无一失,我们在进行发布的时候一般都会采使用灰度发布,也就是会对新应使用进行分批发布,逐渐扩大新应使用在整个及集群中的比例直到最后一律完成。灰度发布是说针对新应使用在使用户体验方面完全无感知。

灰度发布系统的作使用在于,能根据自己的配置,来将使用户的流量导到新上线的系统上,来快速验证新的功可以。

而一旦出问题,也能马上的回滚发布,简单的说,就是一套 A/B Test 系统:

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

总结

通过本文,我们就对主流的 SOA 架构、微服务架构、服务网格架构做理解析,而后知道了分布式架构中的几个基本理论,而后还分析了如何设计出高可使用的分布式架构。

作者:阿豪

简介:代码极客,爱编程,对技术痴迷,业余时间写有“阿豪聊干货”公众号(ID:hafiz_talk ),主张“分享技术干货、广交天下猿友、相互学习进步”。

编辑:陶家龙、孙淑娟

来源:受权转载自“阿豪聊干货”公众号(ID:hafiz_talk )

免责公告:本文转载仅作分享,版权归原作者所有。如侵权请联络我们,必予以整改或者删除,谢谢您!

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Tiktok登录教程(2023-02-13 14:17)
【系统环境|】ZORRO佐罗软件安装教程及一键新机使用方法详细简介(2023-02-10 21:56)
【系统环境|】补单系统搭建补单源码搭建(2022-05-18 11:35)
【系统环境|服务器应用】高端显卡再度登上热搜,竟然是因为“断崖式”的降价(2022-04-12 19:47)
【系统环境|软件环境】一步步教你开发、部署第一个去中心化应用 - 宠物商店(2022-03-15 15:13)
【系统环境|软件环境】循序渐进!一文学会高性能开发十大必需掌握的核心技术。(2022-03-15 15:13)
【系统环境|软件环境】Python游戏开发,pygame模块,Python实现贪吃蛇小游戏(2022-03-15 15:13)
【系统环境|软件环境】Spring Cloud Feign 记录单个服务耗时并处理 Hystrix 线程隔离模式!(2022-03-15 15:13)
【系统环境|软件环境】js数组方法全解(2022-03-15 15:12)
【系统环境|软件环境】字节二面:小伙子你来说下什么是伪共享?如何避免?(2022-03-15 15:12)
血鸟云
手机二维码手机访问领取大礼包
返回顶部