这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
分布式概述
分布式系统是计算机程序的集合,程序利用跨多个独立计算节点的计算资源来实现共同目标。可分为分布式计算、分布式存储和分布式数据库等。
优势:去中心化、低成本、弹性、资源共享、可靠性高等。
挑战:普遍的节点故障、不可靠的网络、异构的机器与硬件环境、安全。
系统模型
故障模型
按照故障处理的从难到易的程度列举如下:
- Byzantine failure:节点可以任意篡改发送给其他节点的数据,是最难处理的故障。分布式系统不百分百解决拜占庭故障,因为不好处理,只是通过数据传递时加密或冗余防止篡改
- Authentication detectable byzantine failure (ADB):节点可以篡改数据,但不能伪造其他节点的数据
- Performance failure : 节点未在特定时间段内收到数据,即时间太早或太晚。
- Omission failure:节点收到数据的时间无限晚,即收不到数据。
- Crash failure:节点停止响应,持续性的故障。
- Fail-stop failure:错误可检测,是最容易处理的故障。
拜占庭将军问题
拜占庭多个将军通过信使沟通,需要制定共同的行动计划,比如进攻或撤退,而只有半数以上的将军发起进攻才能成功。将军中可能存在叛徒。
两将军问题:两只军队派信使穿越敌方传递信息,并约定同时进攻的时间,信使有可能被敌方截获无法传递信息。 两将军问题永远无法达成共识。存在工程解,方案是TCP的超时重试和三次握手。共识与消息传递存在区别,即使保证了消息传递成功,也不能保证达成共识。
三将军问题:当三个将军都忠诚,可以通过投票的少数服从多数的结果达成作战计划的一致。将军中有叛徒,也即出现拜占庭故障,篡改发送信息,会导致不同将军收到的投票结果不一致。
四将军问题:对于四个将军中间有一个叛徒的情况,让某一将军作为消息分发中枢,进行一轮信息协商,再排除该将军进行一轮信息协商,此时该将军不论是否是叛徒,都能够做到一致计划。
进而证明,有3m + 1个将军,其中有m个叛徒,可增加m轮协商进而达成一致。
比特币可以拜占庭容错,但分布式问题是非拜占庭容错。
共识和一致
最终一致性:假设有A和B两个读数据的客户端,C是写数据的客户端,在C写过程A和B读数因为时机差异会有不一致,但写入完成后读数是一致的。
线性一致性:客户端A读到更新信息同步给其他客户端(版本递增,不会回退,是强一致,必须要有消息同步,协商导致一定的延迟)要保证所有客户端看到相同的值,需要多节点进行“协商”,达成共识。