这是我参与「第四届青训营 」笔记创作活动的的第13天。
前序
在传统单体应用下,请求从客户端到服务层,再到数据库,很多时候通过关系型数据库自身的事务机制,保证了数据在读写层面的一致 性(ACID)。 对于分布式系统来说,就需要通过⼀些协议和算法来保证数据的一致性,数据的⼀致性是最基础也是最核心的问题。
什么是一致性:
定义: 一致性,早期也叫agreement,指分布式系统中的多个服务节点,给定一系列操作,在约定协议的保障下,试图使得他们对处理结果达成某种程度的认同。一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否。
一致性要求:
终止性: 一致的结果在有限时间完成,意味着服务可正常使用;
*约同性: *不同节点最终完成决策的结果是相同的;意味着要把多件事情进行排序,而且这个顺序还是大家都认可的;
合法性: 决策的结果必须是某个节点提出的提案。
带约束的一致性:
实现理想的严格一致性代价很大,越强的一致性要求往往会造成越弱的处理性能及越差的可扩展性。一般来说,强—致性包含两类:
- 顺序一致性:保证所有进程看到的全局执行顺序一致,并且每个进程自身的执行顺序跟实际发生顺序一致。只是限制了各进程内指令的偏序关系,但不在进程间按照物理时间进行全局排序。
- 线性一致性:在顺序一致性的前提下加强了进程间的操作排序,形成唯一的全局顺序,是很强的原子性保证,很难实现。大部分系统实现的都是最终一致性(弱一致性),即在某个时刻(而不是立刻),让系统达到一致的状态。
共识算法:
- 一致性往往指分布式系统中多个副本对外呈现的数据的状态。顺序一致性、线性一致性,描述了多个节点对数据状态的维护能力。而共识描述了分布式系统中多个节点之间彼此对某个状态达成一致结果的过程。达成某种共识并不意味着就保障了一致性。 系统满足不同程度的一致性,核心过程需要通过共识算法来达成。共识算法解决的是对某个提案大家达成一致意见的过程。 把出现故障(crash或fail-stop)但不会伪造信息的情况称为“非拜占庭错误”或“故障错误";伪造信息恶意响应的情况称为”拜占庭错误“,对应的节点称为拜占庭节点。
- 系统满足不同程度的一致性,核心过程需要通过共识算法来达成。共识算法解决的是对某个提案大家达成一致意见的过程。
- 把出现故障(crash或fail-stop)但不会伪造信息的情况称为“非拜占庭错误”或“故障错误";伪造信息恶意响应的情况称为”拜占庭错误“,对应的节点称为拜占庭节点。