这是我参与「第五届青训营」伴学笔记创作活动的第 11 天
前言
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。本文主要介绍分布式系统概念以及常见的故障模型。
概述
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标,可以分为分布式计算、分布式存储、分布式数据等。
-
优势:去中心化、低成本、弹性、资源共享、可靠性高
-
劣势:普遍的节点故障、不可靠的网络、异构的机器与硬件环境、安全
常见的分布式系统
分布式存储
- Google File System(GFS):google分布式文件系统
- Ceph:统一的分布式存储系统
- Hadoop HDFS:基于GFS架构的开源分布式文件系统
- Zookeeper:高可用的分布式数据管理与系统协调框架
分布式数据库
- Google Spanner:google可扩展的、全球分布式的数据库
- TiDB:开源分布式关系型数据库
- HBase:开源Nosql数据库
- MongoDB:文档数据库
分布式计算
- Hadoop:基于MapReduce分布式计算框架
- Spark:在Hadoop基础之上使用内存来存储数据
- YARN:分布式资源调度
故障模型
| 故障 | 说明 |
|---|---|
| Byzantine failure(拜占庭故障) | 节点可以任意篡改发送给其他节点的数据。 |
| Authentication detectable byzantine failure(ADB) | 拜占庭故障的特例,节点可以篡改数据,但不能伪造其他节点的数据。 |
| Performance failure | 节点未在特定时间段内收到数据,即时间太早或太晚。 |
| Omission failure | 节点收到数据的时间无限晚,即收不到数据。 |
| Crash failure | 在omission failure的基础上增加了节点停止响应的假设,也即持续性地omission failure。 |
| Fail-stop failure | 在Crash failure的基础上增加了错误可检测的假设。 |
拜占庭将军问题
问题描述:两将军问题,两只军队的将军只能派信使穿越敌方领土互相通信,以此约定进攻时间。该问题希望求解如何在两名将军派出的任何信使都可能被俘虏的情况下,就进攻时间达成共识。
结论:两将军问题被证实是无解的电脑通信问题,两支军队理论上永远无法达成共识。
解决方案:
- 同时发送N个信使,任何一个到达对方军队都算成功。
- 设置超市时间,发送后未在一定时间返回,则加派信使。
共识与消息传递的区别:即使保证了消息传递成功,也不能保证达成共识。
扩展:
-
有3个将军时,3个将军ABC互相传递消息,消息可能丢失,也可能被篡改。
当有一个将军是“叛徒”时,整个系统无法达成一致;如果没有“叛徒”,无论各自观察到怎样的敌情,总能达成一致的行动。
由于“叛徒”C的存在,将军A和将军B获得不同的信息。当将军A和B分别观察到进攻和撤退的敌情,而将军C分别给A和B发送进攻和撤退两个不同的信息时,将军A将获得2票进攻1票的信息,将军B将获得1票进攻2票撤退的信息,产生不一致。
-
有4个将军且只有一个“叛徒”的场景时,将军D作为消息分发中枢,约定如果没有收到消息就执行撤退,则总能达成一致。
-
进而可以证明,当有3m+1个将军,其中m个“叛徒”时,可以增加m轮协商,最终达成一致。
总结
本文主要介绍了分布式系统概念以及常见的故障模型,后面的笔记将介绍经典的分布式理论。