zk是什么样的一致性呢?强一致还是最终一致性。官方的答案是顺序一致性。顺序一致属于最终一致,但是要不普通的最终一致性要好。是因为Leader一定会保证所有的Proposal同步到follower上都是按照顺序来的,保证了数据顺序不会错乱。
强一致性:只要写入一条数据,无论从那台机器上都可以读到这条数据。这样会导致,你写一条数据,Leader会和全部的Follower都同步完成数据才能让写操作成功返回,效率大大降低。
最终一致性:写入一条数据,Leader写入成功,返回成功。而此时可能Follower还没有同步完数据,部分Follower可能查不到这条数据。但是数据同步完成后,该数据可以被查询。
根据zk的ZAB协议也可以轻松发现,zk实现的不是强一致性。过半Follower对事务proposal返回ack,就会发送commit给所有的Follower,只要follower或者leader进行了commit,这个数据就会被客户端读取到。但是此时,还是有可能部分Follower没有进行数据同步,所以有可能客户端读取数据到这个Follower时还会读取不到数据。过一段时间后。就可以正常读取了。
如果要求必须强一致性。zk提供了sync()方法手动操作就可以保证强一致性了。