zookeeper简介

zookeeper简介

zookeeper主要是一个分布式服务协调框架,实现同步服务,配置维护和命名服务等分布式应用。是一个高性能的分布式数据一致性解决方案。
zookeeper是一个高可用的分布式管理与协调框架,给予ZAB算法(原子消息广播协议)的实现。该框架能很好的保证分布式环境中数据的一致性。也正是由于这样的特性,使得zookeeper成为了解决分布式一致性问题的利器。
顺序一致性 从客户端发起的事物请求,最终将严格按照其发起的顺序被应用的zookeeper中去

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

zookeeper设计目标

  • 目标1:简单的数据结构。zookeeper就是以简单的属性结构来进行相互协调的(也叫树形名字空间)
  • 目标2:可以构建集群。一般zookeeper集群通常由一组机器构成,一般3–5台机器就可以组成一个zookeeper集群了。只要集群中超过半数以上的机器能正常工作,那么整个集群就能够对外提供服务。
  • 目标3:顺序访问。对于每一个客户端的每一个请求,zookeeper都会分配一个全局唯一的递增编号,这个编号反应了所有事物操作的新后顺序,应用程序可以使用zookeeper的这个特性来实现更高层次的同步。
  • 目标4:高性能。由于zookeeper将全量数据存储在内存中,并且直接服务于所有的非事物请求,因此尤其在读操作为主的场景下性能非常突出,在JMater压力测试下(100%度请求场景下),其结果大约在12-13W的QPS。

zookeeper的结构

zookeeper树形结构

zookeeper的结构

  • ZooKeeper目录树中每一个节点对应一个Znode,这个znode是被他所在路径的唯一标识。
  • Znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL类型的额目录节点不能有子节点目录
  • Znode是有版本的,每个Znode中存储的数据可以有很多歌版本,也就是一个访问路径中可以存储多份数据
  • znode的目录名可以可以自动编号,如App1已经存在,再创建的话,将会自动命名位App2
  • znode可以被监控:包括这个目录节点中存储的数据的修改,子节点目录的变化,一旦变化可以通知监控的客户端,这个是zookeeper的核心特性,Zookeeper的很多功能都是基于这个特性实现的。

Zookeeper组成

ZK server根据其身份特性分为三种: leader,Follower Obderver,其中Follower和Observer又统称为Learner(学习者)
Leader:负责客户端的write类型请求
Follow:负责客户端的reader类型请求,参与leader选举等。
Observer:特殊的“Follower”,其可以接受客户端reader请求,但不能选举(扩容系统支撑能力,提高了读取速度。因为他不接受任何同步的写入请求,只负责与leader同步数据)其实,当我们使用java代码操作Zookeeper,那么我们就称我们的这个程序是Observer

典型应用场景

zookeeper从设计模式的角度来看,是一个基于观察者模式设计的分布式服务管理框架,他负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责同志已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave的管理模式

  • 管理配置
    比如分布式应用环境中机器的配置列表,运行时的开关配置,数据库配置信息等,这些配置信息通常具有以下3个特性
  1. 数据量比较小
  2. 数据内容在运行时动态发生变化。
  3. 集群中各个节点共享信息,配置一致
  • 集群管理
    Zookeeper不仅能帮你维护当前机器中的服务状态,而且能帮你选出一个“总管”来管理集群,这就是Zookeeper的另一个功能,Leader,并且实现集群容错功能。
  1. 希望知道当前集群中究竟有多少台机器工作
  2. 对集群中每天集群的运行时状态进行数据收集
  3. 对集群中每台集群进行上下线操作
  • 发布与订阅
    Zookeeper时一个典型的分布/订阅模式的分布式管理与协调框架,开发人员可以使用它来进行分布式数据的发布与订阅

  • 数据库切换

  • 分布式日志的收集
    我们可以做一个日志系统手机集群中所有的日志信息,进行统一管理

  • 分布式锁,队列管理等等
    zookeeper的特性就是在分布式场景下高可用,但是原生的API实现分布式功能非常困难,团队去实现也太浪费时间,即使实现了也未必稳定,那么可以采用第三方的客户端的完美实现,比如Curator框架,他是Apache的顶级项目。

Zookeeper开源框架应用

zookeeper使用场景非常广泛:
如Hadoop、Storm、消息中间件、RPC服务框架、数据库增量订阅与消费组件(如Mysql Binlog)、分布式数据库同步系统,淘宝的Otter等。
所以,我们很有必要学好zookeeper!