Zookeeper 简介

131 阅读6分钟

1. what

  • 大数据生态系统里的很多组件的命名都是某种动物或者昆虫,比如hadoop就是 🐘,hive就是🐝。zookeeper即动物园管理者,顾名思义就是管理大数据生态系统各组件的管理员

2. where

  • zookeeper 是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力分布式协调存储服务。
  • 应用场景有:维护配置信息、分布式锁服务、集群管理、生成分布式唯一ID

2.1 维护配置信息

  • 以往通过配置文件保存配置信息,目前因为是分布式系统,为了保证各台服务器上配置数据的一致性,需要一种服务,能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每一台服务器上的数据一致性。
  • zookeeper提供这一种服务,其使用Zab这种一致性协议来保证一致性。
  • 现在有很多开源项目使用zookeeper来维护配置,比如在hbase中,客户端就是连接 一个zookeeper,获得必要的hbase集群的配置信息,然后才可以进一步操作。还有在开 源的消息队列kafka中,也使用zookeeper来维护broker的信息。在alibaba开源的soa框 架dubbo中也广泛的使用zookeeper管理一些配置来实现服务治理。

2.2 分布式锁服务

  • 一个集群是一个分布式系统,多台服务器完成相同的服务,有时候需要协调彼此的进度,当某台机器在操作的时候,其他机器都不能操作。在单机的多线程中有锁,分布式的系统中也需要锁。

2.3 集群管理

  • 集群中可能会出现因为软硬件故障、网络故障需要移除某些机器、添加某些机器的情况,zookeeper会将这些服务器加入/移除的情况通知给其他正常工作的服务器。以及及时对存储、计算等任务的分配做出调整。
  • zookeeper还会对故障的服务器做出诊断并尝试修复。

2.4 生成分布式唯一ID

  • 分库分表之后,没办法直接通过auto_increment实现每条记录产生唯一的ID。可以通过zookeeper在分布式环境下产生全局唯一ID。
  • 做法是,每次要生成一个新的id,就创建一个持久顺序节点,创建操作返回的节点序号,即为新id。

3. zookeeper 设计目标

  • zooKeeper致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访 问控制能力的分布式协调服务

3.1 高性能

  • zooKeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,尤 其适用于以读为主的应用场景

3.2 高可用

  • zooKeeper一般以集群的方式对外提供服务,一般3 ~ 5台机器就可以组成一个可用 的Zookeeper集群了,每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相 互保持着通信。只要集群中超过一半的机器都能够正常工作,那么整个集群就能够正常对外服 务

3.3 严格顺序访问

  • 对于来自客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号, 这个编号反映了所有事务操作的先后顺序

4. 数据模型

  • zookeeper 的数据结构可以被视为是树状结构,树中的各节点被称为znode,一个znode可以有多个子节点。
  • zookeeper 结构上表现为树状,通过路径path来定位某个znode。比如/ns- 1/itcast/mysql/schema1/table1,此处ns-1、itcast、mysql、schema1、table1分别是 根节点、2级节点、3级节点以及4级节点;其中ns-1是itcast的父节点,itcast是ns-1的子 节点,itcast是mysql的父节点,mysql是itcast的子节点,以此类推。

4.1 znode

  • 节点类型:分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。
    • 临时节点:该节点的生命周期依赖于创建它的会话。会话结束可以自动删除,也可以通过手动删除。虽然每个临时的Znode都会绑定到 一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节 点不允许拥有子节点。
    • 持久化节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作 的时候,他们才能被删除
  • znode包含多个部分
  • znode的数据:即znode data
  • 节点的子节点:children
  • 节点的状态stat:用来描述当前节点的创建、修改记录等
    • cZxid:数据节点创建时的事务 ID
    • ctime:数据节点创建时的时间
    • mZxid:数据节点最后一次更新时的事务 ID
    • mtime:数据节点最后一次更新时的时间
    • pZxid:数据节点的子节点最后一次被修改时的事务 ID
    • cversion:子节点的更改次数
    • dataVersion:节点数据的更改次数
    • aclVersion:节点的 ACL 的更改次数(权限)
    • ephemeralOwner:如果节点是临时节点,则表示创建该节点的会话的 SessionID;如果节点是持久节点,则该属性值为 0
    • dataLength:数据内容的长度
    • numChildren:数据节点当前的子节点个数

5. how

5.1 单机安装

  • 首先,需要有jdk1.8环境,教程
  • 下载zookeeper的包,3.4.10 所有版本下载链接
  • 解压
    // 解压
    zookeeper tar -xzvf zookeeper-3.4.10.tar.gz
    
  • 修改配置文件。将配置文件的数据保存路径,改成自己创建的data目录的实际绝对路径。
    cd zookeeper-3.4.10  # 进入目录
    mkdir data  # 创建一个保存数据的目录
    cp conf/zoo_sample.cfg conf/zoo.cfg  # 将配置文件的例子复制一份新的
    vim conf/zoo.cfg     # 修改配置文件
    
    // 配置文件内容
    // 此路径用于存储zookeeper中数据的内存快照、及事物日志文件 
    dataDir=/home/zookeeper/zookeeper-3.4.10/data
    
  • 启动zookeeper 服务器。所有执行的脚本,都在bin目录里面。
    cd bin
    // 启动zookeeper 
    ./zkServer.sh start
    
  • 停止及查看状态
    //停止:
    zkServer.sh stop 
    //查看状态:
    zkServer.sh status
    
  • 启动zookeeper客户端。也是在bin目录里面。
    ./zkCli.sh
    ./zkCli.sh -server 192.168.233.133     # 启动相应ip地址的zookeeper的客户端