> 文章列表 > 【分布式系统】分布式系统架构的冰与火

【分布式系统】分布式系统架构的冰与火

【分布式系统】分布式系统架构的冰与火

什么是分布式系统

分布式系统(distributed system)是建立在网络之上的软件系统。

以上是摘自百度百科的解释,不可否则,分布式系统的基础是网络、计算、存储。比如常见的一个Web单体系统,其实也是一个分布式系统,因为从客户端到Web端以及存储MySQL层,其实就涉及到了不同的服务器进行计算、存储,而具体的形式可能是不一样的。主从MySQL也是分布式系统等等,但是从传统定义上来看,分布式系统其实可能有不同的形态。

分布式和集群的区别
分布式:多台机器提供不同的任务。集群:多台机器提供相同的任务。
比如我们有3台机器,3台机器分别部署了用户服务,那么就是集群模式,但是3台机器同时也部署了订单系统以及相关的支付、库存系统,那么整个架构就是分布式架构,因为用户->订单->库存->支付构成了整体,大多数的时候都是分布式和集群模式混合在一起。

为什么需要分布式系统

  • 增大系统的容量
    当我们的业务量逐渐增大,单机所能承受的QPS、TPS是有一定上限的,所以为了从计算和存储两个层面,通过多台机器来支持应对更大的应用场景。

  • 提高系统的稳定性
    单机系统是必定存在单点故障的,为了保证高可用,所以需要进行分布式架构冗余来提升可用性。

  • 系统的可拓展性
    通过将系统进行拆分,多个系统的可拓展性会提交,并且可能会随着不同的组件模块、多个系统之间可以直接重用,比如用户中心,存储等。

分布式系统的冰火

【分布式系统】分布式系统架构的冰与火
在软件系统中,都是按起葫芦起了瓢,虽然可以通过引入分布式系统来解决上述单体架构的问题,但是分布式也引入了一系列相关问题。这可能就是trade-off的艺术。正所谓冰火不相容。

分布式系统带来的问题

  • 架构设计变的复杂,分布式事务(电商系统 下订单-库存-支付不同的系统 如何保证业务数据的一致性)
  • 部署层面,部署一个服务比较简单,但是如何部署多个服务。
  • 响应时间变长,一个单独的服务A,直接操作存储,缓存 消息队列等,但是如果A 拆分成(B、C、D)其中必定有一定的网络耗时,(http/RPC)
  • 测试和排查问题 复杂度提高,需要依赖上下游系统进行排查。
  • 分布式系统中服务调度更加困难和复杂
  • 分布式网络的不可靠,网络延迟以及时钟问题。

总结:分布式带来了系统设计,管理,运维,测试,部署等问题。这就是为什么会出现各种分布式技术的原因,比如事务、锁、以及相关的分布式存储、计算(服务注册发现等)等技术。

分布式系统的难点

  • 异构系统的不标准
  • 系统架构中服务依赖性问题
  • 故障发生的概率更大
  • 多层架构的运维复杂度更大

分布式系统的发展

【分布式系统】分布式系统架构的冰与火
从90年的单体系统到20年的SOA以及10年之后大火的微服务。

分布式系统的技术栈

构建分布式系统的目的就是为了提高系统容量,增加系统可用性。

  • 大流量处理:通过集群把大流量的请求分散负载到不同的机器上
  • 关键业务保护:提高系统的的可用性,防止出现多米诺骨牌效应,通过限流,降级等手段来保证核心业务的正常运转。

总结:提高整体架构的吞吐量,服务更多的并发和流量。而是提高系统的稳定性,让系统的可用性更高。

a.提高架构的性能

【分布式系统】分布式系统架构的冰与火

  • 缓存
    从客户端、CDN、网关、服务端、内存、数据库、文件系统、磁盘和CPU 都可以通过加缓存,来提高访问的速度。
  • 负载均衡
    水平拓展的技术,通过将用户请求分发到不同的机器上来承担一部分用户流量
  • 异步调用
    主要通过消息队列来实现,将前段的请求的峰值给肖平,后端按照自己的速度进行处理请求,增加系统的吞吐量,但是实时性就比较差。但是消息队列带来了消息丢失,重复消费,消息挤压等问题。
  • 数据分区/镜像
    数据分区是通过将数据按照某种维度进行划分,比如地理上,请求最近的数据,但是join和跨库的事务操作复杂度比较高。而数据镜像则是通过将数据拷贝一份,然后任意节点上都可以读写,内部自行同步数据,最大问题就是数据一致性问题。

缓存是提高读的性能,而异步调用是提高写的性能,负载均衡技术主要是通过服务冗余将流量进行分担,在分布式架构中,数据存储是一个重中之重,而一般要么就是使用镜像/复制技术,将数据进行拷贝,读写分离,另一种就是将数据分成多片,每片存储在不同服务器上,这样可以横行提高数据读写能力

b.提高架构的稳定性

【分布式系统】分布式系统架构的冰与火

  • 服务拆分
    服务拆分的目的主要是两个,一是隔离故障,二是提高重用性。但是拆分后会引来服务之间依赖通信问题
  • 服务冗余
    去除单点故障,支持服务的弹性伸缩,以及故障迁移。具体形式可能是主备、主从。
  • 限流降级
    当系统是在扛不住压力的时候,需要通过限流或者降级的方式来保证核心业务的正常运转,属于技术保护的措施。
  • 高可用架构
    通常来说高可用架构是从冗余架构的角度来保证可用性,多租户隔离,容灾备份(异地多活/同城多机房、跨城多机房、跨国多机房),或者数据可以在复制保持一致性的集群。
  • 高可用运维
    DevOps中的CI/CD(持续集成、持续部署)一个流程的软件发布流程,足够的自动化测试,相应的灰度发布,线上系统的自动化控制。

c.分布式系统的关键技术

虽然引入分布式可以解决一定的问题,但是也带来了一堆技术问题

  • 服务治理
    服务拆分、服务调用、服务发现、服务依赖。关键在于对服务调用链路,依赖关系给梳理出来,并对这些服务进行性能和可用性方面的管理
  • 软件架构管理
    服务之间有依赖关系,有兼容性问题,所以整体服务所形成的架构需要有架构版本管理,整体架构的生命周期管理,以及对服务的编排,聚合,事务处理等服务调度功能
  • DevOps
    分布式服务可以快读的部署,但是对测试和运维是一个挑战,包括环境构建、持续集成、持续部署等
  • 自动化运维
    对服务进行自动伸缩、故障迁移、配置管理、状态管理等一系列自动化运维技术了
  • 资源调度管理
    应用层的 计算 网络 存储
  • 整体架构监控
    监控是眼睛,需要对 应用层、中间件层、基础层进行监控
  • 流量控制
    负载均衡、服务路由、熔断、限流、降级都和流量相关的调度,以及灰度发布等。

d.分布式系统的纲

分布式五个关键技术

  • 全栈系统监控
  • 服务、资源调度
  • 流量调度
  • 状态、数据调度
  • 开发和运维的自动化

【分布式系统】分布式系统架构的冰与火

小结

【分布式系统】分布式系统架构的冰与火

以上是我整理的分布式技术栈思维图,基本上可以分为几个主题

  • 分布式理论基础
    • ACID、CAP、BASE、FLP
  • 分布式共识算法
    • 两将军、拜占庭将军
    • Paxos、Raft、ZAB、Gossip
  • 分布式存储
    • 分区、复制、一致性模型
    • 分布式事务
  • 分布式计算
    • 注册发现、负载均衡、配置中心、分布式锁、重试幂等、雪崩、故障恢复,监控、部署
  • 高性能架构设计
    • 缓存、负载均衡、异步、数据镜像、分区
  • 高可用架构设计
    • 弹力设计篇: 故障和弹力设计、隔离设计、异步通讯设计、幂等&重试&补偿、熔断、限流、降级、排队
    • 异地多活
    • 存储、计算高可用:主从、主备
    • 高可用运维
  • 可拓展架构设计
    • 分层、SOA、微服务、微内核
  • 软件设计
    • 编程范式
    • 软件设计原则
      • SOLID原则
    • 设计模式
    • 设计方法