Skip to content

Latest commit

 

History

History
42 lines (12 loc) · 1.97 KB

129.md

File metadata and controls

42 lines (12 loc) · 1.97 KB

129、停一下脚步:ZooKeeper到底是强一致性还是最终一致性?

强一致性:只要写入一条数据,立马无论从zk哪台机器上都可以立马读到这条数据,强一致性,你的写入操作卡住,直到leader和全部follower都进行了commit之后,才能让写入操作返回,认为写入成功了

此时只要写入成功,无论你从哪个zk机器查询,都是能查到的,强一致性

明显,ZAB协议机制,zk一定不是强一致性

最终一致性:写入一条数据,方法返回,告诉你写入成功了,此时有可能你立马去其他zk机器上查是查不到的,短暂时间是不一致的,但是过一会儿,最终一定会让其他机器同步这条数据,最终一定是可以查到的

研究了ZooKeeper的ZAB协议之后,你会发现,其实过半follower对事务proposal返回ack,就会发送commit给所有follower了,只要follower或者leader进行了commit,这个数据就会被客户端读取到了

那么有没有可能,此时有的follower已经commit了,但是有的follower还没有commit?绝对会的,所以有可能其实某个客户端连接到follower01,可以读取到刚commit的数据,但是有的客户端连接到follower02在这个时间还没法读取到

所以zk不是强一致的,不是说leader必须保证一条数据被全部follower都commit了才会让你读取到数据,而是过程中可能你会在不同的follower上读取到不一致的数据,但是最终一定会全部commit后一致,让你读到一致的数据的

zk官方给自己的定义:顺序一致性

因此zk是最终一致性的,但是其实他比最终一致性更好一点,出去要说是顺序一致性的,因为leader一定会保证所有的proposal同步到follower上都是按照顺序来走的,起码顺序不会乱

但是全部follower的数据一致确实是最终才能实现一致的

如果要求强一致性,可以手动调用zk的sync()操作