ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

zookeeper学习一-ZK简介

2021-05-01 11:30:59  阅读:187  来源: 互联网

标签:顺序 ZK 简介 zookeeper 集群 创建 数据 节点


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 开启,不稳定

 

 

 

标签:顺序,ZK,简介,zookeeper,集群,创建,数据,节点
来源: https://blog.csdn.net/qq_35930102/article/details/116325541

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有