分布式系统
最后更新于
分布式系统是一系列独立节点的集合,它们对外表现为一致的系统状态。
拜占庭将军问题是由莱斯利·兰波特在其同名论文中提出的分布式对等网络通信容错问题。
在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策略行动。但有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论[2],从而破坏系统一致性[3]。拜占庭将军问题被认为是容错性问题中最难的问题类型之一。
一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。
拜占庭将军问题论文英文版, or 这里
从拜占庭将军问题到 PBFT [Todo]
CAP 适用的场景:CAP 适用于互连且共享数据的分布式系统中,并且对数据做读写操作。比如 Memchache 可以作为集群存在,但是它并不是 CAP 讨论的范围,因为它的数据节点之间不互连也不共享数据;但是如 MySQL、Redis、Mongodb 就是 CAP 讨论的范围,因为它们有主从复制,需要数据同步;此外,CAP 讨论的是对数据的读写,比如 Zookeeper 的选主就不是 CAP 要考虑的。
A Critique of the CAP Theorem - https://arxiv.org/pdf/1509.05393.pdf
BASE: 一种 ACID 的替代方案,也可以理解为它是分布式事务的一种替代方案,不是所有场景都需要保障强事务性的 (在对数据库进行分区后, 为了可用性(Availability)牺牲部分一致性(Consistency)可以显著地提升系统的可伸缩性 (Scalability))
分布式一致性(distributed consensus) 是分布式系统中最基本的问题, 用来保证一个分布式系统的可靠性以及容灾能力。简单的来讲,就是如何在多个机器间对某一个值达成一致, 并且当达成一致之后,无论之后这些机器间发生怎样的故障,这个值能保持不变。
抽象定义上, 一个分布式系统里的所有进程要确定一个值v,如果这个系统满足如下几个性质, 就可以认为它解决了分布式一致性问题, 分别是:
Termination: 所有正常的进程都会决定v具体的值,不会出现一直在循环的进程。
Validity: 任何正常的进程确定的值v', 那么v'肯定是某个进程提交的。比如随机数生成器就不满足这个性质.
Agreement: 所有正常的进程选择的值都是一样的。
构建数据密集型应用:一致性与共识
Raft 的 Website: https://raft.github.io/
raft 的实现
DLedger: A raft-based java library for building high-available, high-durable, strong-consistent commitlog, which could act as the persistent layer for distributed storage system, i.e. messaging, streaming, kv, db, etc.
蚂蚁金服的 Raft 实现:sofa-jraft, 以及 sofa-jraft 的介绍
ZAB 协议
漫谈分布式系统、拜占庭将军问题和区块链 [Todo]