zookepper 对一致性的保障
从官网中可以看出,zookepper 并非一些文章说的是强一致性(strong consistency guarantees)。
官方对其的描述是:介于顺序一致性和线性一致性之间。然后zookepper 官网从写操作(Write operations)和读操作(Read operations)两个方面来解释它的一致性设计。
写操作
写操作是线性一致性(linearizable)的,zookepper保证所有的客户端都的写操作都是实时有序的。
读操作
读操作不是线性一致性的,所以zk可能返回过时的数据,这是因为zk更关注read的性能,希望read操作能够快速响应。zk的读操作是顺序一致性的,读操作会以一定的顺序执行,这个顺序和读操作所在的客户端(client)的操作顺序相关
简单解释下顺序一致性和线性一致性
因为理解的不是很深,所以我将自己收集资料后,整理归纳一下:
- 线性一致性:或称原子一致性或严格一致性,也是我们熟知的强一致性。线性操作具有原子性,线性操作保证在多CPU(可以理解为分布式环境)下,线性操作是有序的、前一个操作的结果能被后一个看到
- 顺序一致性:也是我们所说的最终一致性。相对于线性一致性需要保证不同CPU(分布式环境)下操作的一致性,顺序一致性保证的是单CPU(可以理解为单机)操作的一致性,也就是单CPU(单机)下你的操作是有序,并且前一个操作的结果能被后一个看到。
总结
可以看出,zk官网并没有直接表述zk是强一致性,或者最终一致性,我们分析之后可以看出,zk对读写的一致性做了不同的设计,需要区分说明。
参考资料: