Skip to content

Latest commit

 

History

History
25 lines (14 loc) · 2.09 KB

ddia_9.md

File metadata and controls

25 lines (14 loc) · 2.09 KB

一致性与共识

线性一致性(Linearizability),也叫做可线性化,指的是程序在执行的历史中在存在可线性化点P的执行模型,这意味着一个操作将在程序的调用和返回之间的某个点P起作用。

可线性化与可串行化化

  • 可串行化指的是数据库中的事务隔离级别,每个事务可以执行多条读写命令,它用来确保事务执行的结果与串行执行的结果完全相同,即使串行执行的顺序与事务实际执行的顺序不同。
  • 可线性化是读写寄存器(指单个对象)的最新值保证,它并不要求将操作组合到事务中,因此可能存着写倾斜。

线性化与quorum

  • 严格quorum,即在保证了w + r > n的情况下,可以实现读写线性化,即先完成的写操作一定能够对后开始的读操作可见,后开始的写操作一定对先完成的读操作不可见。但是无法实现完整的线性化,即存在不可重复读的场景。此外多写入并发的情况下,无法保证所有的副本的写入顺序一致,因此也就不能实现线性化的CAS操作。
  • quorum可以以牺牲性能为代价来满足线性化,即在读操作返回结果给客户端前,同步执行读修复,保证之后的读取一定能读到相同的结果。写操作在客户端发送结果前,必须进行quorum读取以获取最新值。但是这种办法仍然无法实现CAS。
  • redlock在redis的基础上,通过quorum来实现了和zookeeper功能类似的分布式锁服务,见redis分布式锁

CAP理论

分布式系统无法同时满足“一致性,可用性,分区容错性”, 在存在网络分区的情况下,一致性与可用性不可兼得

  • 如果应用要求线性化,但由于网络方面的问题,某些副本与其他副本断开连接,那么应用此时必须等待网络修复,或者返回错误。无论哪种方式,结果是服务不可用。
  • 如果应用不要求线性化,那么有副本失效后,每个副本可独立处理请求例如写操作(多主复制)。

全序广播