云原生时代,分布式系统设计必备知识图谱(内含22个知识点)

作者| 杨泽强(竹涧)阿里云技术专家

我们身处于一个充斥着分布式系统解决方案的计算机时代,无论是支付宝、微信这样顶级流量产品、还是区块链、IOT 等热门概念、抑或如火如荼的容器生态技术如 Kubernetes,其背后的技术架构核心都离不开分布式系统。

为什么要懂分布式架构设计

系统学习分布式架构设计对于技术人的成长非常关键,对于云原生开发者而言如何设计出符合云原生设计哲学的应用,往往离不开分布式系统知识与方法论的运用。如何设计出高弹性、可配置、可分布、高性能、高容错、更安全、更韧性、快交付的云原生应用往往是衡量开发者水准的重要参考。

然而分布式系统是一个很大的概念,从架构设计、研发流程、运维部署、工程效率等多个角度均有很深的知识可以挖掘,学习成本和难度相对较大。

近期,我整理了过去阅读过的一些和分布式相关书刊和文章,加上自己做分布式开发的一些的心得分享给大家,本文作为开篇,总体上给出知识概览,后续将分篇结合代码实践来进行阐述。起草仓促,水平有限,欢迎大家一起学习指正。

分布式系统大图

一、设计

网关模式,Gateway

功能

  • 请求路由,客户端直接调用 Gateway,Gateway 负责路由转发到注册服务上
  • 服务注册,后端服务将 API 注册,Gateway 负责路由
  • 负载均衡,支持多种负载策略
  • round robin
  • 随机均衡算法
  • 多权重负载
  • session 粘连
  • 其它
  • 安全特性,支持 HTTPS,账户鉴权,及其它安全特性支持
  • 灰度发布,可以针对服务版本或者租户等特性做灰度发布
  • API 聚合,将多个后端接口聚合,减少客户端调用次数
  • API 编排,通过编排来串接多个 API 完成特定业务

设计要点

  • 可用性,必须保证高可用
  • 扩展性,可以灵活扩展以支持特定业务比如特定业务流控
  • 高性能,通常使用异步 IO 模型框架实现,比如 Java netty,Go Channel
  • 安全,如加密通信,鉴权,DDOS 防御等
  • 运维
  • 应用监控,包括容量,性能,异常检测等
  • 弹性伸缩,具备高弹性能力,以低成本应对高峰值
  • 架构
  • 与业务解耦合,提供扩展扩展机制比如 Plugin,Serverless 的思路支持后端业务
  • 服务隔离,可以按照后端服务划分网关,做到不同服务使用不同网关
  • 网关部署靠近后端,保证网络损耗最小,性能最佳

边车模式,Sidecar

价值

  • 分离控制与逻辑,分离业务逻辑与路由,流控,熔断,幂等,服务发现,鉴权等控制组件
  • 适用场景
  • 老系统改造扩展,Sidebar 进程与服务进程部署在同一个节点,通过网络协议通讯
  • 多语言混合分布式系统扩展
  • 应用程序由多方提供

设计要点

  • 标准服务协议,Sidebar 到 Service,Sidebar 到 Sidebar 协议尽可能与语言解耦
  • 聚合控制逻辑比如流控,熔断,幂等,重试,减少业务逻辑
  • 不要使用对服务侵入的方式进行进程间通讯如信号量,共享内存,优先使用本地网络通讯的方式比如 TPCP 或者 HTTP

服务网格,Service Mesh

新一代微服务架构,本质是服务间通信的基础设施层。

架构图(图片来源于网络,若有侵权请联系作者删除)

特点

  • 应用间通讯中间层
  • 轻量级网络代理
  • 解耦应用程序
  • 应用程序无感知

主流框架

  • Istio
  • Linkerd

分布式锁

解决方案

  • Redis 分布式锁,SETNX key value PX expiretime
  • value 生成,最好全局唯一比如 TraceID,可以使用 /dev/urandom 生成
  • expiretime 单位是毫秒,过期锁自动释放 ,锁持有者保证过期时间内争抢资源完成计算
  • 悲观锁,先获取锁,再进行操作,吞吐量底
  • 乐观锁,使用版本号方式实现,吞吐量高,可能出现锁异常,适用于多读情况
  • CAS,修改共享数据源的场景可以代替分布式锁

设计要点

  • 排他性,任意条件只有一个 client 可以获取锁
  • 锁有自动释放方式,比如超时释放
  • 锁必须高可用,且持久化
  • 锁必须非阻塞且可重入
  • 避免死锁,client最终一定可以获取锁,不存在异常情况锁无法释放的情况
  • 集群容错性,集群部分机器故障,锁操作仍然可用

配置中心

  • 静态配置,环境及软件启动配置
  • 动态配置,运行时动态调整的配置如流控开关,熔断开关等

异步通讯

  • 请求响应式,发送方直接向接收方发送请求
  • 发送方主动轮询
  • 发送方注册一个回调函数,接收方处理完成后回调发送方
  • 事件驱动设计(EDA)
  • 消息订阅,发送方发布消息,接收方订阅并消费消息
  • Broker 中间人,发送方向 Broker 发布消息,接收方向 Broker 订阅消息,彼此解耦,比如中间件 RocketMQ
  • 事情驱动设计优势
    • 服务间依赖解除
    • 服务隔离程度高

幂等性

  • 本质是一个操作,无论执行多少次,执行结果总是一致的
  • 幂等核心是全局唯一 ID,链路依据全局 ID 做幂等,依据业务复杂度可以选取多种实现方式
  • 数据库自增长 ID
  • 本地生成 uuid
  • Redis 生产 id
  • Twitter 开源算法 Snowflake
  • HTTP 幂等性,除 POST 外,HEAD,GET,OPTIONS,DELETE,PUT 均满足幂等

二、性能

分布式缓存

缓存更新模式

  • Cache Aside,常用模式,应用要维护缓存的失效,命中,更新等动作
  • Read/Write Through,缓存代理更新数据库操作,应用视角只有一份存储
  • Write Behind Cache,IO 加速方式之一,更新操作只在内测完成,异步进行批量更新数据库

异步处理

  • Push 模型,中心调度,复杂度高
  • Pull 模型,无中心调度,复杂度底
  • Push+Pull 模型

数据库扩展数据库分片

  • 垂直分片
  • 字段拆分,将变化频率不同的字段拆分到不同表
  • 水平分片
  • 哈希算法来分,数据离散度高,降低热点可能性
  • 通过时间范围分片,保证数据连续性
  • 分片设计要点
  • 分片要预留足够空间,避免重新分片
  • 分片聚合要并行去做
  • 业务尽可能不去做跨分片的事务

三、容错

系统可用性

  • MTTF, Mean Time To Failure,系统平均运行多长时间才发生故障,越长越好
  • MTTR,Mean Time To Recover, 故障平均修复时间,越短越好
  • 可用性计算公式, Availability= MTTF /(MTTF+MTTR)

服务降级

  • 降低一致性
  • 强一致性,将所有的同步一致性,切换为最终一致性,提高吞吐量
  • 弱一致性,必要时候牺牲一致性换取服务整体可靠性
  • 关闭次要服务
  • 不同应用,关闭次要应用,释放物理资源
  • 相同应用,关闭应用次要功能,更多资源给到核心功能
  • 简化服务功能
  • 如简化业务流程,减少通讯数据等

服务限流

限流目的

  • SLA 保证方式之一
  • 应对突发峰刺流量,一定程度节约容量规划成本
  • 租户隔离策略之一,避免某些用户占用其它用户的资源,导致服务大范围不可用

限流方式

  • 服务降级
  • 服务拒绝

解决方案

  • 服务权重划分,多租户环境将资源按权重划分,保证重要客户的资源
  • 服务延时处理,加入服务缓冲队列延缓服务压力,用于削峰
  • 服务弹性伸缩,依赖服务监控,弹性伸缩容

流控算法

  • 计数器
  • 单机或者集群保存某用户某时间段请求数,达到阈值则触发流控
  • 队列算法
  • FIFO 队列
    • 请求速度波动,消费速度均匀,队列满则流控
    • 权重队列
    • 按服务划分优先级队列,不同队列权重不同
    • 队列算法设计关键:队列长度的预设非常关键
    • 队列太长,流控未生效,服务已经被打死
    • 队列太短,流控被频繁触发,体验差
  • 漏斗算法
  • 本质上是队列+限流器实现,限流器保证消费速度均匀类 TCP sync backlog
  • 转发速度均匀
  • 令牌桶
  • 中间人已恒定速率向桶里发放令牌,服务请求拿到 token 则开始服务,否则不处理
  • 转发速度不均匀,流量小时积累,流量大时消费
  • 动态流控
  • 实时计算服务能力如 QPS,对比服务 RT 如果 RT 过大,则减少 QPS

设计要点

  • 手动开关,主动运维和应急使用
  • 监控通知,限流发生时干系人要清楚
  • 用户感知,如返回特定错误信息(错误code/错误提示)
  • 链路标识,RPC链路加入限流标识方便上下游业务识别限流场景做不同处理

熔断设计

场景

  • 过载保护,系统负载过高情况为防止故障产生,而采取的一种保护措施
  • 防止应用程序不断尝试可能会失败的操作

三个状态

  • Closed,闭合状态,正常状态,系统需要一个基于时间线到错误计数器,如果错误累计达到阈值则切换至 Open 状态
  • Open,断开状态,所有对服务对请求立即返回错误,不用调用后端服务进行计算
  • Half-Open,半开状态,允许部分请求流量进入并处理,如果请求成功则按照某种策略切换到 Closed 状态

设计要点

  • 定义触发熔断的错误类型
  • 所有触发熔断的错误请求必须要有统一的日志输出
  • 熔断机制必须有服务诊断及自动恢复能力
  • 最好为熔断机制设置手动开关用于三种状态的切换
  • 熔断要切分业务,做到业务隔离熔断

补偿事务

  • CAP
  • 一致性 (Consistence)、可用性 (Availability)、分区容忍性 (Partition Tolerance)
  • BASE
  • Basic Availabillity,基本可用
  • Soft State,软状态
  • Eventual Consistency,最终一致性
  • Design For Failure
  • Exponential Blackoff,指数级退避

四、DevOps

部署

基础设施

  • 公有云
  • 私有云
  • 混合云
  • 容器技术
  • Docker
  • Kubernetes

部署策略

  • 停机部署
  • 滚动部署
  • 蓝绿部署
  • 灰度部署
  • A/B 测试

配置管理

  • Ansible
  • Puppet
  • Shippable

监控

  • Nagios
  • DynaTrace

CI 与 CD

五、工程效率

敏捷管理

  • Scrum

持续集成

  • Jenkins
  • CodeShip

持续交付

总结及学习建议

分布式系统在阿里巴巴经济体有着广泛的应用,以笔者所在的弹性计算技术团队为例,当业务足够规模化后,最终面临的技术问题都是通过践行分布式系统架构的设计理念和方法论得以解决,可以说分布式系统架构的知识与方法论是当前互联网应用规模化后的通用解决方案

学习分布式系统设计也不是一蹴而就,需要不断汲取理论知识,然后将理论不断付诸实践,最终通过一次次的调优来将知识的价值最大化。

笔者最后的建议是先理论、后实践、重实践、不妥协,所谓纸上得来终觉浅,绝知此事要躬行,与君共勉。

Image placeholder
liuxiaoma
未设置
  70人点赞

没有讨论,发表一下自己的看法吧

推荐文章
为什么说Kubernetes的崛起预示着云原生时代到来?

现在,云原生、Kubernetes已经成为企业IT领域的时髦概念,几乎所有的企业都在关注;如果不提这些概念,好像企业就会在云市场竞争中失去绝对话语权。那么,云原生和Kubernetes是怎样一种关系?

史上规模最大的中文知识图谱以及估值两个亿的 AI 核心代码

——大声告诉我,怎样才能可以让你变得更强?——充钱——???——都什么玩意?还有啥子咧?——充更多钱执迷不悟,无可救药了。所以,正确答案应该是什么呢?答:是知识。反正,说这些就是为了切入「知识」这个话

分布式存储时代,横空出世的OceanBase

数据,被誉为新时代的石油。几乎任何一个企业的IT管理者,都会在演讲、采访或其他形式的交流分享中强调数据的重要性。获取洞察、行为预测、市场分析、业务转型升级……数据能够为企业带来巨大的商业价值。但与此同

降低 80% 的读写响应延迟!我们测评了 etcd 3.4 新特性(内含读写发展史)

导读:etcd作为 K8s集群中的存储组件,读写性能方面会受到很多压力,而 etcd 3.4 中的新特性将有效缓解压力,本文将从etcd 数据读写机制的发展历史着手,深入解读 etcd 3.4 新特性

这 20 多个高并发编程必备的知识点,你都会吗?

转载自并发编程网–ifeve.comhttp://ifeve.com/%e9%ab%98%e5... 一、前言借用Java并发编程实践中的话”编写正确的程序并不容易,而编写正常的并发程序就更难了”,相

工程师笔记:我对数据库系统云原生化的一些思考

作者|张敏(于期)阿里云智能高级技术专家划重点我眼中的云原生我认为的云原生关键能力我眼中的云原生化技术手段我对数据库云原生化的思考伴随着云原生技术越来越热门,阿里内部关于CloudNative、Ser

可伸缩的微服务告警系统设计指南

Uber的软件架构由成千上万的微服务组成,有赖于此,我们的团队可以快速的自主迭代并支撑公司的全球扩张。这一架构支撑了大量的上层解决方案,如移动应用,内部基础设施服务,以及拥有复杂配置的产品,相关配置会

在云、AI时代,传统应用性能监控方案过时了吗?

近年来,企业云对IT复杂性产生巨大影响,越来越多的企业需要能够解决云复杂性上升或加速数字化转型的有效方案,而人工智能正在成为解决这些问题的不二之选。在全球智能运维浪潮下,不少公司都选择重写代码,颠覆自

腾讯汤道生:产业互联网时代,安全成为CEO的一把手工程

产业互联网日益成为众多行业实现转型,获得发展新动能的趋势性选择,政务、金融、医疗、出行、教育、零售、工业等垂直领域,正在全面拥抱产业互联网。网络安全作为互联网的基础保障,在产业互联网发展和企业数字化升

海量数据时代,磁带存储的“涅槃重生”

   磁带作为大规模非结构化数据的战略性/低成本存储手段,已然经历了一次复兴。由于磁带在快速恢复网站和反勒索软件方面具有较高的价值,所以备份仍然是它的一个主要用例。不过,磁带的未来增长机会更在于一些新

海量数据时代,金融行业数据库实践难题如何解决?

随着数字经济时代的到来,大数据、人工智能技术得到了快速发展与应用,可以说,各行各业都已全情投入到这一波数字化转型浪潮中,把握新的发展机遇,获取数字红利。其中,金融行业可以说是走在转型之路最前沿的行业之

YC中国创始人陆奇:人工智能时代,芯片和底层软件基本都要重做

大数据文摘出品作者:陆奇编辑:周素云2019年5月18日,在YC中国举办的YC中国创业者见面会上,YC中国创始人及首席执行官,YC全球研究院院长陆奇进行了以“技术驱动创新带来的创业机遇”为主题的精彩分

5G芯片进入三国杀时代,未来谁主沉浮?

手机芯片的江湖从来都是腥风血雨。进入5G时代,江湖再掀波澜,一场5G芯片之争风云再起。这次谁胜谁负?谁将问鼎?从五强争霸到三足鼎立,江湖格局渐明手机芯片一般指SoC芯片,它将基带芯片和CPU、GPU等

大数据时代,数据湖并不能完全取代数据仓库

数据仓库为组织了解其历史业务表现和推动持续运营提供了一个接入窗口,为数据分析师和业务用户提供了诸如客户行为、业务趋势、运营效率和销售等方面的信息。尽管出现了基于Hadoop和其他一些大数据技术的数据湖

分布式时序数据库QTSDB的设计与实现

现有的开源时序数据库influxdb只支持单机运行,在面临大量数据写入时,会出现查询慢,机器负载高,单机容量的限制。为了解决这一问题,360基础架构团队在单机influxdb的基础上,开发了集群版——

🚀 Hyperf 发布 v1.1.8 版本 | 企业级的 PHP 微服务云原生协程框架

更新内容 新增 #965新增RedisLua模块,用于管理Lua脚本; #1023hyperf/metric组件的Prometheus驱动新增CUSTOM_MODE模式; 修复 #1013修复Js

🚀 Hyperf 发布 v1.1.9 版本 | 企业级的 PHP 微服务云原生协程框架

更新内容 本周更新主要为DI组件新增了懒加载功能,配置为懒加载后,注入的对象为一个代理对象,在使用到时,才会实现对象的初始化。以及为DIContainer增加了set和define方法来动态的增加对象

🚀 Hyperf 发布 v1.1.9 版本 | 企业级的 PHP 微服务云原生协程框架

更新内容本周更新主要为DI组件新增了懒加载功能,配置为懒加载后,注入的对象为一个代理对象,在使用到时,才会实现对象的初始化。以及为DIContainer增加了set和define方法来动态的增加对象管

云计算下半场,从金融业变革看云原生的机遇与挑战

在数字化转型过程中,上云上平台是非常关键的一步。如今是否上云已经不需讨论,云计算在国内经过十年的发展走到了下半场,成为传统产业升级的新助力。而伴随着容器、微服务等技术的逐步成熟,云计算也走到了云原生时

当金融科技遇上云原生,蚂蚁金服是怎么做安全架构的?

蚂蚁金服在过去十五年重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑。在2019杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会者分享。我们将其中的

云原生存储和云存储有什么区别?

作者| 李鹏(壮怀)阿里云智能事业群高级技术专家导读:新的企业负载/智能工作负载容器化、迁云、存储方面遇到的性能、弹性、高可用、加密、隔离、可观测性以及生命周期等方面的问题,不但需要存储产品层次的改进

从容器到云原生,为什么灵雀云敢说自己“没有明显短板”?

Kubernetes虽然是最热门容器技术,但是放眼中国市场,除了阿里云、腾讯云、华为云这几家大厂,能把Kubernetes整明白并且可以成功落地的企业,凤毛麟角。容器改变了软件开发和部署的面貌,也导致

一图读懂POLARDB BOX的云原生力量

9月26日,2019杭州云栖大会上,阿里云宣布正式推出高性能数据库一体机——POLARDBBOX,用户部署在自有数据中心即可享受云数据库的便捷体验,同时还为Oracle等传统数据库用户提供一键迁移功能

阿里云联合微软开源全球首个开放云原生应用模型OAM

10月17日下午消息,阿里云联合微软正式开源全球首个开放云原生应用模型(OpenApplicationModel,简称OAM)。阿里云智能基础产品事业部总经理蒋江伟表示,该模型旨在为云端应用开发者、运