高效的分布式协调服务,实现达成共识/集群管理/leader选举等。简单来说zookeeper=文件系统+监听通知机制
两个小时手写了个Zookeeper分布式服务注册中心
基于ZAB(原子消息广播协议)算法的实现,能够很好地保证分布式环境中的数据一致性。


  1. 数序一致性:从一个客户端发起的事务请求,最终将会严格地按照其发起的顺序被应用到zookeeper中去。
  2. 原子性:所有的事务请求处理结果在整个集群中所有机器上的应用情况是一致的,即一定不会出现部分机器应用了该事务,而另一部分没有应用的情况。
  3. 单一视图:无论客户端连接的是哪一个zookeeper服务器,其看到的服务器端数据模型都是一致的。
  4. 可靠性:一旦服务器成功地应用了一个事务,并完成了对客户端的响应,那么该事务所引起的服务端状态会被一致保留下来,除非有另外一个事务对其更改。
  5. 实时性:一旦事务被成功应用,那么客户端就能立刻从服务器上获取变更后的新数据,zookeeper仅仅能保证在一段时间内,客户端最终一定能从服务器端读取最新的数据状态。
    图片说明

Zookeeper组成

  • Leader:负责客户端的writer类型请求
  • Follower:负责客户端的reader类型请求,参与leader选举等
  • Observer:特殊的‘Follower’,其可以接受客户端reader请求,但不参与选举。(扩容系统支撑能力,提高了读取速度,因为它不接受任何同步的写入请求,只负责与leader同步数据)

应用场景:

从设计模式角度来看,zookeeper是一个基于观察者模式的分布式服务管理框架。负责存储和管理数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,zookeeper将负责通知已经在框架中注册的观察者做出相应的反应,从而实现显示集群中的Master/Slave。
假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
两个小时手写了个Zookeeper分布式服务注册中心
  • 配置管理(数据量小,运行时内容动态变化,各个节点共享配置一致)
  • 集群管理
  • 发布与订阅
  • 数据库切换
  • 分布式日志的收集
  • 分布式锁、队列管理等等

搭建zookeeper集群:

  1. 三台服务器为节点,分别解压zookeeper包,并修改环境变量、刷新。
  2. 修改conf:vi zoo.cfg   dataDir=/usr/local/zookeeper/data     最后添加:server.0=bhz:2888:3888  server.1=hadoop1:2888:3888  server.2=hadoop2:2888:3888
  3. 服务器标识配置:创建文件夹 mkdir data   创建文件myid并填写内容为0
  4. 将创建好的myid分别拷贝到其他两个节点上,并修改为1,2
  5. 启动三个节点的zookeeper:zkServer.sh start   查看状态:zkServer.sh.status
通过zkCli.sh客户端进行zookeeper的操作:
  • 查找:ls/   ls /zookeeper
  • 创建并赋值:create /bhz hadoop
  • 获取:get /bhz
  • 设值:set /bhz bxx
  • 以上可以看到zookeeper集群的一致性
  • rmr /path 递归删除节点
  • delete /path/child  删除指定某个节点
  • 创建节点的两种类型:短暂ephemeral   持久persistent
通过工具zookeeper-dev(通过 java -jar xxxx  启动)
eclipse中插件工具

Java操作zookeeper


Java提供了两套创建节点的方式:

同步创建方式:

1、PERSISTENT-持久化目录节点

     客户端与zookeeper断开连接后,该节点依旧存在

2、 PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

       客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

3、EPHEMERAL-临时目录节点

      客户端与zookeeper断开连接后,该节点被删除

4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

     客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号





异步创建方式:

curator框架


创建工厂
CuratorFrameworkFactory.builder().connecString().sessionTimooutMs.....链式编程
开启连接:start()
创建节点/删除节点……等操作。

监听:

注册一个监听缓存,然后实现对应的监听方法。
NodeCacheListener监听节点的新增,修改操作
PathChiladrenCacheListener:监听子结点的新增,修改,删除操作。