zookeeper 简介

前言

zookeeper是java语言编写,由apache开源的一款分布式协调服务,用于协调各业务系统有条不絮的提供服务,当然zookeeper本身也支持分布式的,提供稳定可靠的服务。例如:阿里开源的RPC框架dubbo采用zookeeper实现服务自动发现和治理,百度开源的配置管理系统disconf使用zookeeper实现全局配置管理,我们也可以使用zookeeper实现业务上的分布式锁等效果。

工作原理

zk集群架构图

首先介绍一下zk集群中服务器的存在类型有三类:

1. leader服务器节点 -主要负责数据的读写和分发
2. follower服务器节点 -分摊读压力并参与leader选举
3. observer服务器节点 -分摊读压力但不参与leader选举

zk集群中服务器的四种状态:

1. QuorumPeer.ServerState.LOOKING -该状态下zk集群处于选举状态下,无法对外提供服务
2. QuorumPeer.ServerState.FOLLOWING -follower服务器
3. QuorumPeer.ServerState.LEADING -leader服务器
4. QuorumPeer.ServerState.OBSERVING -observer服务器

ps: 之所以要引入observer服务器类型,主要是为了提升整个zk集群的读性能,但又不会增大zk集群选举leader的延迟时间。

zk服务器下数据是以树状结构组织的,类似UNIX/Linux中的文件系统,文件节点的类型有四种:

1. EPHEMERAL -临时节点
2. EPHEMERAL_SEQUENTIAL -临时有序节点
3. PERSISTENT -持久节点
4. PERSISTENT_SEQUENTIAL -持久有序节点

ps: 临时节点可以包含数据但不能包含子节点,当client与zk集群会话失效或断开连接时,该临时节点会被自动删除;持久节点是可以包含数据和子节点的。我们可以监听节点,当该节点下子节点个数发生变化或数据发生变化,就会触发应用服务器注册监听的Watch事件进行回调,从而让应用服务器感知这一变化,达到应用服务器之间协同的效果。

使用场景

1. 名称服务 -阿里开源的dubbo实现服务治理的功能
2. 配置管理 -百度开源的disconf实现配置变更主动通知各应用服务器
3. 分布式锁
4. 分布式队列
......

总结

问题一:zk是如何解决各节点数据一致性问题的?

zk集群采用单点写入来保证数据一致性的,任何写请求都会被交由leader去完成写操作,然后同步至各follower和observer节点。当收到同步至follower和observer节点一半以上成功后,就返回给客户端数据写入成功。

问题二:zk是如何解决高可用问题的?

zk集群中有一套选举算法,当集群中的leader中心节点宕机后,集群中的follower节点会自动选举出一个新的leader出来,从而达到去中心化的目的,保证分布式协调服务的高可用。

参考链接

  1. http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
  2. http://www.cnblogs.com/yuyijq/p/4116365.html
  3. http://www.cnblogs.com/yuyijq/p/3424473.html