Zookeeper深入浅出之快速入门实例

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介:

what is Zookeeper?

  • zk分布式服务框架是apache hadoop的一个子项目,主要用于分布式当中,如集群管理,统一命名服务,分布式锁,分布式消息队列,分布式配置管理等。


比如:

【分布式配置管理】

发布者发布数据/配置信息到ZK节点上,供订阅者动态订阅数据,实现配置信息的集中式管理和动态更新。


【命名服务】

在分布式应用当中,我们要保证命名的唯一性,可以通过ZK的create node api很容易的创建一个全局唯一的PATH作为name service。


【分布式通知和协调】

如果不同系统之间对ZK的同一个ZNODE节点进行注册,监听ZNODE的变化(包括ZNODE及其子节点),其中一个系统UPDATE了ZNODE,那么另一个系统能够收到通知并作相应的处理。

其实是利用到了ZK特有的watch注册和异步通知机制,实现分布式环境下不同系统的通知和协调,实现对数据变更的实时处理。


  • 现在很多分布式计算需要依赖ZK,比如hadoop,storm,hbase等。


比如,对于Storm而言:

消息先发送到nimbus(master),然后由ZK分发到supervisor(slave)上,可见ZK保存了STORM集群和作业的信息,并负责nimbus和supervisor的通信


  • 一句话,就是因为ZK在分布式中的特性,可以方便我们在分布式开发解决一些困难,因此我们需要深入学习下ZK。



ZK的体系结构


先看图:

wKioL1evJ3SQo55wAAI3xnbdMO0872.png

  1. ZK中有很多Server,然后其中有一台是leader。

  2. Server端具有fast fail特性,也就是说如果leader挂了,可以快速选举出新的leader,不存在单点故障。

  3. 非leader节点,只要超过半数的节点正常就不影响对外提供服务,非常健壮。

  4. 客户端提交请求,首先会提交到Server leader,然后由leader广播到其他的server.


wKioL1evKFLwpIsBAACeQfNT9S4604.png


  • ZK可以存储协调数据,如状态、配置等信息,每个节点存储的数据量很小,KB级别。

  • ZK NODE类似文件系统的目录树型结构

  • 每个节点具有与之对应的数据内容,同时也可以具有子节点

  • 有四种节点,临时节点是不可以有子节点的

  • 节点维护一个状态stat结构(包括数据变化的版本号,ACL变化,时间戳)

  • 每当节点数据内容改变时,多一个版本号【这一点和HBASE比较类似】,CLIENT在获取数据的同时也会获取版本号,节点的数据内容以原子方式读写。

  • 节点具有一个访问控制列表Access Control List : ACL 来约束访问操作,即具有权限控制。



ZK的特性:watch机制


  • 当ZK的节点数据变化时,会触发watch事件,即ZK对NODE的增,删,改,查都会触发监听。

  • watch是一次性触发机制,但watch监视的数据发生变化时,通知设置了该watch的client,即watcher,也就是说,如果我们设置了watch事件,触发后,如果我们不继续watch该事件,将不再监视。

  • watch事件异步发送至观察者,watch事件的设置是有延迟的。

  • client监视一个节点,总是先获取watch事件,在发现节点的数据变化。



ZK安装、命令行测试实例


STEP1:认识ZK的启动脚本、配置文件


wKiom1evKmvTux4zAAAyKLdeMj8527.png


注意2点:

第一,client与该server连接的port

第二,dataDir指出znode存储的路径、该路径下还会存放server的PID文件


wKioL1evLFvAb546AAAoOGRjIok138.png


zkServer.sh是start/stop server的脚本,并且还可以查看状态信息。

zkCli.sh是客户端连接server:port的脚本。


STEP2:在单机上做一个伪分布式的ZK集群


先看配置文件信息:

wKioL1evLdeQZ0z3AAA4bRFetjE349.png


类似的,提供zoo2.cfg,zoo3.cfg配置文件。


server.X=IP:PORT1:PORT2的意思是这样的:

在ZK中server是有编号的,而X就表示该server的序号。IP是server的地址,PORT1表示的是该server与leader通信过程中采用的端口,PORT2表示的是如果leader重新选取的话,采用PORT2端口进行通信。


看dataDir的情况:

wKiom1evL2WQXPfpAABMUuw5d8o320.png

需要注意的是,每个Server都需要提供一个myid文件来表示自己在ZK的序号,与配置文件中对应。


启动多个ZK SERVER实例:

wKiom1evMDnBuQxzAABDIOtoKEM132.png


查看ZK状态信息:

wKioL1evMIbwu1MPAAA-hZrhNXw404.png


客户端连接SERVER进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
[root@localhost bin] # ./zkCli.sh -server 192.168.91.2:2182
[zk: 192.168.91.2:2182(CONNECTED) 0] help
[zk: 192.168.91.2:2182(CONNECTED) 1]  ls  /
[zookeeper]
[zk: 192.168.91.2:2182(CONNECTED) 3] create  /node  test1
[zk: 192.168.91.2:2182(CONNECTED) 4] get  /node
test1
cZxid = 0x100000002
ctime = Sat Aug 13 06:13:44 PDT 2016
mZxid = 0x100000002
mtime = Sat Aug 13 06:13:44 PDT 2016
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: 192.168.91.2:2182(CONNECTED) 5]  set  /node  test2
cZxid = 0x100000002
ctime = Sat Aug 13 06:13:44 PDT 2016
mZxid = 0x100000003
mtime = Sat Aug 13 06:14:14 PDT 2016
pZxid = 0x100000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: 192.168.91.2:2182(CONNECTED) 6] get  /node
test2
cZxid = 0x100000002
ctime = Sat Aug 13 06:13:44 PDT 2016
mZxid = 0x100000003
mtime = Sat Aug 13 06:14:14 PDT 2016
pZxid = 0x100000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: 192.168.91.2:2182(CONNECTED) 7] create  /node/info  test3 
Created  /node/info
[zk: 192.168.91.2:2182(CONNECTED) 8] get  /node
test2
cZxid = 0x100000002
ctime = Sat Aug 13 06:13:44 PDT 2016
mZxid = 0x100000003
mtime = Sat Aug 13 06:14:14 PDT 2016
pZxid = 0x100000004
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
[zk: 192.168.91.2:2182(CONNECTED) 9] get  /node/info
test3
cZxid = 0x100000004
ctime = Sat Aug 13 06:15:37 PDT 2016
mZxid = 0x100000004
mtime = Sat Aug 13 06:15:37 PDT 2016
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: 192.168.91.2:2182(CONNECTED) 10] quit


到这里,ZK的基本介绍和入门使用就结束了,GOOD NIGHT~



本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1837667,如需转载请自行联系原作者

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
10月前
|
数据安全/隐私保护
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(二)
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(二)
|
5天前
|
分布式计算 Hadoop Scala
Scala +Spark+Hadoop+Zookeeper+IDEA实现WordCount单词计数(简单实例-上)
Scala +Spark+Hadoop+Zookeeper+IDEA实现WordCount单词计数(简单实例-上)
9 0
|
1月前
|
存储 API 数据安全/隐私保护
【ZooKeeper快速入门】 —— 每天一点小知识
【ZooKeeper快速入门】 —— 每天一点小知识
|
10月前
|
消息中间件 负载均衡 监控
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(一)
Zookeeper快速入门(Zookeeper概述、安装、集群安装、选举机制、命令行操作、节点类型、监听器原理)(一)
|
存储 消息中间件 Dubbo
快速入门zookeeper
快速入门zookeeper
153 0
|
存储 消息中间件 Dubbo
快速入门zookeeper
快速入门zookeeper
|
分布式计算 Hadoop 网络安全
Hadoop快速入门——第四章、zookeeper(集群)(2)
Hadoop快速入门——第四章、zookeeper(集群)
80 0
Hadoop快速入门——第四章、zookeeper(集群)(2)
|
分布式计算 Hadoop 网络安全
Hadoop快速入门——第四章、zookeeper(集群)(1)
Hadoop快速入门——第四章、zookeeper(集群)
78 0
Hadoop快速入门——第四章、zookeeper(集群)(1)
|
分布式计算 Hadoop
Hadoop快速入门——第四章、zookeeper安装
Hadoop快速入门——第四章、zookeeper安装
94 0
Hadoop快速入门——第四章、zookeeper安装
|
设计模式 NoSQL Java
肝一下ZooKeeper实现分布式锁的方案,附带实例!
肝一下ZooKeeper实现分布式锁的方案,附带实例!
肝一下ZooKeeper实现分布式锁的方案,附带实例!