项目中用dubbo的时候一般会选用zookeeper做为注册中心,那么什么是zookeeper呢?又能做什么呢?
架构
Zookeeper在官方架构图中就是集群,Zookeeper建议集群部署,另外因为Zookeeper是过半策略,就是说有一半以上节点存活才可以正常工作,也就是说,3台机器只能挂一台,4台也只能挂一台,就没有必要多增加那一台了。
什么是zookeeper
zookeeper是一个分布式协调框架,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等
zookeeper对外暴露简单的API,用于支持分布式应用开发
zookeeper的特点
顺序一致性:从同一客户端发起的事务请求,最终将严格按照顺序被应用到Zookeeper中去。
原子性:所有事务请求的处理结果在整个集群中所有机器的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某个事务,要么都没有应用
单一系统映像:无论客户端连接到哪个Zookeeper服务器上,其看到的服务端数据模型都是一致的。
可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
zookeeper的数据模型
zookeeper数据模型采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以使数字、字符串或者二进制序列,并且,每个节点还可以拥有N个子节点,最上层是根节点以“/”来代表,每个数据节点在Zookeeper中被称为znode,它是Zookeeper中数据的最小单元,并且每个znode都有一个唯一的路径标识。
一共有4中znode
- 持久节点(PERSISTENT):一旦创建就一直存在即使Zookeeper集群宕机,知道将其删除
- 临时节点(EPHEMERAL):临时节点的生命周期是客户端会话绑定的,会话消失则节点消失,并且临时节点只能做叶子节点,不能创建子节点
- 持久顺序节点(PERSIST比如 /node1/app0000000001 、/node1/app0000000002ENT_SEQUENTIAL):出了具有持久节点的特性外还具有顺序性
- 临时顺序(EPHEMERAL_SEQUENTIAL)节点:出了具备临时(EPHEMERAL)节点的特性之外,子节点的名称还具有顺序性
ACL权限控制
ZooKeeper 采用 ACL(AccessControlLists)策略来进行权限控制,类似于 UNIX 文件系统的权限控制。
对于znode节点操作的权限,Zookeeper提供了以下5种:
- CREATE:能创建子节点
- READ:能获取节点数据和列出其子节点
- WRITE:能设置/更新节点数据
- DELETE:能删除子节点
- ADMIN:能设置节点ACL得到权限
Watcher(事件监听器)
Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
ZAB协议
ZAB(ZooKeeper Atomic Broadcast 原子广播) 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议。 在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性
两种基本模式
崩溃恢复
当整个服务框架在启动的过程中或者当Leader服务器出现网络中断,崩溃退出与重启等异常情况时,ZAB协议就会进入恢复模式并选举产生新的Leader服务器,当选举产生了新的Leader服务器,同时集群中有过半的机器与该Leader服务器完成状态同步之后,ZAB协议就会推出恢复模式,其中所谓的状态同步是指数据同步,用来保证急群众存在过半的机器能够和Leader服务器的数据状态保持一致
消息广播
当集群中已经有一般的Follower服务器完成了和Leader服务器的状态同步,那么整个服务框架就可以进入消息广播模式了,当一台同样遵守ZAB协议的服务器启动后加入到集群中时,如果此时集群中已经存在一个Leader服务器在负责进行消息广播,那么新加入的服务器就会自觉进入数据恢复模式,找到Leader所在服务器,并与其进行数据同步,然后一起参与到消息广播的流程中去