1、概述

Zookeeper提供分布式应用协调服务,集群架构如图:
zookeeper集群架构.png

  • Zookeeper中有一个Leader,多个Follower。
  • 集群中只要有半数以上节点存活,Zookeeper就能正常服务,这一点和Kafka集群的区别就是:Zookeeper并不存储大量数据,所以多台机器冗余,成本不是很高,即可以做到分布式系统的可用性。
  • Zookeeper能保证数据一致性,客户端连接到集群中哪一台服务器,数据都是一致的。
  • 数据更新原子性。
  • 在一定的时间范围内,能提供实时性,客户端能读取到最新的数据。

2、数据结构

Zookeeper采用类似文件系统的层级树状结构进行数据的管理,树的节点称为ZNode,每个节点都是唯一的。
zookeeper数据结构.png

Zookeeper的数据存储可以通过客户端ZooInspector来查看,可以通过关注微信公众号ClawHub,回复关键字“zooInspector”获取。

3、应用场景

Zookeeper的应用场景非常的多,包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线监控、软负载均衡、分布式锁等。

3.1、统一命名服务

比如Dubbo可以通过Zookeeper来存储生产者与消费者信息,根据指定名字来获取资源或服务的地址,提供者等信息。
命名服务.png

3.2、统一配置管理

我们的一个系统,因为定制化的东西过多,所以采用自研的配置管理模块,其底层就是采用Zookeeper,架构逻辑图:
统一配置管理.png

Kafka集群中,也是使用Zookeeper作为配置管理使用。

3.3、统一集群管理

在分布式环境中,实时掌握每个节点的状态是必要的,可以根据节点的实时状态做出一定的调整,在Kafka集群中,通过Zookeeper来管理ISR(动态同步副本),当副本节点挂掉时,会通过Zookeeper中存储的ISR来进行选举。
集群管理.png
集群管理-1.png

3.4、服务器节点动态上下线监控

通过Zookeeper的监听机制可以做到服务器节点动态上下线监控:
服务器动态上下线.png

  1. 服务启动时注册信息。
  2. 获取当前在线的服务器列表,并注册监听。
  3. 服务器节点下线。
  4. 服务器节点下线事件通知.
  5. 重新获取在线服务器列表,并注册监听。

3.5、软负载均衡

软负载均衡就比较常见了,比如:

  • Dubbo根据负载均衡算法获取提供者调用服务;
  • Kafka的Producer负载均衡
    对于同一个Topic的不同Partition,Kafak会尽力将这些Partition分配到不同的Broker上;
  • Kafka的Consumer负载均衡
    在消费时,只需指定Topic,Kafka会借助Zookeeper,根据Partition的数量和Consumer的数量做到负载均衡的动态配置。

负载均衡.png

3.6、分布式锁

zookeeper也会用来做分布式锁,也是Zookeeper的一致性文件系统的应用,这部分内容比较多,会单独写一篇。

4、工作机制

通过上述几种Zookeeper的使用情景,已经能看出来Zookeeper的工作机制:充分利用一致性文件树形结构与监听机制。

章节3.4的例子就是一个很好的说明:Zookeeper=文件系统+监听机制。

tencent.jpg