1、客户端的读一致保证:
zookeeper 的读写一致不是在 server 做的,而是 server & client 配合的;client 会记录它见过的最大的 zxid (在你的场景下,就是这条写入 的 zkid),读取的时候,如果 server 发现 这条 zxid 比 server 端的最大 zxid 大,则拒绝,client 会自动重连到其他server(还在同一个 session) —— 最终会落到有新数据的 server 上,因为半数已经同意;
例如:如果client先从当前连接的server1读取到了最新的数据,然后断开当前server1连接到另一台server2,此时server2同样可能是旧数据,这也是通过client记录最大zxid,来解决读取到的值回退的问题,会断开,连server3.. 直到连到zxid更大的服务器。
2、sync后再读也不能保证读到新的. 因为sync之前如果刚好发生了选举,自己又连到老的leader上,老的leader还没有过期, 而sync目前又不要求quorum, 这种情况老leader就可能漏掉其他节点(新leader所在集群的)在sync之前发出的写请求. 不过ZK正在修复这点,会把sync改成要求quorum的