zookeeper 是一个发布/订阅模式的,分布式数据管理和协调的框架。
-
发布/订阅:基于节点的
发布(creat)
:创建一个新的节点的时候,相当于存储或发布一份数据
订阅(watch)
:基于已经存储的节点上的数据的变化,节点的子节点变化及连接变化(客户端与节点连接)
-
数据管理
zookeeper数据结构为树形结构,根节点为'/'。节点有父子关系,可以用文件路径标识如:/server/game1,表示根节点/下的server节点下的game节点。所有的数据的存储必须基于节点,根节点不存数据。每个节点存储数据最大1M(默认)。 -
协调
观察事件的变化(数据变化、链接状态、节点的个数等)
,当有事件变化时,通知watch观察者。 -
节点
临时节点:基于会话的,创建完节点后,如果会话消失,则该节点消失。应用 如:dubbo的服务注册与发现。
持久化节点:创建节点后如果不主动删除,该节点会一直存在。
ZAB协议(ZooKeeper Atomic Broadcast )
:
- 集群在半数以上节点存活的状态下,可以对外提供服务
(大于半数不包括半数)
- 客户端所有的写请求都交给leader来做,leader确保数据变更同步给follower
- leader宕机或者集群重启的时候,宕机前没有完成的事物操作,在集群重启后会快速恢复到故障之前的状态,即该干嘛赶紧干嘛。
zookeeper集群中有一个leader和多个follower:
- zookeeper 不用自己配置主从关系,集群启动后会自己选举leader,当leader宕机后,集群会重新选择新的leader。
- zookeeper没有主从关系,程序不关心哪台是leader哪台是follower。都可以读写,只是leader干活多点,当follower有写请求时,会转给leader,leader写完后会广播告诉集群其他follower
(弱一致性)
使用:
一般不会使用zookeeper提供的原生的api,可以用封装过的Curator http://curator.apache.org/来开发。
总结
zookeeper主要就做两件事:数据存储 和 事件通知。
网友评论