特性
- 类似于Raft系统,zookeeper也有 log 和 状态机的概念,zk中的状态机是一棵内存树。
- zk写的顺序是 先写到日志中保存命令,再运用到内存树中,再返回客户端
- zk的读操作不需要转发到leader,每个Node都可以直接返回本地内存树中的数据
一致性、容错性
zk的读取是弱一致性+最终一致性的,任何Node(Follower、leader、observer)都可以直接处理客户端的Query请求,而不需要去leader那confirm自己的数据是最新的。这种机制提升了读取的性能,但是可能NodeA的数据不是最新的,客户端读取到的数据可能是过时的。
ZK集群的容错性要考虑到observer的情况,因为observer节点并不参与事务请求的confirm和投票选举,所以说observer的宕机并不会影响集群的可用性。所以不能一概而论的说,zk集群半数节点不可用则集群不可用,要看挂掉的节点的角色是不是observer。
ZK集群在新版本中支持配置:readonlymode.enable属性,默认是false,如果开启的话,节点处于异常状态,集群仍然可用,但是只能执行读的请求,不能写。