分布式系统指南大纲
本大纲旨在向软件工程师介绍现实中分布式系统的基础知识,以便让大家获得对分布式系统中关键术语的直观理解,并探讨生产中问题。
什么是分布式系统?
Lamport, 1987:
A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable.
一个分布式系统是那种发生问题后,你都不知道发生在那里,最终导致你的计算机变得无法访问和使用。
我们称分布式系统的每个部分为一个节点node,也有称为处理processe, agent, actor
什么是节点Node?
- 有典型延迟latency特征
- 一个节点中的操作是快的
- 节点之间通讯操作是慢的
- 快慢是相对的取决于系统在做什么任务。
- 节点是逻辑条理的coherent
- 你能够知道什么时候发生问题
- 发生的事情都是有序的
- 典型的建模为单线程状态机
- 一个节点自己也能成为一个分布式系统
- 只要系统整体提供“快速有逻辑条理的”操作,我们就可以将其看作为一个单节点。
网络作为消息流
- 节点之间交互通过网络
- 人类交流通过讲话
- 计算机交互通过IP, 或 UDP, 或 SCTP, ...
- 我们建模这种交互作为节点之间离散的消发送。
- 消息随时间广播
- 这是分布式系统的缓慢部分
- 我们称这为“延迟latency"
因果关系
- 我们可以将节点和网络之间的交互作为一种diagram
- 时间在流逝作为横坐标
- 节点被空间垂直分离,作为纵坐标
- 消息沿着时空结合斜线路径连接各个节点
同步网络
- 在一个锁中执行
- 在切换延迟上有固定值
- 精确的全局时钟
- 易于证明有关
- 在异步网络上不能确定的事情,通过同步网络能够确定性证明该功能是否在网络下正常运行。
异步网络
- 无论什么时候都是独立互相不依赖地执行
- 无法界定消息延误时间
- 无全局时钟
- IP 网络确定是异步的
- 但是实践中真正不理智的事情不会发生
- 大多数网络会在数秒到几周时间内恢复,不会发生永远不恢复的事情。
- 人类时间尺度也是建立在数秒到数周的这个序列中。
- 这样我们就不能假装延迟而没有恢复的问题没有发生。
当网络出错了
- 异步网络允许
- 重复Duplicate
- 延误Delay
- 丢失Drop
- 重新排序Reorder
- 丢失和延误是无法分辨的
- 拜占庭网络就是被无数个消息搞混乱了
- 包括重写消息内存
- 它们在实际网络中大部分不会发生