谈一谈你对zookeeper 的理解(大数据面试题系列~~)
Apache Zookeeper 是由Apache Hadoop 的子项目发展而来,之后正式成为了Apache 的顶级项目。
Zookeeper 是一个典型的分布式数据一致性的解决方案,它 为分布式应用提供了高效可靠的分布式协调服务,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调与通知、集群管理、Master 选举、分布式锁等功能。
Zookeeper 几个基本概念
集群角色
Zookeeper 没有沿用传统的Master/Slave 概念,而是引入了Leader、Follower和Observer 三种角色。Zookeeper 集群中的所有机器通过一个Leader 选举过程来选定一台被称为“leader”的机器,Leader 服务器为客户端提供读写服务。Follower 和Observer 都能提供读服务,唯一的区别在于,Observer 机器不参与Leader 选举过程,也不参与写操作的“过半写成功”策略,因此Observer 可以在不影响写性能的情况下提升集群的读性能。
会话
在Zokeeper 中, 一个客户端连接是指客户端和服务器之间的一个TCP 长连接。客户端启动的时候,首先会先与服务器建立一个TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了。通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能向Zookeeper 服务器发送请求并接受响应,同时还能通过该连接接受来自于服务器的Watcher 事件通知。
数据节点Znode
Znode 是Zookeeper 数据模型中的数据单元。Zookeeper 将所有数据存储在内存中,数据模型是一棵树,路径由/ 进行分割, 例如/home/path1。每个Znode 上都会保存自己的数据内容,同时还会保存一系列属性信息。
在Zookeeper 中,Znode 分为持久节点和临时节点两类。所谓持久节点是指一旦这个Znode 被创建了,这个Znode 将一直保存在Zookeeper 上,除非进行主动删除操作。临时节点的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个临时节点就会被移除。另外Zookeeper 还允许用户为每个节点添加自增的属性,就是节点名后面会追加上一个自增的整型数字。
Watcher 事件监听器
Zookeeper 允许用户在指定节点上注册一些Watcher, 并且在一些特定事件触发的时候,Zookeeper 服务器会通知到特定的客户端。
几个典型应用场景
Master 选举
Master 选举是分布式系统中非常常见的应用场景。下图为一个最简实现:
如上图,三个节点1,2,3竞选master, 三个节点同时在/master 路径下创建临时节点node, 但zookeeper 只会保证一个客户端创建成功。创建成功的节点即为master,创建失败的节点则需注册一个对/master/node 路径的变更监听。一旦master 节点宕机了,则此临时节点也会被删除,其它节点就会收到消息重新开始竞选master。
实现分布式锁
用作微服务的注册中心
下图只是介绍最简的实现:
-
服务注册发布
例如客户端host1 在port1 想要发布注册UserService 服务,则它需要在/services/com.demo.UserServie 路径下创建临时节点,临时节点值为服务地址host1:port1。服务宕机,临时节点自动关闭。 -
服务调用
例如有消费端想要调用UserService 服务,它只需获取/services/com.demo.UserService 下的所有节点,然后按照一定规则选取一个服务发布方即可远程调用其服务。