如果W+R<=N,则是弱一致性。例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则如果读的是备库,就可能无法读取主库已经更新过的数据,所以是弱一致性。
如果N=W,R=1,任何一个写节点失效,都会导致写失败,因此可用性会降低,但是由于数据分布的N个节点是同步写入的,因此可以保证强一致性。这种情况我们优化了读操作。
如果N=R,W=1,只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。这种情况我们优化了写操作。
如果W<(N+1)/2,并且写入的节点不重叠的话,则会存在写冲突。
对于分布式系统,为了保证高可用性,一般设置N>=3。不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。
BASE(Basically Available, Soft-state, Eventually consistent)是一种架构方法,大部分互联网应用场景可以考虑采用。它倡导的就是一种平衡和折中,设计时结合应用服务的自身特点合理选型。没有正确的架构,只有适合你的架构。
注1:我们一定要跳出数据库的思维方式。尤其是通过数据库建模,做ORM,再写应用逻辑的习惯,这严重使系统固化到底层数据存储的细节上面,禁锢系统今后的扩展,得不偿失。我也是在看了Bob大叔的《敏捷软件开发:原则、模式与实践》后深有体会。
注2:可用性和一致性的折中也不一定选择可用性。对于某些关键业务数据,一致性更重要。在数据存在未同步,不一致问题时,中断服务也是有的。早期的 数据库设计就是这样。