写点什么

左耳朵耗子:分布式系统架构经典资料

  • 2018-01-29
  • 本文字数:2749 字

    阅读完需:约 9 分钟

更多左耳朵耗子的独家干货,请订阅极客时间出品的陈皓全年专栏《左耳听风》,一次订阅、永久阅读。即日起,戳此订阅立享以下两大福利:

福利一:原价 ¥199/ 年,极客时间新用户注册立减 ¥30

福利二:每邀请一位好友购买,你可获得 36 元现金返现,多邀多得,上不封顶,立即提现(提现流程:极客时间服务号 - 我的 - 现金奖励提现)

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

本文摘自陈皓(左耳朵耗子)在极客时间 App 上开始的全年付费专栏《左耳听风》,已获授权。欲阅读带外链的原文,和更多独家文章,请点击此处订阅专栏阅读(支持微信支付)。

前段时间,我写了一系列分布式系统架构方面的文章(拉到文末看目录),有很多读者纷纷留言讨论相关的话题,还有读者留言表示对分布式系统架构这个主题感兴趣,希望我能推荐一些学习资料。

就像我在前面的文章中多次提到的,分布式系统的技术栈巨大无比,所以我要推荐的学习资料也比较多,会在后面的文章中陆续发出。在今天这篇文章中,我将推荐一些分布式系统的基础理论和一些不错的图书和资料。

基础理论

下面这些基础知识有可能你已经知道了,不过还是容我把其分享在这里。我希望用比较通俗易懂的文字将这些枯燥的理论知识讲请楚。

CAP 定理

CAP 定理是分布式系统设计中最基础,也是最为关键的理论。它指出,分布式数据存储不可能同时满足以下三个条件。

  • 一致性(Consistency):每次读取要么获得最近写入的数据,要么获得一个错误。

  • 可用性(Availability):每次请求都能获得一个(非错误)响应,但不保证返回的是最新写入的数据。

  • 分区容忍(Partition tolerance):尽管任意数量的消息被节点间的网络丢失(或延迟),系统仍继续运行。

也就是说,CAP 定理表明,在存在网络分区的情况下,一致性和可用性必须二选一。而在没有发生网络故障时,即分布式系统正常运行时,一致性和可用性是可以同时被满足的。这里需要注意的是,CAP 定理中的一致性与 ACID 数据库事务中的一致性截然不同。

掌握 CAP 定理,尤其是能够正确理解 C、A、P 的含义,对于系统架构来说非常重要。因为对于分布式系统来说,网络故障在所难免,如何在出现网络故障的时候,维持系统按照正常的行为逻辑运行就显得尤为重要。你可以结合实际的业务场景和具体需求,来进行权衡。

例如,对于大多数互联网应用来说(如门户网站),因为机器数量庞大,部署节点分散,网络故障是常态,可用性是必须要保证的,所以只有舍弃一致性来保证服务的 AP。而对于银行等,需要确保一致性的场景,通常会权衡 CA 和 CP 模型,CA 模型网络故障时完全不可用,CP 模型具备部分可用性。

  • CA (consistency + availability),这样的系统关注一致性和可用性,它需要非常严格的全体一致的协议,比如“两阶段提交”(2PC)。CA 系统不能容忍网络错误或节点错误,一旦出现这样的问题,整个系统就会拒绝写请求,因为它并不知道对面的那个结点是否挂掉了,还是只是网络问题。唯一安全的做法就是把自己变成只读的。

  • CP (consistency + partition tolerance),这样的系统关注一致性和分区容忍性。它关注的是系统里大多数人的一致性协议,比如:Paxos 算法 (Quorum 类的算法)。这样的系统只需要保证大多数结点数据一致,而少数的结点会在没有同步到最新版本的数据时变成不可用的状态。这样能够提供一部分的可用性。

  • AP (availability + partition tolerance),这样的系统关心可用性和分区容忍性。因此,这样的系统不能达成一致性,需要给出数据冲突,给出数据冲突就需要维护数据版本。Dynamo 就是这样的系统。

然而,还是有一些人会错误地理解 CAP 定理,甚至误用。Cloudera 工程博客中, CAP Confusion: Problems with ‘partition tolerance’一文中对此有详细的阐述。

在谷歌的 Transaction Across DataCenter 视频中,我们可以看到下面这样的图。这个是 CAP 理论在具体工程中的体现。

Fallacies of Distributed Computing

本文是英文维基百科上的一篇文章。它是 Sun 公司的劳伦斯·彼得·多伊奇(Laurence Peter Deutsch)等人于 1994~1997 年提出的,讲的是刚刚进入分布式计算领域的程序员常会有的一系列错误假设。

多伊奇于 1946 年出生在美国波士顿。他创办了阿拉丁企业(Aladdin Enterprises),并在该公司编写出了著名的 Ghostscript 开源软件,于 1988 年首次发布。

他在学生时代就和艾伦·凯(Alan Kay)等比他年长的人一起开发了 Smalltalk,并且他的开发成果激发了后来 Java 语言 JIT 编译技术的创造灵感。他后来在 Sun 公司工作并成为 Sun 的公司院士。在 1994 年,他成为了 ACM 院士。

基本上,每个人刚开始建立一个分布式系统时,都做了以下 8 条假定。随着时间的推移,每一条都会被证明是错误的,也都会导致严重的问题,以及痛苦的学习体验。

  1. 网络是稳定的。
  2. 网络传输的延迟是零。
  3. 网络的带宽是无穷大。
  4. 网络是安全的。
  5. 网络的拓扑不会改变。
  6. 只有一个系统管理员。
  7. 传输数据的成本为零。
  8. 整个网络是同构的。

阿尔农·罗特姆 - 盖尔 - 奥兹(Arnon Rotem-Gal-Oz)写了一篇长文 Fallacies of Distributed Computing Explained 来解释这些点。

由于他写这篇文章的时候已经是 2006 年了,所以从中能看到这 8 条常见错误被提出十多年后还有什么样的影响:一是,为什么当今的分布式软件系统也需要避免这些设计错误;二是,在当今的软硬件环境里,这些错误意味着什么。比如,文中在谈“延迟为零”假设时,还谈到了 AJAX,而这是 2005 年开始流行的技术。

加勒思·威尔逊(Gareth Wilson)的文章则用日常生活中的例子,对这些点做了更为通俗的解释。

这 8 个需要避免的错误不仅对于中间件和底层系统开发者及架构师是重要的知识,而且对于网络应用程序开发者也同样重要。分布式系统的其他部分,如容错、备份、分片、微服务等也许可以对应用程序开发者部分透明,但这 8 点则是应用程序开发者也必须知道的。

为什么我们要深刻地认识这 8 个错误?是因为,这要我们清楚地认识到——在分布式系统中错误是不可能避免的,我们能做的不是避免错误,而是要把错误的处理当成功能写在代码中。

后面,我会写一个系列的文章来谈一谈,分布式系统容错设计中的一些常见设计模式。敬请关注!

经典资料

  • Distributed systems theory for the distributed systems engineer

  • FLP Impossibility Result

  • An introduction to distributed systems

  • Distributed Systems for fun and profit

  • Distributed Systems: Principles and Paradigms

  • Scalable Web Architecture and Distributed Systems

  • Principles of Distributed Systems

  • Making reliable distributed systems in the presence of software errors

  • Designing Data Intensive Applications

注:以上仅为文章的一部分,欲阅读全文,请点击此处订阅专栏(支持微信支付)。一次订阅,永久阅读。

2018-01-29 20:349813

评论

发布
暂无评论
发现更多内容

中国掀起数字化浪潮的4个显著变化

优秀

数字化转型 数字化

华为云数字化

科技云未来

监控告警怎么搭建比较合理?B站SRE实践总结了4大关键步骤

TakinTalks稳定性社区

高可用 稳定性 SRE 监控告警 大厂实践

详解AUTOSAR:什么是AUTOSAR?(理论篇—1)

不脱发的程序猿

汽车电子 嵌入式开发 AUTOSAR

Kubernetes MetalLB 作为 Load Balancer上

CTO技术共享

Kubernetes MetalLB 作为 Load Balancer下

CTO技术共享

迁移 Nacos 和 ZooKeeper,有了新工具

阿里巴巴中间件

zookeeper 阿里云 云原生 nacos 迁移

华为云助力论坛服务

科技云未来

C++文件读写操作分析文本文件与二进制文件

CtrlX

c c++ 面向对象 8月月更 opp

每日一R「13」数据结构(四)闭包

Samson

学习笔记 8月月更 ​Rust

[教你做小游戏] 用86行代码写一个联机五子棋WebSocket后端

HullQin

CSS JavaScript html 前端 8月月更

天翼云通过2022可信云安全首批云工作负载保护平台评估

Geek_2d6073

加密世界的福音,Galaxy Project上领取专属Zebec OAT

鳄鱼视界

详解CAN总线:高速CAN总线和低速CAN总线的特性

不脱发的程序猿

汽车电子 ISO 11898 高速CAN总线 低速CAN总线 CAN总线

企业应用现代化实用教程 | ​IT架构师必读的DevOps落地行动指南

York

DevOps 云原生 数字化转型 一体化架构 应用现代化

灵魂拷问:你精神内耗了吗?由TA来治愈吧

脑极体

redis持久化持久化的方案与各自存在的问题

想要飞的猪

程序员过中秋

楠羽

中秋节

IPv6过渡技术的推进策略

穿过生命散发芬芳

ipv6 8月月更

【算法实践】| 一步步手把手带你实现寻找最小公倍数

迷彩

算法 算法实践 8月月更 最小公倍数

DDD实战(12-终篇):DDD下微服务的“分分合合”及一个倡议

深清秋

DDD 软件架构 8月月更

秒云获得阿里云首批产品生态集成认证,携手阿里云共建云原生智能运维生态服务

阿里巴巴中间件

阿里云 云原生 云原生加速器

融云,把企业文化放在“场景”里

融云 RongCloud

企业文化

云原生2.0构建数字化

科技云未来

Tomcat 的安装与环境配置

楠羽

开源 #开源

网站建设流程

源字节1号

网站开发

汽车电子控制系统的构成

不脱发的程序猿

汽车电子 嵌入式软件 汽车电子控制系统

leetcode 697. Degree of an Array 数组的度(简单)

okokabcd

LeetCode 数据结构与算法

陈大好:持续创造小而美的产品丨独立开发者 x 开放麦

声网

人工智能

头脑风暴:回文子串

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

架构实战营模块五作业

zhihai.tu

左耳朵耗子:分布式系统架构经典资料_语言 & 开发_杨爽_InfoQ精选文章