专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

zookeeper系列(一)

zookeeper概览

ZooKeeper 是一个开源的分布式协调服务,ZooKeeper框架最初是在“Yahoo!”上构建的,用于以简单而稳健的方式访问他们的应用程序。 后来,Apache ZooKeeper成为Hadoop,HBase和其他分布式框架使用的有组织服务的标准。 例如,Apache HBase使用ZooKeeper跟踪分布式数据的状态。 ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

zookeeper在dubbo中的使用场景

Zookeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心(提供订阅服务)。

服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。

如下图所示,在 Dubbo架构中 Zookeeper 就担任了注册中心这一角色。

51_1.png

zookeeper数据模型

ZNode(数据节点)是 ZooKeeper 中数据的最小单元,每个ZNode上都可以保存数据,同时还是可以有子节点(这就像树结构一样,如下图所示)。可以看出,节点路径标识方式和Unix文件 系统路径非常相似,都是由一系列使用斜杠”/”进行分割的路径表示,开发人员可以向这个节点中写入数据,也可以在节点下面创建子节点。这些操作我们后面都会介绍到。

51_2.png

相信大家也都知道事务是怎么回事,事务的ACID四大特性等等,但是在zookeeper中的事务和我们之前所认识的事务有点不太一样。

在Zookeeper中,事务是指能够改变 ZooKeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。

对于每一个事务请求,ZooKeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些 ZXID 中可以间接地识别出Zookeeper处理这些更新操作请求的全局顺序。

ZNode(数据节点)的结构

每个 ZNode 由2部分组成:

  • stat:状态信息
  • data:数据内容

如下所示,我通过 get 命令来获取 根目录下的 dubbo 节点的内容。(命令操作会之后介绍)

[zk: localhost:2181(CONNECTED) 2] get /dubbo
null
cZxid = 0x2
ctime = Tue May 21 21:37:08 CST 2019
mZxid = 0x2
mtime = Tue May 21 21:37:08 CST 2019
pZxid = 0x3b
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 3] 

这些状态信息其实就是 Stat 对象的格式化输出。Stat 类中包含了一个数据节点的所有状态信息的字段,包括事务ID、版本信息和子节点个数等。

关于数据节点的状态信息说明(也就是对Stat 类中的各字段进行说明),可以参考下图(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》)。

51_3.png

zookeeper中的常见命令操作

连接 ZooKeeper 服务

进入安装 ZooKeeper文件夹的 bin 目录下执行下面的命令连接 ZooKeeper 服务(Linux环境下)(连接之前首选要确定你的 ZooKeeper 服务已经启动成功)。

./zkCli.sh -server 127.0.0.1:2181

51_4.png

从上图可以看出控制台打印出了很多信息,包括我们的主机名称、JDK 版本、操作系统等等。如果你成功看到这些信息,说明你成功连接到 ZooKeeper 服务。

1.查看常用命令(help 命令)

help 命令查看 zookeeper 常用命令

51_5.png

2.创建节点(create 命令)

这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串。

通过 create 命令在根目录创建了node1节点,与它关联的字符串是”node1″

[zk: localhost:2181(CONNECTED) 0] create /node1 “node1”

通过 create 命令在node1节点下创建node1.1节点,与它关联的内容是数字 123

[zk: localhost:2181(CONNECTED) 1] create /node1/node1.1 123Created /node1/node1.1

3.更新节点数据内容(set 命令)

[zk: localhost:2181(CONNECTED) 11] set /node1 "set node1"

4.获取节点的数据(get 命令)

get 命令可以获取指定节点的数据内容和节点的状态,可以看出我们通过set 命令已经将节点数据内容改为 “set node1″。

[zk: localhost:2181(CONNECTED) 7] get /node1
set node1
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1 

5.查看某个目录下的子节点(ls 命令)

使用 ls 命令来查看当前 ZooKeeper 中所包含的内容。

通过 ls 命令查看根目录下的节点

[zk: localhost:2181(CONNECTED) 3] ls /[dubbo, zookeeper, node1]

通过 ls 命令查看 node1 目录下的节点

[zk: localhost:2181(CONNECTED) 5] ls /node1[node1.1]

zookeeper 中的 ls 命令和 linux 命令中的 ls 类似, 这个命令将列出绝对路径path下的所有子节点信息(列出1级,并不递归)

#监听这个节点的变化,当另外一个客户端改变/zk时,它会打出下面的

#WATCHER::

#WatchedEvent state:SyncConnected type:NodeDataChanged path:/node1

[zk: localhost:2181(CONNECTED) 4] get /node1 watch

6.查看节点状态(stat 命令)

通过 stat 命令查看节点状态

[zk: localhost:2181(CONNECTED) 1] stat /node1
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1

上面显示的一些信息比如cversion、aclVersion、numChildren等等,我在上面 “ZNode(数据节点)的结构” 这部分已经介绍到。

7.查看节点信息和状态(ls2 命令)

ls2 命令更像是 ls 命令和 stat 命令的结合。

ls2 命令返回的信息包括2部分:子节点列表 + 当前节点的stat信息

[zk: localhost:2181(CONNECTED) 14] ls2 /node1
[node1.1]
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1

8.删除节点(delete 命令)

这个命令很简单,但是需要注意的一点是如果你要删除某一个节点,那么这个节点必须无子节点才行。

[zk: localhost:2181(CONNECTED) 3] delete /node1/node1.1

9.删除节点:rmr(递归删除)

[zk: localhost:2181(CONNECTED) 5] rmr /node1

Zookeeper的节点类型

1、Znode有两种类型:

  • 短暂(ephemeral)(断开连接自己删除)
  • 持久(persistent)(断开连接不删除)

2、Znode有四种形式的目录节点(默认是persistent )

  • PERSISTENT(持久节点)
  • PERSISTENT_SEQUENTIAL(持久顺序节点)
  • EPHEMERAL(临时节点)
  • EPHEMERAL_SEQUENTIAL(临时顺序节点)

3、创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。

4、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。

小结

今天带大家了解了zookeeper是什么以及对zookeeper节点的一些操作,节点的特性跟Linux的文件系统其实真的十分相似,很好理解。本篇文章就是就是对zookeeper的一个入门介绍,下篇我会对zookeeper的一些高级机制进行讲解。

文章永久链接:https://tech.souyunku.com/41187

未经允许不得转载:搜云库技术团队 » zookeeper系列(一)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们