01 | 拜占庭将军问题:有叛徒的情况下,如何才能达成共识?
解决办法一:口信消息型拜占庭问题之解
如果叛将人数为 m,将军人数不能少于 3m + 1 ,需要进行m+1轮作战信息协商,那么占庭将军问题就能解决了。这个算法有个前提,叛徒数量是已知的。
解决办法二:签名消息型拜占庭问题之解
在不增加将军数量的情况下,某个将军发送的作战信息一旦被修改就能被发现,从而执行另一个将军的作战计划
强调:拜占庭将军问题描述的是最困难的,也是最复杂的一种分布式故障场景,除了存在故障行为,还存在恶意行为的一个场景。
在存在恶意节点行为的场景中(比如在数字货币的区块链技术中),必须使用拜占庭容错算法(Byzantine FaultTolerance,BFT)。除了故事中提到两种算法,常用的拜占庭容错算法还有:PBFT 算法,PoW 算法,而在计算机分布式系统中,最常用的是非拜占庭容错算法,即故障容错算法(Crash FaultTolerance,CFT)。
CFT 解决的是分布式的系统中存在故障,但不存在恶意节点的场景下的共识问题。
也就是说,这个场景可能会丢失消息,或者有消息重复,但不存在错误消息,或者伪造消息的情况。常见的算法有 Paxos 算法、Raft 算法、ZAB 协议
02 | CAP理论:分布式系统的PH试纸,用它来测酸碱度
一致性(Consistency):不管你访问哪个节点,要么我给你返回的都是绝对一致的数据,要么你都读取失败。
一致性强调的不是数据完整,而是各节点间的数据一致。
可用性(Availability):我尽力给你返回数据,不会不响应你,但是我不保证每个节点给你的数据都是最新的。
这个指标强调的是服务可用,但不保证数据的一致。
分区容错性(Partition Tolerance):不管我的内部出现什么样的数据同步问题,我会一直运行,提供服务。
这个指标,强调的是集群对分区故障的容错能力。
”CAP 不可能三角“怎么理解?
CAP 不可能三角说的是对于一个分布式系统而言,一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)3 个指标不可兼得,只能在 3 个指标中选择 2 个。
总结:
CA 模型,在分布式系统中不存在。因为舍弃 P,意味着舍弃分布式系统,就比如单机版关系型数据库 MySQL,如果 MySQL 要考虑主备或集群部署时,它必须考虑 P。
CP 模型,采用 CP 模型的分布式系统,一旦因为消息丢失、延迟过高发生了网络分区,就影响用户的体验和业务的可用性。因为为了防止数据不一致