


分布:这个就是多台计算机都被放置在了不同的位置
对等:集群中的多个工作节点都是一个货色,干的都一样的活儿。而且存在副本概念
并发:多个机器同时操作一份数据可能会引发的数据不一致问题
全局时钟:多个主机上的事件先后顺序会对结果产生影响,这也是分布式场景中非常复杂的一个问题
各种故障:某节点宕机,网络不好……突发情况
通信异常:其实就是网络问题,导致多节点状态下数据不一致
网络孤立:这个其实就是各个子网络内部正常,但是整个系统的网络是不正常的。导致局部数据不一致的问题
节点宕机问题
分布式三态:成功,失败,超时这3种状态引出的各个问题。请求发送和结果响应都有可能丢失,无法确定消息是否发送/处理成功
数据丢失:这个一般通过副本机制,从其它节点读取解决,或者对于有状态的节点来说丢失数据就可以通过恢复状态来解决。
性能:主要就是吞吐能力,响应延迟,并发能力。系统某一时间可以处理的数据总量,通常是用系统每秒处理的总数据量衡量,而响应延迟指的是完成某一功能所需要的的时间。并发能力就是同时完成某一功能的能力,通常就是用 QPS 衡量
可用性:在面对各种异常时可以正确提供服务的能力。比如我们常说的 5 个 9 就是指一年内只有 5 分钟的宕机时间。6 个 9 就是 31 秒
可扩展性:指可以通过扩大机器规模达到提高系统性能的效果
一致性:副本管理
强一致性:写操作完成之后,读操作一定能读到最新数据,在分布式场景中这样是非常难实现的,比如 Paxos 算法,Quorum 机制,ZAB 协议都是干这个事的。
弱一致性:不承诺可以立即读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能的保证到某个时间级别(比如 XX 时,XX 分,XX 秒后),数据可达到一致性状态。















所有事务转发给 Leader(当我们的 Follower 接收到事务请求)
Leader 分配全局单调递增事务 id(zxid,也就是类似于 Paxos 算法的编号 n),广播协议提议
Follower 处理提议,作出反馈(也就是承诺只接受比现在的 n 编号大的)
Leader 收到过半数的反馈,广播 commit,把数据彻底持久化(和 2PC 不同的是,2PC 是要等待所有小弟反馈同意)
Leader 对原来转发事务的 Followe 进行响应,Followe也顺带把响应返回给客户端

N:复制的节点数,即一份数据被保存的副本数。
W:写操作成功的节点数,即每次数据写入写成功的副本数。W 肯定是小于等于 N 的。
R:读操作获取最新版本数据所需的最小节点数,即每次读取成功至少需要读取的副本数。

C:Consistency,强一致性,分布式环境中多个数据副本保持一致
A:Availability,高可用性,系统提供的服务必须一直处于可用,对于用户的每一个操作请求总是能在有限时间内返回结果
P:Partition Tolerance 分区容错性,分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务
放弃 P:最简单的极端做法,就是放置在一个节点上,也就只有一个数据副本,所有读写操作就集中在一台服务器上,有单点故障问题。放弃 P 也就意味着放弃了系统的可扩展性,所以分布式系统一般来说,都会保证 P。
放弃 A:一旦系统遇到网络分区或者其他故障时,服务需要等待一段时间,在等待时间内就无法正常对外提供服务,即服务不可用。
放弃 C:事实上,放弃一致性是指放弃数据的强一致性,而保留最终一致性,具体多久达到数据同步取决于存储系统的设计。

不要花费精力浪费在设计同时满足 CAP 的分布式系统
分区容错性往往是分布式系统必然要面对和解决的问题。所以应该把精力放在如何根据业务特点在 A 和 C 之间寻求平衡
对于单机软件,因为不用考虑 P,所以肯定是 CA 型,比如 MySQL
对于分布式软件,因为一定会考虑 P,所以又不能兼顾 A 和 C 的情况下,只能在 A 和 C 做权衡,比如 HBase,Redis 等。做到服务基本可用,并且数据最终一致即可。







