分布式理论-现代架构的基石(1) | 青训营笔记

123 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天,本文主要以概括总结,全局记录为主,而不是作为细致的知识点讲解,细节之处多有疏忽还望多多包容。

一、本堂课重点内容:

  • 分布式概述
  • 系统模型

二、详细知识点介绍:

什么是分布式?

分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算、分布式存储、分布式数据库等。

优势 1.去中心化 2.低成本 3.弹性 4.资源共享 5.可靠性高

挑战: 1.普遍的节点故障 2.不可靠的网络 3.异构的机器与硬件环境 4 安全

WHY-HOW-WHAT

使用者视角:学习者视角
Why1. 数据爆炸, 对储存和计算有大规模运用的诉求
2. 成本低,构建在廉价服务器上
1. 后端开发必备技能
2. 帮助理解后台服务器之间协作的机理
How1. 分布式框架
2. 成熟的分布式系统
1. 掌握分布式理论
2. 了解一致性协议
What1. 理清规模,负载, 一致性要求
2. 明确稳定性要求, 制定技术方案
1. 把要点深入展开, 针对难点搜索互联网资料进行学习
2.将所学的知识运用于实践

常见的分布式系统

分布式存储:

  1. Google File System (GFS):google分布式文件系统
  2. Ceph:统一的分布式存储系统
  3. Hadoop HDFS: 基于GFS架构的开源分布式文件系统
  4. zookeeper:高可用的分布式数据管理与系统协调框架

分布式数据库:

  1. GooRle Spanner: google可扩展的、全球分布式的数据库
  2. TiDB:开源分布式关系型数据库
  3. HBase:开源Nosql数据库
  4. MongoDB:文档数据库

分布式计算:

  1. Hadoop:基于MapReduce分布式计算框架
  2. Spark:在Hadoop基础之上,使用内存来存储数据
  3. YARN: 分布式资源调度

故障模型

  • Byzantine failure: 节点可以任意篡改发送给其他节点的数据
  • Authentication detectable byzantine failure (ADB): Byzantine failure 的特例:节点可以篡改数据,但不能伪造其他节点的数据
  • Performance failure: 节点未在特定时间段内收到数据,即时间太早或太晚
  • Omission failure: 节点收到数据的时间无限晚。即收不到数据
  • Crash failure: 在omission failure的基础上,增加了节点停止响应的假设,也即持续性地omission failure
  • Fail-stop failure: 在Crash failure的基础上增加了错误可检测的假设

拜占庭将军问题

引入:两将军问题 (Two Generals' Problem):两支军队的将军只能派信使穿越敌方领土互相通信,以此约定进攻时间。该问题希望求解如何在两名特军派出的任何信使都可能披俘房的情况下,就进攻时间达成共识。。来自 结论是,两特军问题是被证实无解的电脑通信问题,两支军队理论上永远无法达成共识。 方案一:同时发送N个信使,任何一个达到对方军队,都算成功。 方案二:设置超时时间,发送后未在一定时间返回,则加派信使。 共识与消息传递的不同:即使保证了消息传递成功,也不能保证达成共识 TCP三次握手是在两个方向确认包的序列号,增加了超时重试, 是两将军问题的一个工程解。

为何不是二次握手?

两次握手是不行的,因为服务端并不知道客户端是具备接收数据的能力,所以就不能成为面向连接的可靠的传输协议。

拜占庭将军考虑更加普适的场景,例如3个将军ABC互相传递消息,信息可能丢失,也可能被篡改,当有一个将军是 "叛徒" (即出现拜占庭故障)时,整个系统无法达成一致。 如果没有"叛徒",无论各自观察到怎样的敌情,总能达成一致的行动。 由于”叛徒”C的存在,将军A和将军B获得不同的信息。这样将军A 获得2票进攻1票撒退的信息,将军B获得1票进攻2票撤退的信息,产生了不一致。 考虑当4个将军,只有1个叛徒的场景。将军D作为消息分发中枢,约定如果没收到消息则执行搬退。

  • 如果D为”叛徒”

    • ABC无论收到任何消息,总能达成一致
  • D为"忠将"

    • ABC有2人将D的消息进行正确的传递,同样能保证最终决策符合大多数。 进而能够证明,当有3m+1个将军,其中m个”叛徒”时,可以增加 m轮协商,最终达成一致

共识和一致性

客户端A读到x=0,当客户端C正在写入时,客户端A和B可能读到0或者1。但是当C写入完成后,A和B最终能读到一致的数据。 我们称这样的一致性为Eventually consistent(最终一致性)

当客户端A读到更新的版本x=1后,及时将消息同步给其他客户端,这样其他客户端立即能获取到x=1。我们称这样的一致性为 Linearizability(线性一致性) 如果要保证”线性”一致性,多个节点间势必需要进行协商,以寻求一致。这样堆加了延迟,系统可用性便会受损

时间和事件顺序

1978年Leslie Lampon发表在 Commiunieations of the ACM上的论文 Time, Clocks, and the Ordering of Events in a Distributed System 我们定义happened before关系,记为 -> 。其满足如下三个条件:

  • 如果a 和上是在相同节点上的两个事件。a在上之前发生,则定义: a->b
  • 如果事件,表示某个节点发送某条消息,上 是另一个节点接受这条消息,则有 a->b
  • 如果有a->b且b->e,则有a->c

当且仅当a<->b且b<->a 时,我们称两个事件为并发的(concurrent)。

我们不难在图中找到若干满足条件的事件对,例如 p1->r4,其由 pI->q2->q4->r3-r>4 推导而来

三、课后个人总结:

分布式作为高手进阶之路,是必学的。

四、引用参考

bytedance.feishu.cn/file/boxcn4…