ZooKeeper介绍

出于容错、高性能等方面的需求,很多系统由分布式组件构成。ZooKeeper用来协调分布式系统的各个组件,其提供的功能包括lock,master election,crash detection,group membership management,metadata management等

ZooKeeper基本概念

我们可以把ZooKeeper看成一个分布式文件系统,并具备如下特点:
- 每个节点(znode)既可以有内容,也可以有子节点
- 每个节点的内容不要超过1M,每个节点的子节点数也不要超过1M
- 支持多种模式:Persistent(节点需要手动删除)/ephemeral(连接断掉后,自动删除节点)
- 支持Sequential:插入节点时,只指定节点前缀,ZooKeeper将一个递增的数字追加到文件名里
- 支持Watches and Notifications:在客户端监听节点后,如果节点状态变化,ZooKeeper会向客户端发送一次通知(只发送一次通知,如果想接收多次通知,客户端需要重新监听节点)
- 支持Versions:每个节点都有一个递增的版本号,可防止客户端不小心覆盖数据
- 支持Multiop:一次执行多个操作,加快操作速度
- 支持ACL:可以认证客户端
- 支持Sync:确保客户端能够看到所有Sync之前的操作
- 支持Quotas:限制某个目录占用的字节数

在ZooKeeper基本操作之上,Curator提供一些Recipe(封装好的高层API):
- Leader Latch
- Leader Selector
- Children Cache

ZooKeeper集群的特点:
- 多种角色:leader只能有一个,处理写操作,也可以处理读操作;follower、observer可以有多个,只能处理读操作;observer和follower的区别:observer不参与leader的选举,对事务是否成功没有影响。
- 支持Quorums:如果设定只有在多数实例可用时才能更新数据,Zookeeper可以保证更新后的数据总有效
- 支持Sessions:ZooKeeper在Server端保持Session信息。如果一个ZooKeeper实例崩溃,客户端自动连接到其它的实例,Session信息仍然可用

ZooKeeper客户端操作

在客户端上输入help,即可获取客户端支持的命令,常用命令包括:
- create /path data
- delete /path
- exists /path
- setData /path data
- getData /path
- getChildren /path

ZooKeeper Server端配置

ZooKeeper Server端包括很多配置,这里仅仅列举最基本的配置:
- clientPort:供客户端连接的端口,默认2181
- clientPortAddress:供客户端连接的IP地址,默认为当前主机的所有IP地址
- dataDir:保存snapshot的目录
- tickTime:ZooKeeper测量时间的单位,单位为毫秒
- initLimit:集群配置中,follower初始化连接到leader的时间上限,单位为tickTime
- syncLimit:集群配置中,follower从leader同步数据的时间上限,单位为tickTime

ZooKeeper API

Zookeeper官方提供Java、C的API,其它API包括:
- 第三方Nodejs API

实战问题

使用node-zookeeper的aw_exists观察ZooKeeper节点,回调函数会被多次调用

问题描述:应用程序使用aw_exits观察ZooKeeper节点,其回调函数如下:
- watch_cb: 再次调用aw_exists
- stat_cb: 处理node数据
启动应用程序后,停止ZooKeeper,应用程序检测到连接中断;
启动ZooKeeper,应用程序再次连接上ZooKeeper;
此后节点发生变化,stat_cb会被调用两次

问题原因:每次连接中断/重新连接时,会额外调用watch_cb(对应的type为-1),从而导致多余的aw_exists,最终导致stat_cb被重复调用

node-zookeeper的解释如下:
Any established watches may/will be fired once each when/if your client is expired by the ZK server, the input arguments are observed to be: type=-1, state=1, path=”“. Care should be taken to handle this differently than a “real” watch event if that matters to your application.

问题解决:当type为-1时,watch_cb忽略该事件

在CentOS7上部署ZooKeeper

cloudera有关于部署ZooKeeper的文章,具体参考:安装ZooKeeper包

参考资料

  • ZooKeeper官网
  • ZooKeeper Distributed Process Coordination:By Flavio Junqueira, Benjamin Reed

你可能感兴趣的:(ZooKeeper介绍)