分布式系统概要
昨天晚上看到了一本很有用的小册子,大约60多页,名字叫做Distributed systems for fun and profit,内容涉及了分布式系统的方方面面:有基本的分布式系统的概念,有复杂的分布式一致性协议,有关于分布式系统的扩展性,可用性,可靠性,高吞吐,低延迟的讨论。不出意外的话,准备用两天的时间(打脸了,两天搞不定啊,东西太多了),把它的全部内容付诸于这篇博客中。事实上,只要在搜索随便输入那本书的名字,就可以再网上搜索出一大堆的个人理解,但是最喜欢第一手资料的我还是喜欢读原文,喜欢写总结。
声明:
不喜欢完整的翻译原文,总感觉全部的翻译之后总感觉啥都没说。边写边思考再边总结,常常能获得质的提升,但是这无法避免会出现由于个人知识水平或者理解能力的欠缺引起的疏漏或者错误,还请谅解。不变的一点是最权威的参考是论文,次权威的参考是原文。本文只希望能够以个人这几年来对分布式系统的浅薄认识能对原文进行一些Chinese类型的直观理解,沉淀自己,方便他人。
当前完成的部分
[1] 分布式系统概要(https://blog.youkuaiyun.com/lpstudy/article/details/83685997)
[2] 分布式系统上下层概念抽象(https://blog.youkuaiyun.com/lpstudy/article/details/83688141)
还待做的有3,4,5。
1. 总体概览
全文分为五大章节,分别涵盖了分布式系统的基本概念,分布式系统的一致性协议,分布式系统的时序性,副本的强一致性和副本的弱一致性,基本上各个章节都穿插了分布式系统的多维特征之间的权衡:可靠性,可用性,故障容错,一致性,低延迟,高吞吐。话不多说,开始讨论。
分布式系统编程本质上都是在处理两个公理
带来的影响
- 消息在系统中以光速传播
- 独立的事物,其故障的发生也是独立的
这两句话实际上陈述了分布式系统的基本事实:延迟无法避免,因为消息传输的速度是有限的,虽然是光速,但依然会有latency(其实从网络的角度,不仅有传输时延,还有发送时延);故障的发生是一个常态事件,因为分布式系统的集群规模很大,各种各样类型的设备都会可能由于掉电,老化,以及软件层面的bug发生故障,这是一个常态事件,是无法避免的。
为了更好的理解上面的内容,我们来看两个假设:
- 假设1:消息以无穷大的速度传统,也就是没有时延
我们就可以随便采用基于consensus的强一致性的协议(例如paxos,raft等),只要一个请求能够被大部分server响应,则成功。传统意义上来说,强一致性协议的代价较大(目前paxos需要两轮的RTT),极大影响系统可用性,而无时延假设恰恰使得我们的系统可用性有保证; - 假设2:系统永远不会有故障
我们可以采用要求servers全响应语义的一致性协议(例如2PC),只有在所有的server必须全部响应后,才算做客户端请求成功,然而实际系统中各式各样的故障,使得这种要求很难满足,可用性很难保证。其实上述两个假设,恰好对应于CAP理论中的P和A,我们知道CAP无法全部满足,但是对于(a)假设,我们可以构造满足CP的系统;对于(b)假设,我们可以构造满足CA的系统,关于CAP的细节,将会在后面的第二章分布式系统的一致性协议中具体阐述。
上述的两个限制条件使得我们在分布式系统的设计中,必须去协调distance,la