Zookeeper学习---基础知识

如若还没安装ZooKeeper,请看这
Zookeeper的安装
一脸懵逼搭建Zookeeper分布式集群

定义: Zookeeper是一个高性能、分布式的开源分布式应用协调服务。
Zookeeper的设计目标是将那些复杂且容易出错的分布式协同服务封装起来,抽象出一个高效可靠的原语集,并以一些列简单的接口提供给用户使用。
它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,配置管理,集群管理,命名空间。它被设计为易于编程,使用文件系统目录作为数据模型。服务端跑在java上,提供javaC的客户端API。

Zookeeper 适用于存储和协同相关的关键数据,不适合用于大数据量存储。

zk本身就是分布式系统

ZooKeeper的特性

  1. 一致性:数据的一致性,数据按照顺序先后存储;
  2. 原子性:要么全部成功,要么全部失败;
  3. 单一视图:客户端连接集群的任一zk节点,数据都是一致的;
  4. 可靠性:每次对zk的操作状态都会保存到服务端;
  5. 实时性:客户端可以读取到zk服务端的最新数据;

ZooKeeper解压包下的目录介绍

  • bin:
  • config:
  • contrib:附加目录(一般用不到);
  • dist-maven:mvn编译后的目录;
  • docs:文档帮助;
  • lib:需要依赖的jar包;
  • recipes:案例demo代码;
  • src:源码;

ZooKeeper的zoo.cfg配置文件

  • tickTime: 用于计算的时间单元,比如 session超时: N * tickTime;
  • initLimit: 用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime的倍数来表示;
  • syncLimit: 用于集群,master主节点与从节点之间发送消息,请求和应答时间长度.(心跳机制)
  • dataDir:必须配置,是一些数据文件的保存路径;
  • dataLogDir:日志目录,如果不配置,将会和dataDir使用同一路径;
  • clientPort: 连接服务器的端口,默认2181;

ZooKeeper数据模型
ZooKeeper的数据模型是层次模型。
层次模型常见于文件系统,层次模型和 key-value 模型是两种主流的数据模型。 ZooKeeper 使用文件系统模型主要基于以下两点考虑:

  1. 文件系统的树形结构便于表达数据之间的层次关系。
  2. 文件系统的树形结构便于为不同的应用分配独立的命名空间(namespace)。

ZooKeeper 的层次模型称作 data tree。 Data tree的每个节点叫做 znode. 不同于文件系统,每个节点都可以保存数据。每个节点都有一个版本(version)。 版本从 0 开始计数。

znode分类

  1. 持久性的 znode(PRESISTENT):这样的znode在创建之后即使发生ZooKeeper集群宕机或者client宕机也不会丢失;
  2. 临时性的 znode(EPHEMERAL):client宕机或者client在指定的 timeout 时间内没有给 ZooKeeper集群发消息,这样的 znode 就会消失;
    znode 也可以是顺序性的。每一个顺序性的znode关联一个唯一的单调递增整数。这个单调递增整数是 znode 名字的后缀。如果上面两种 znode具备顺序性,又有以下两种 znode:
  3. 持久顺序性的 znode(PRESISTENT_SEQUENTIAL):znode除了具备持久性 znode 的特点之外, znode 的名字具备顺序性;
  4. 临时顺序性的 znode(EPHEMERAL_SEQUENTIAL): znode除了具备临时性 znode 的特点之外,znode的名字具备顺序性;

ZooKeeper总体架构
应用使用 ZooKeeper 客户端使用 ZooKeeper 服务. ZooKeeper 客户端负责和 ZooKeeper 集群的交互. ZooKeeper 集群可以有两种模式: standalone(单点)模式 和 quorum(多点)模式. 处于 standalone模式的 Zookeeper集群只有一个独立运行的 Zookeeper 节点. 处于 quorum 模式的 Zookeeper 集群包含多个 Zookeeper 节点;

standalone模式一般用于开发, quorum模式一般用于生产环境;
Zookeeper学习---基础知识

Quorum 模式
处于 Quorum模式的 Zookeeper 集群包含多个 Zookeeper节点. 下图中的 Zookeeper 集群有3个节点,其中节点1 是 leader节点,节点 2 和节点 3是follower节点. leader节点可以处理读写请求, follower节点只可以处理读请求. follower 在接到写请求时会把写请求转发给leader 来处理;
Zookeeper学习---基础知识

ZooKeeper常用命令
启动ZooKeeper Server 和 client

client端进行命令的操作

  • ls:查看节点信息—ls /
  • ls2:查看zookeeper节点的状态信息 —ls2 /zookeeper
  • get:get /
  • stat:stat /
  • create:
  • create /app1 app1-data(默认:持久化节点)。
    create -e /app1/tmp app1 tmp-data(临时节点session断开之后不会立即失效,与心跳时间有关)。
    create -s /app1/sec sec01(创建顺序节点)。
    set:
    set / app1 new-app1-data(修改数据)
    set /app1 new-app1-data 1(指定版本,乐观锁,与当前版本对比,不一致不能修改)。
    delete:
    delete /app1/sec0000001(直接删除)。
    delete /app1/sec0000002(添加乐观锁删除最新版本)。
    rmr /node (删除节点包括子节点)

查看节点状态时各个属性的意义

  • cZxid:zookeeper创建这个节点之后,为这个节点分配的一个id。
  • ctime:zookeeper的创建时间。
  • mZxid:修改后的zookeeper分配的id。
  • mtime:修改时间。
  • pZxid:子节点的id。
  • cversion:子节点版本
  • dataVersion:当前节点的数据版本号(修改数据后会加一)。
  • aclVersion:权限发生变化会加一。
  • ephemeralOwner:表示是临时节点还是持久化节点。
  • dataLength:数据长度。
  • numChildren:子节点的个数。

session的基本原理

Zookeeper 客户端库和 Zookeeper 集群中的某个节点创建一个 session. 客户端可以主动关闭 session. 另外如果 Zookeeper 节点没有在 session 关联的 timeout 时间内收到客户端的消息的话,Zookeeper 节点也会关闭 session. 另外 Zookeeper 客户端库如果发现连接的 Zookeeper 出错,会自动和其它 Zookeeper 节点建立连接;

  1. 客户端与服务端之间的连接存在会话;
  2. 每个会话都可以设置一个超时时间;
  3. 心跳结束,session则过期;
  4. session过期,则临时节点znode就会被抛弃;
  5. 心跳机制是指,客户端向服务端的ping包请求;

watcher机制

  1. 针对每个节点,都会有一个监督者—watcher;
  2. 当监控的某个对象(znode)发生了变化,则触发watcher事件;
  3. zk中的watcher是一次性的,出发后立即销毁.
  4. 父节点,子节点增删改都能够触发其watcher;
  5. 针对不同类型的操作,触发的watcher事件也是不同的;

zk在开源项目中的使用:

  • Hadoop:使用 Zookeeper 做 Namenode的高可用。
  • HBase:保证集群中只有一个 master,保存集群中的 RegionServer 列表,保存 hbase:meta 表的位置;
  • Kafka:集群成员管理,controller节点选举。

zk的应用场景:

  • 配置管理(configuration management)
  • DNS 服务
  • 组成员管理(group membership)
  • 各种分布式锁