「读书」数据密集型应用 Day 16

138 阅读2分钟

一致性保证

线性一致性

这就是线性⼀致性(linearizability)背后的想法(也称为原⼦⼀致性(atomic consistency),强⼀致性(strong consistency),⽴即⼀致性(immediate consistency)或外部⼀致性(external consistency )。线性⼀致性的精确定义相当微妙,我们将在本节的剩余部分探讨它。但是基本的想法是让⼀个系统看起来好像只有⼀个数据副本,⽽且所有的操作都是原⼦性的。有了这个保证,即使实际中可能有多个副本,应⽤也不需要担⼼它们。

什么使得系统线性一致

依赖线性一致性

锁定和领导选举

⼀个使⽤单主复制的系统,需要确保领导真的只有⼀个,⽽不是⼏个(脑裂)。⼀种选择领导者的⽅法是使⽤锁:每个节点在启动时尝试获取锁,成功者成为领导者【14】。不管这个锁是如何实现的,它必须是线性⼀致的:所有节点必须就哪个节点拥有锁达成⼀致,否则就没⽤了。

约束和唯一性保证

唯⼀性约束在数据库中很常⻅:例如,⽤户名或电⼦邮件地址必须唯⼀标识⼀个⽤户,⽽在⽂件存储服务中,不能有两个具有相同路径和⽂件名的⽂件。如果要在写⼊数据时强制执⾏此约束(例如,如果两个⼈试图同时创建⼀个具有相同名称的⽤户或⽂件,其中⼀个将返回⼀个错误),则需要线性⼀致性。

跨信道的时序依赖

线性⼀致性并不是避免这种竞争条件的唯⼀⽅法,但它是最容易理解的。如果你可以控制额外信道(例如消息队列的例⼦,⽽不是在Alice和Bob的例⼦),则可以使⽤在“读⼰之写”讨论过的备选⽅法,不过会有额外的复杂度代价。

实现线性一致的系统

由于线性⼀致性本质上意味着“表现得好像只有⼀个数据副本,⽽且所有的操作都是原⼦的”,所以最简单的答案就是,真的只⽤⼀个数据副本。但是这种⽅法⽆法容错:如果持有该副本的节点失效,数据将会丢失,或者⾄少⽆法访问,直到节点重新启动。

线性一致性和法定人数

线性一致性的代价

如果客户端可以直接连接到主库所在的数据中⼼,这就不是问题了,哪些应⽤可以继续正常⼯作。但直到⽹络链接修复之前,只能访问从库数据中⼼的客户端会中断运⾏。

CAP 定理

线性一致性和网络延迟