ddia-第九章-一致性与共识
Last updated: 2020-09-14 16:54:47
Last updated: 2020-06-18 22:43:47
这一章好家伙 读了三个月。
在分布式中,重要的是只有一个领导者,且所有的节点都认同其领导。如果两个节点都认为自己是领导者,这种情况被称为脑裂(split brain),且经常导致数据丢失。正确实现共识有助于避免这种问题。
事务隔离主要是为了,避免由于同时执行事务而导致的竞争状态,而分布式一致性主要关于,面对延迟和故障时,如何协调副本间的状态。
一致性保证
最终一致性:如果你停止向数据库写入数据并等待一段不确定的时间,那么最终所有的读取请求都会返回相同的值。换句话说,不一致性是暂时的,最终会自行解决(假设网络中的任何故障最终都会被修复)。最终一致性也叫收敛(convergence)。
分布式一致性模型和我们之前讨论的事务隔离级别的层次结构有一些相似之处。
事务隔离主要是为了,避免由于同时执行事务而导致的竞争状态。
而分布式一致性主要关于,面对延迟和故障时,如何协调副本间的状态。
线性一致性
线性一致性(linearizability)的最终想法是让一个系统的数据库看上去只有一个副本,而且所有的操作都是原子性的。
如果读取(与写入同时发生时)可能返回旧值或新值,则称该寄存器为常规寄存器。
线性一致性与可序列化
可序列化(Serializability)是事务的隔离属性,每个事务可以读写**多个对象(行,文档,记录)**。它确保事务的行为,与它们按照某种顺序依次执行的结果相同(每个事务在下一个事务开始之前运行完成)。这种执行顺序可以与事务实际执行的顺序不同。
线性一致性(Linearizability)是读取和写入寄存器(单个对象)的新鲜度保证。它不会将操作组合为事务,因此它也不会阻止写偏差等问题。
尽管两者有一部分内容重叠,但它们处理的是无关的问题:事务隔离主要是为了,避免由于同时执行事务而导致的竞争状态,而分布式一致性主要关于,面对延迟和故障时,如何协调副本间的状态。
依赖线性一致性的场景:
1.锁定和领导选举。一个使用单主复制的系统,需要确保领导真的只有一个,而不是几个(脑裂)。一种选择领导者的方法是使用锁:每个节点在启动时尝试获取锁,成功者成为领导者。不管这个锁是如何实现的,它必须是线性一致的:所有节点必须就哪个节点拥有锁达成一致,否则就没用了。
2.约束和唯一性保证:用户名或电子邮件地址必须唯一标识一个用户;账户余额永远不会为负数;不会出售比仓库里的库存更多的物品;两个人不会都预定了航班或剧院里同一时间的同一个位置。
实现线性一致的系统
最简单的方法就是真的只有一个数据副本,但是这种方法无法容错:节点失效导致数据丢失,服务无法访问。
使系统容错最常用的方法是使用复制:
单主复制(可能线性一致):在具有单主复制功能的系统中,主库具有用于写入的数据的主副本,而追随者在其他节点上保留数据的备份副本。如果从主库或同步更新的从库读取数据,它们可能(protential)是线性一致性的iv。然而,并不是每个单主数据库都是实际线性一致性的,无论是通过设计(例如,因为使用快照隔离)还是并发错误。
共识算法(线性一致)
不需要线性一致性的应用对网络问题有更强的容错能力。这种见解通常被称为CAP定理
333