ZooKeeperer简介

分布式应用程序协调服务

zookeeper


角色

zookeeper-role

领导者(Leader)

投票发起和决议,更新系统状态

学习者(Learner)

跟随者(Follower)

参与选主投票,接收客户请求向客户端返回结果

观察者(ObServer)

zookeeper默认存在Observer角色。

  • 接受客户端连接
  • 转发请求给Leader
  • 不参加投票,只同步Leader状态
  • 用于扩展系统,提高读取速度

客户端(Client)

请求发起方(如YARN和HBase)


会话(Session)

记录client与server连接,client只需连接其中一个server即可获得一致性读写服务。

连接方式

  • 心跳连接
  • watcher监听

数据节点

一致性读写服务所操作的对象就是数据节点。
zookeeper-tree
zookeeper数据模型整体上可看做一棵树,与Unix文件系统类似。每个节点称作一个ZNode,其既可以当成文件又可当成目录。因为ZNode本身可以写数据,并且可以有下一级文件文件/目录。
ZNode可分为持久节点和临时节点。

持久节点

一旦被创建后,除非主动进行ZNode的移除操作,否则此ZNode将一直保存在ZooKeeper上。

临时节点

临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。


事件监听器(Watcher)

该机制是ZooKeeper实现分布式协调服务的重要特性。(分布式通知)

  • 允许用户在指定节点上注册一些watcher。当监听事件触发时,ZooKeeper服务端将事件推送到对这些事件感兴趣的客户端。
  • 注册watcher时会将Watcher对象存储在客户端的WatchManager中。
  • 当ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从WatchManager的实现类中取出对应的Watcher对象来执行回调逻辑。

watcher事件:

  • 客户端和服务端建立连接
  • 客户端和服务端断开连接
  • Session超时
  • 对应的ZNode发生增、删、改任一状态
  • 对应的ZNode子节点发生更改状态

功能

ZooKeeper本身可以实现:服务发布/订阅,命名服务,Master选举,分布式锁
ZooKeeper在Hadoop中的2大功能:选举,元数据存储


配置(zoo.cfg)

部署

集群内实例数量要求为不小于3的奇数个(3,5,7…)

  • 单机单实例:端口不被占用即可
  • 单机伪集群:各个实例间所有端口互相不占用
  • 集群:每台机器一个实例,端口不被占用即可

端口:

  • 2181:clientPort,TCP,对客户端提供服务
  • 3888:选举Leader时使用
  • 2888:集群内通讯使用,Leader监听此接口

基础配置

1
2
3
clientPort=2181
dataDir=/data
dataLogDir=/datalog

dataLogDir如果没提供的话使用的则是dataDir。zookeeper的持久化都存储在这两个目录里。
dataLogDir里放的是顺序日志(WAL)。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。
为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。

可选配置

tickTime:这是个时间单位定量。比如tickTime=1000,这就表示在zookeeper里1 tick表示1000 ms,所有其他用到时间的地方都会用多少tick来表示。如 syncLimit = 2 就表示fowller与leader的心跳时间是2 tick。

maxClientCnxns:对于一个客户端的连接数限制,默认是60,这在大部分时候是足够了。在实际使用中发现,在测试环境经常超过这个数,因为有的团队会将几十个应用全部部署到一台机器上,以方便测试,于是这个数字就超过了。

minSessionTimeout, maxSessionTimeout: 一般,客户端连接zookeeper的时候,都会设置一个session timeout,但是这个时间不是客户端可以无限制设置的,服务器可以设置这两个参数来限制客户端设置的范围。

autopurge.snapRetainCount,autopurge.purgeInterval:客户端在与zookeeper交互过程中会产生非常多的日志,而且zookeeper也会将内存中的数据作为snapshot保存下来,这些数据是不会被自动删除的,这样磁盘中这样的数据就会越来越多。不过可以通过这两个参数来设置,让zookeeper自动删除数据。autopurge.purgeInterval就是设置多少小时清理一次。而autopurge.snapRetainCount是设置保留多少个snapshot,之前的则删除。

不过如果你的集群是一个非常繁忙的集群,然后又碰上这个删除操作,可能会影响zookeeper集群的性能,所以一般会让这个过程在访问低谷的时候进行,但是遗憾的是zookeeper并没有设置在哪个时间点运行的设置,所以有的时候我们会禁用这个自动删除的功能,而在服务器上配置一个cron,然后在凌晨来干这件事。

myid:在dataDir里会放置一个myid文件,里面就一个数字,用来唯一标识这个服务。这个id是很重要的,一定要保证整个集群中唯一。zookeeper会根据这个id来取出server.x上的配置。比如当前id为1,则对应着zoo.cfg里的server.1的配置。


参考资料:

  1. Zookeeper是动物管理员吗
  2. Zookeeper-Zookeeper的配置
如果文章对您有帮助,感谢您的赞助支持!