知识卡片
法定人数看似严格保证实则存在边缘陷阱及宽松法定人数的取舍
内容
[[无主复制靠读写法定人数在故障中维持可用与新鲜度]]里w+r>n看起来像是一个严格数学 保证,但实践中并不那么可靠。即使满足这个条件,仍可能读到陈旧值的边缘情况包括: 使用宽松法定人数时w个写入和r个读取可能落在完全不同的节点集合上、不再保证有重叠; 两个写入并发发生时谁先谁后本就没有定义,唯一安全的做法是合并、若按时间戳选胜者 (LWW)则可能因时钟偏差丢数据;写操作和读操作并发时新写入可能只反映在部分副本上; 写操作在部分副本成功、部分失败(如磁盘满),此时整体判定失败但已成功的副本没有 回滚,后续读取可能读到这个”失败”写入的值;携带新值的节点后来失败、需要从带旧值的 副本恢复数据时,存有新值的副本数可能跌破w,从而打破法定人数条件本身。这说明Dynamo 风格数据库通常是为能容忍最终一致性的场景优化的,法定人数调的是”读到陈旧值的概率”, 不能当成绝对保证。宽松法定人数(sloppy quorum)是权衡可用性的一种延伸:网络中断 可能让客户端连不上原本指定的n个”主”节点里的足够多个,此时与其对所有这类请求返回 错误,不如把写入接受到当前可达的任意节点上(哪怕它们不属于这个键通常存放的n个 节点),等网络恢复后再通过提示移交把这些写入转发给正确的节点——像临时寄放在邻居 家沙发上,等自己家的钥匙找回来再搬走。这大幅提高了写入可用性,但代价是即使w+r>n 也不再能保证读到最新值,因为最新写入可能暂时存在n之外的节点上,读取还没等到提示 移交完成。
参考来源
- 位置:《数据密集型应用系统设计》第五章《复制》"法定人数一致性的局限性""宽松的
法定人数与提示移交"(源文件:_epub-src/ch5_split_004.html)
- 结论依据:原文列出即使w+r>n仍可能读到陈旧值的多种边缘情况(宽松法定人数节点
不重叠/并发写入/写读并发/部分成功写入未回滚/副本数跌破w),并说明宽松法定人数
以牺牲"读到最新值"的保证换取更高的写入可用性、靠提示移交事后修正,直接支撑
本卡片结论。
- 原始内容:即使在w+r>n的情况下,也可能存在返回陈旧值的边缘情况……因此,尽管
法定人数似乎保证读取返回最新的写入值,但在实践中并不那么简单……宽松的法定
人数……写和读仍然需要w和r成功的响应,但这些响应可能来自不在指定的n个"主"
节点中的其它节点……一旦网络中断得到解决……这就是所谓的提示移交。