1、zookeeper简介

1.1 什么是zookeeper

zookeeper官网:https://zookeeper.apache.org/

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。 是Hadoop和Hbase的重要组件。

分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。

1.2 应用场景

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

  • 维护配置信息

  • 分布式锁服务

  • 集群管理

  • 生成分布式唯一ID

1.维护配置信息

java编程经常会遇到配置项,比如数据库的url、schema、user和password等。通常这些配置项我们会放置在配置文件中,再将配置文件放置在服务器上当需要更改配置项时,需要去服务器上修改对应的配置文件。但是随着分布式系统的兴起,由于许多服务都需要使用到该配置文件,因此有必须保证该配置服务的高可用性(high availability)和各台服务器上配置数据的一致性。通常会将配置文件部署在一个集群上,然而一个集群动辄上千台服务器,此时如果再一台台服务器逐个修改配置文件那将是非常繁琐且危险的的操作,因此就需要一种服务,能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每台服务器上的数据一致性。zookeeper就可以提供这样一种服务,其使用Zab这种一致性协议来保证一致性。现在有很多开源项目使用zookeeper来维护配置,比如在hbase中,客户端就是连接一个zookeeper,获得必要的hbase集群的配置信息,然后才可以进一步操作。还有在开源的消息队列kafka中,也使用zookeeper来维护broker的信息。在alibaba开源的soa框架dubbo中也广泛的使用zookeeper管理一些配置来实现服务治理。

2. 分布式锁服务

一个集群是一个分布式系统,由多台服务器组成。为了提高并发度和可靠性,多台服务器上运行着同一种服务。当多个服务在运行时就需要协调各服务的进度,有时候需要保证当某个服务在进行某个操作时,其他的服务都不能进行该操作,即对该操作进行加锁,如果当前机器挂掉后,释放锁并fail over 到其他的机器继续执行该服务。

3. 集群管理

一个集群有时会因为各种软硬件故障或者网络故障,出现某些服务器挂掉而被移除集群,而某些服务器加入到集群中的情况,zookeeper会将这些服务器加入/移出的情况通知给集群中的其他正常工作的服务器,以及时调整存储和计算等任务的分配和执行等。此外zookeeper还会对故障的服务器做出诊断并尝试修复。

4.生成分布式唯一ID

在过去的单库单表型系统中,通常可以使用数据库字段自带的auto_increment属性来自动为每条记录生成一个唯一的ID。但是分库分表后,就无法在依靠数据库的auto_increment属性来唯一标识一条记录了。此时我们就可以用zookeeper在分布式环境下生成全局唯一ID。做法如下:每次要生成一个新Id时,创建一个持久顺序节点,创建操作返回的节点序号,即为新Id,然后把比自己节点小的删除即可

2.zookeeper的数据模型

ZooKeeper的数据节点可以视为树状结构(或者目录),树中的各节点被称为znode(即zookeeper node),一个znode可以有多个子节点。zookeeper节点在结构上表现为树状;使用路径path来定位某个znode,比如/ns-1/mysql/schema1/table1,此处ns-1、mysql、schema1、table1分别是根节点、2级节点以及3级节点;其中ns-1是mysql的父节点,mysql是ns-1的子节点。以此类推。

ZooKeeper的设计适合存储少量的数据,并不适合存储大量数据,所以znode的存储限制最大不超过1M。

znode,兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。

一个znode大体上分为3各部分:

  • 节点的数据:即znode data(节点path, 节点data)的关系就像是java map中(key, value)的关系

  • 节点的子节点children

  • 节点的状态stat:用来描述当前节点的创建、修改记录,包括cZxid、ctime等

在zookeeper shell中使用get命令查看指定路径节点的data、stat信息:

[zk: localhost:2181(CONNECTED) 5] get /motan/motan-ulive-rpc/com.uxin.zb.slive.service.SliveRoomService
null
cZxid = 0x50ec459
ctime = Thu Dec 12 20:55:22 CST 2019
mZxid = 0x50ec459
mtime = Thu Dec 12 20:55:22 CST 2019
pZxid = 0x1000bbbd4
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3

属性说明:

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

3.zookeeper常用shell命令

3.1 新增节点

create [-s] [-e] path data #其中-s 为有序节点,-e 临时节点
创建持久化节点并写入数据:create /hadoop "123456"

创建持久化有序节点,此时创建的节点名为指定节点名 + 自增序号

[zk: localhost:2181(CONNECTED) 2] create -s /a "aaa"
Created /a0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /b "bbb"
Created /b0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /c "ccc"
Created /c0000000002

创建临时节点,临时节点会在会话过期后被删除:

[zk: localhost:2181(CONNECTED) 5] create -e /tmp "tmp"
Created /tmp

创建临时有序节点,临时节点会在会话过期后被删除:

[zk: localhost:2181(CONNECTED) 6] create -s -e /aa 'aaa'
Created /aa0000000004
[zk: localhost:2181(CONNECTED) 7] create -s -e /bb 'bbb'
Created /bb0000000005
[zk: localhost:2181(CONNECTED) 8] create -s -e /cc 'ccc'
Created /cc0000000006

3.2 更新节点

更新节点的命令是 set,可以直接进行修改,如下:

set path data [version]

可以更新某个节点,也可以指定版本号更新。

[zk: localhost:2181(CONNECTED) 12] set /hadoop "345"
cZxid = 0x2
ctime = Sat Oct 10 15:46:18 CST 2020
mZxid = 0xa
mtime = Sat Oct 10 15:49:49 CST 2020
pZxid = 0x2
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

3.2 删除节点

删除节点的语法如下:

delete path [version]

和更新节点数据一样,也可以传入版本号,当你传入的数据版本号 (dataVersion) 和当前节点的数据版本号不符合时,zookeeper 不会执行删除操作。

该删除需要该节点没有子节点存在。

[zk: localhost:2181(CONNECTED) 15] delete /hadoop 0
version No is not valid : /hadoop #无效的版本号
[zk: localhost:2181(CONNECTED) 16] delete /hadoop 1

要想删除某个节点及其所有后代节点,可以使用递归删除,命令为 rmr path

3.3 查看节点列表

查看节点列表有 ls pathls2 path 两个命令,后者是前者的增强,不仅可以查看指定路径下的所有节点,还可以查看当前节点的信息

3.4 监听器get path [watch]

使用 get path [watch] 注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是 zookeeper 的触发器是一次性的 (One-time trigger),即触发一次后就会立即失效。

[zk: localhost:2181(CONNECTED) 4] get /hadoop  watch
[zk: localhost:2181(CONNECTED) 5] set /hadoop 45678
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop  #节点值改变

3.5 监听器stat path [watch]

使用 stat path [watch] 注册的监听器能够在节点状态发生改变的时候,向客户端发出通知

[zk: localhost:2181(CONNECTED) 7] stat /hadoop watch
[zk: localhost:2181(CONNECTED) 8] set /hadoop 112233
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop  #节点值改变

3.6 监听器ls || ls2 path [watch]

使用 ls path [watch]ls2 path [watch] 注册的监听器能够监听该节点下所有子节点的增加和删除操作。

[zk: localhost:2181(CONNECTED) 9] ls /hadoop watch
[]
[zk: localhost:2181(CONNECTED) 10] create  /hadoop/yarn "aaa"
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop

4.zookeeper的数据一致性

Zab协议介绍:https://www.jianshu.com/p/2bceacd60b8a

在ensemble集群中follower的update操作会滞后于leader的update完成。事实的结果使我们在提交更新数据之前,不必在每一台ZooKeeper服务器上执行持久化变更数据,而是仅需在主服务器上执行持久化变更数据。ZooKeeper客户端的最佳实践是全部链接到follower上。然而客户端是有可能连接到leader上的,并且客户端控制不了这个选择,甚至客户端并不知道连接到了follower还是leader。下图所示, 读操作向follower请求即可,而写操作由leader来提交。

每一个对znode树的更新操作,都会被赋予一个全局唯一的ID,我们称之为zxid(ZooKeeper Transaction ID)。更新操作的ID按照发生的时间顺序升序排序。例如, z1小于 z2,那么 z1的操作就早于 z2操作。

ZooKeeper在数据一致性上实现了如下几个方面:

  • 顺序一致性

从客户端提交的更新操作是按照先后循序排序的。例如,如果一个客户端将一个znode z赋值为a,然后又将z的值改变成b,那么在这个过程中不会有客户端在z的值变为b后,取到的值是a。

  • 原子性

更新操作的结果不是失败就是成功。即,如果更新操作失败,其他的客户端是不会知道的。

  • 系统视图唯一性

无论客户端连接到哪个服务器,都将看见唯一的系统视图。如果客户端在同一个会话中去连接一个新的服务器,那么 他所看见的视图的状态不会比之前服务器上看见的更旧。当ensemble中的一个服务器宕机,客户端去尝试连接另外一台服务器时,如果这台服务器的状态旧于之前宕机的服务器,那么服务器将不会接受客户端的连接请求,直到服务器的状态赶上之前宕机的服务器为止。

  • 持久性

一旦更新操作成功,数据将被持久化到服务器上,并且不能撤销。所以服务器宕机重启,也不会影响数据。

  • 时效性

系统视图的状态更新的延迟时间是有一个上限的,最多不过几十秒。如果服务器的状态落后于其他服务器太多,ZooKeeper会宁可关闭这个服务器上的服务,强制客户端去连接一个状态更新的服务器。

ZooKeeper入门之数据模型和常用命令介绍相关推荐

  1. Hadoop生态圈-zookeeper本地搭建以及常用命令介绍

    Hadoop生态圈-zookeeper本地搭建以及常用命令介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.下载zookeeper软件 下载地址:https://www.ap ...

  2. linux系统防火墙相关问题及常用命令介绍

    今天介绍关于linux系统防火墙:centos5.centos6.redhat6系统自带的是iptables防火墙,centos7.redhat7自带firewall防火墙,ubuntu系统使用的是u ...

  3. Hadoop常用命令介绍

    下面分享一篇 常用的Hadoop命令介绍,希望对Hadoop初学者的朋友有所帮助~ Hadoop常用命令介绍

  4. alsa-util常用命令介绍

    目录 版本获取 前言 常用命令介绍 amixer aplay arecord 前言 我们在audio启动调试的时候,经常会遇到这样一个问题,就是我们调试时间很紧迫,并且所有的组件都在开机调试,有可能这 ...

  5. Linux中sysstat服务,Linux sysstat常用命令介绍

    一.sysstat 软件安装 下载sysstat软件包,解压 tar zxvf *.tar.gz ./configure make make install 二.sar 命令介绍 sar -h 用法: ...

  6. php基础命令,PHP命令行下的11个常用命令介绍

    本文整理了PHP命令行下的11个常用命令,下面介绍给大家,它们分别是php -m.php -v.php --ini.php -h.php --info.php --rf .php --rc .php ...

  7. Linux学习:入门,概述,常用命令,环境安装

    服务器购买配置 参考:狂神说Linux 基于CentOS7 Linux一切皆文件:读,写 一.入门概述 二.Linux命令 1. 开机登录 可以使用 man [命令]来查看各个命令的使用文档,如 :m ...

  8. 46.逻辑卷管理1,lvm架构,概念,常用命令介绍

    LVM架构 LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的.lvm需要使用的软件包为lvm2.它的架构 相关概念 ...

  9. 数字证书管理工具keytool常用命令介绍

    需要给一个apk加签名,用到了keytool这个工具,下面转载一篇介绍keytool的文章 http://blog.chinaunix.net/uid-17102734-id-2830223.html ...

最新文章

  1. CSS的一个FAQ问题——浮动层覆盖问题!!!
  2. 全球第三位艾滋病痊愈者出现,靠脐带血干细胞新疗法抵抗病毒,此前已患病9年...
  3. linux硬盘目录下,Linux 新添加的硬盘格式化并挂载到目录下
  4. facebook 分享,遇到的错误
  5. 开发者社区精选直播合集一览
  6. 【Android】Android中ContentProvider组件详解
  7. Lambda表达式的注意事项【理解】
  8. JavaScript知识笔记(一)——入门、语句、注释、变量、函数、输出内容、对话框、窗口
  9. 深度探索Win32可执行文件格式
  10. installshield 脚本 在卸载过程执行_Linux下运行Jmeter脚本
  11. 重磅!阿里首推的“SpringBoot+Vue全栈项目”有多牛X?
  12. ROST反剽窃论文检测系统介绍
  13. EXCEL VBA编程进阶-曾贤志-专题视频课程
  14. 实用的数据可视化工具大集合
  15. Java实现 蓝桥杯 算法提高 日期计算
  16. SCC计算机控制,计算机控制系统功能之监督控制-电脑自学网
  17. 云计算技术概述与入门
  18. mysql errno: 1146_解决MySQL复制出错 Last_SQL_Errno:1146
  19. 如何断开mongodb数据库连接_如何创建mongodb数据库连接
  20. 微信端视频播放防被浏览器劫持

热门文章

  1. 初等数论--整除--带余除法
  2. 一和零(二维01背包)
  3. Linux kernel crypto的介绍
  4. AttnGAN: Fine-Grained Text to Image Generation with Attentional Generative Adversarial Networks论文解读
  5. reflective dll injection 反射注入
  6. 【网络安全】记一次接口加密测试
  7. 4.WaitForSingleObject函数分析
  8. 12、MyISAM存储引擎
  9. Python词频对比并导入CSV文件
  10. 自动化测试框架搭建-参数化-3