zookeeper学习一-ZK简介

1 ZK是什么

ZK是由雅虎研究院开发,后托管到apache,2010.11正式成为apache的*项目

大数据生态系统里很多组件命名都是某种昆虫或动物,zookeeper即动物园管理员,是大数据生态系统各个组件的管理者

2 ZK应用场景

zookeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用、且具有严格顺序访问控制能力的分布式协调存储服务

  • 维护配置信息
  • 分布式锁
  • 集群管理
  • 生成分布式唯一id

2.1 维护配置信息

java项目通常有些配置项如数据库连接、用户名、密码等,部署应用的时候这些配置项会放在配置文件中,然后部署到服务器。

随着分布式应用的兴起,许多服务需要用到同一个配置文件,因此有必要保证该配置服务的高可用性和各个服务配置数据的一致性。

zookeeper就是这样一个服务,通过ZAB协议来保证一致性,很多开源项目都使用ZK维护配置。如kafka中用zk维护broker信息,dubbo中使用zookeeper管理一些服务配置

2.2 分布式锁

在我们日常的开发中,如果是单个进程中对共享资源的访问,我们只需要用synchronized或者lock就能实现互斥操作。但是对于跨进程、跨主机、跨网络的共享资源似乎就无能为力了。

思路:

  1. 首先zookeeper中我们可以创建一个/distributed_lock持久化节点
  2. 然后再在/distributed_lock节点下创建自己的临时顺序节点,比如:/distributed_lock/task_00000000008
  3. 获取所有的/distributed_lock下的所有子节点,并排序
  4. 判读自己创建的节点是否最小值(第一位)
  5. 如果是,则获取得到锁,执行自己的业务逻辑,最后删除这个临时节点。
  6. 如果不是最小值,则需要监听自己创建节点前一位节点的数据变化,并阻塞。
  7. 当前一位节点被删除时,我们需要通过递归来判断自己创建的节点是否在是最小的,如果是则执行5);如果不是则执行6)(就是递归循环的判断)

2.3 集群管理

一个集群中可能会因为各种原因导致某一个节点挂掉而被移除集群,也会给一个集群中新增一些节点。zookeeper会将这些节点上线下线的的情况通知给集群中的其他节点来保证各个节点可以感知集群最新信息。

2.4 分布式唯一id

过去单工程系统中通过数据库自带的自增主键机制可以实现唯一id。分库分表后就不能依赖自增主键了。此时我们可以利用ZK在分布式环境下生成唯一主键,有两种实现方式

2.4.1 持久顺序节点

每次需要生成id的时候,创建一个持久顺序节点,创建返回节点序号,即id,然后把比自己小的节点删除即可

2.4.2 节点版本号

ZooKeeper中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化。

3 设计目标

  • 高性能

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

  • 高可用

zookeeper一般以集群的方式对外提供服务,一般3~5台机器就可以组成一个高可用集群。每台机器都在内存中维护者当前服务状态,并且每台机器互相保持通信。只要集群中超过半数的节点能正常工作,那么该集群就能对外提供服务

  • 严格顺序访问

对于客户端的每次更新请求,zookeeper都会分配一个全局递增编号,该编号反映了所有事务操作顺序。

4 数据模型

Zookeeper数据模型类似Linux操作系统的文件系统,也是以树的形式来存储。严格来说是一颗多叉树,每个节点上都可以存储数据,每个节点还可以拥有N个子结点,最上层是根节点以“/”来代表。节点兼具文件和目录的两种特点,既能像文件一样维护者数据信息,又能像目录一样作为路径标识的一部分

4.1 节点的数据

节点node和data就像java map中的k-v形式一一对应关系

4.2 节点的子节点

4.3 节点的状态stat

用来描述当前节点信息如创建、修改时间、版本号等

状态属性 说明
cZxid  数据节点创建时的事务ID
ctime  数据节点创建时的时间
mZxid  数据节点最后一次更新时的事务ID
mtime  数据节点最后一次更新时的时间
pZxid  数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容变更)时的事务ID
cversion  子节点的版本号
dataVersion  数据节点的版本号
aclVersion  数据节点的ACL版本号 
ephemeralOwner   如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为0
dataLength  数据内容的长度
numChildren  数据节点当前的子节点个数

4.4 节点类型

  • PERSISTENT

持久化目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在

  • PERSISTENT_SEQUENTIAL

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

  • EPHEMERAL

临时目录节点:客户端与zookeeper断开连接后,该节点被删除

  • EPHEMERAL_SEQUENTIAL

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

  • Container 节点

3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点 在未来会被Zookeeper自动清除,定时任务默认60s 检查一次

  • TTL 节点

默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定

 

 

 

上一篇:k8s部署kafka集群


下一篇:SpringBoot-Dubbo、Zk