【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

  • 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:349438

评论

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

字节前端经典面试题(附答案)

hellocoder2029

JavaScript 前端

模块2作业

抹茶柠檬

PGLBox 超大规模 GPU 端对端图学习训练框架正式发布

百度Geek说

百度飞桨 框架学习 企业号 2 月 PK 榜

大咖说·图书分享|云存储:释放数据无限价值

大咖说

云存储

如何整理自己的前端面试题库

Geek_02d948

JavaScript 前端

Memblaze 联合 OpenCloudOS 完成技术兼容互认证

OpenCloudOS

Linux SSD

堡垒机采购注意事项说明-行云管家

行云管家

网络安全 数据安全 堡垒机

NGINX Ingress Controller 在动态 Kubernetes 云环境中的性能测试

NGINX开源社区

nginx NGINX Ingress Controller 企业号 2 月 PK 榜

koa实战

coder2028

JavaScript 前端

js函数式编程讲解

hellocoder2029

JavaScript 前端

阿里大牛详细讲解:Spring Boot 集成Redisson实现分布式锁

做梦都在改BUG

Java Spring Boot 分布式锁

中创中间件:基于鲲鹏DevKit开发统一监管平台,性能提升55%

Geek_2d6073

物联网平台华南1(深圳) 实例化开发实战——实践类

阿里云AIoT

监控 物联网 开发工具 智能硬件 消息中间件

EasyRecovery16绿色版免费数据恢复软件下载

茶色酒

EasyRecovery16

行云管家免费吗?安全吗?好用吗?

行云管家

安全 行云管家 行云管家堡垒机

ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具

华为云开发者联盟

人工智能 华为云 昇腾 企业号 2 月 PK 榜 华为云开发者联盟

js作用域、作用域链和它的一些优化

hellocoder2029

JavaScript 前端

使用JAVA读取和写入EXCEL文件

石臻臻的杂货铺

Java

全新CorelDRAW2023矢量图软件更新内容介绍

茶色酒

CorelDraw2023

利用规则引擎的M2M实现设备之间联动——实践类

阿里云AIoT

小程序 物联网 智能硬件 网络性能优化

Nodejs:ESModule和commonjs,傻傻分不清

coder2028

JavaScript 前端

美团前端面试题集锦

coder2028

JavaScript 前端

2023秋招前端面试必会的面试题

coder2028

JavaScript 前端

MatrixOne 0.7.0: 更稳定,性能更优

MatrixOrigin

数据库 分布式 MatrixOrigin MatrixOne

PingCAP 唐刘:一个咨询顾问对 TiDB Chat2Query Demo 提出的脑洞

PingCAP

TiDB

【立哥】【每日一个小知识】铁扇公主和太上老君到底是什么关系?

Lee Chen

前端二面经典面试题指南

hellocoder2029

JavaScript 前端

EasyRecovery2023手机版数据恢复软件下载

茶色酒

EasyRecovery Photo16

CDR2023安装下载教程及CorelDRAW功能介绍

茶色酒

CorelDraw2023

即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]

JackJiang

网络编程 IM 即时通信

在 CPU 上起舞:聊一聊Linux调度和Go的Runtime调度

黑客不够黑

golang goroutine 协程原理 Linux调度 go 信号异步抢占

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