Zookeeper的核心概念以及java客户端使用
一、Zookeeper的核心概念
分布式配置中心(存储):disconf(zk)、diamond(mysql+http)
1)znode
ZooKeeper操作和维护的是一个个数据节点,称为 znode,采用类似文件系统的层级树状结构进行管理。如果 znode节点包含数据则存储为字节数组(byte array)。
创建 znode 时需要指定节点类型:znode 共有 4 种类型,分别为:持久(无序)、临时(无序)、持久有序和临时有序。

例子:
[zk: localhost:2181(CONNECTED) 3] create /lin 111
[zk: localhost:2181(CONNECTED) 4] create /lin/jin 222
[zk: localhost:2181(CONNECTED) 8] create /lin/jin2 333
[zk: localhost:2181(CONNECTED) 10] ls /lin
[jin2, jin]
2)节点类型
2大类、四种类型:
持久、临时、持久有序、临时有序:
PERSISTENT:持久类型,如果不手动删除是一直存在的。命令:create
PERSISTENT_SEQUENTIAL:有序,自增。命令:create -s
EPHEMERAL:临时,客户端session失效就会随着删除节点,没有子节点。命令:create -e
EPHEMERAL_SEQUENTIAL:有序,自增
3)Stat数据结构
使用get命令可以获得节点信息:
[zk: localhost:2181(CONNECTED) 22] get /lin
20
cZxid = 0x58
ctime = Sun Feb 16 04:06:47 EST 2020
mZxid = 0x58
mtime = Sun Feb 16 04:06:47 EST 2020
pZxid = 0x5a
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 2
Stat中记录了这个 ZNode 的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和 cversion(当前ZNode的ACL版本)。
| 状态属性 | 说明 | 
|---|---|
| czxid | 节点创建时的zxid | 
| mzxid | 节点最新一次更新发生时的zxid | 
| ctime | 节点创建时的时间戳. | 
| mtime | 节点最新一次更新发生时的时间戳. | 
| dataVersion | 节点数据的更新次数. | 
| cversion | 其子节点的更新次数 | 
| aclVersion | 节点ACL(授权信息)的更新次数. | 
| ephemeralOwner | 如果该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是ephemeral节点, ephemeralOwner值为0. 至于什么是ephemeral节点 | 
| dataLength | 节点数据的字节数. | 
| numChildren | 子节点个数. | 
4)Watcher
Watcher(事件监听器):是Zookeeper中的一个很重要的特性。Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到订阅的客户端,该机制是Zookeeper实现分布式协调服务的重要特性。
| KeeperState | EventType | 触发条件 | 说明 | 操作 | 
|---|---|---|---|---|
| SyncConnected (3) | None (-1) | 客户端与服务端成功建立连接 | 此时客户端和服务器处于连接状态 | |
| NodeCreated(1) | Watcher监听的对应数据节点被创建 | Create | ||
| NodeDeleted (2) | Watcher监听的对应数据节点被删除 | Delete/znode | ||
| NodeDataChanged (3) | Watcher监听的对应数据节点的数据内容发生变更 | setDate/znode | ||
| NodeChildChanged (4) | Wather监听的对应数据节点的子节点列表发生变更 | Create/child | ||
| Disconnected (0) | None (-1) | 客户端与ZooKeeper服务器断开连接 | 此时客户端和服务器处于断开连接状态 | |
| Expired (-112) | None (-1) | 会话超时 | 此时客户端会话失效,通常同时也会受到SessionExpiredException异常 | |
| AuthFailed (4) | None (-1) | 通常有两种情况,1:使用错误的schema进行权限检查 2:SASL权限检查失败 | 通常同时也会收到AuthFailedException异常 | 
列子:
#设置监听
[zk: localhost:2181(CONNECTED) 38] get /lin watcher
#当监听位置发生数据改变
[zk: localhost:2181(CONNECTED) 39] set /lin 4444
#就会收到如下通知
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/lin
5)ZK的ACL
ACL(Access Control List),访问权限控制,管理哪些用户拥有哪些操作权限。
四种类型:
- world:默认方式,相当于全世界都能访问
 - auth:代表已经认证通过的用户(可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
 - digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
 - ip:使用Ip地址认证
 
ACL支持权限:
CREATE: 能创建子节点
READ:能获取节点数据和列出其子节点
WRITE: 能设置节点数据
DELETE: 能删除子节点
ADMIN: 能设置权限
6)高性能
ZooKeeper 是高性能的。 在“读”多于“写”的应用程序中尤其的高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景。)
7)顺序访问
对于来自客户端的每个更新请求,ZooKeeper 都会分配一个全局唯一的递增编号,这个编号反应了所有事务操作的先后顺序,应用程序可以使用 ZooKeeper 这个特性来实现更高层次的同步原语。 这个编号也叫做时间戳——zxid(Zookeeper Transaction Id)
二、Zookeeper的Java客户端API
1)原生
在pom文件中加入依赖:
<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.4.9</version>
</dependency>
2)ZkClient
<dependency>
  <groupId>com.101tec</groupId>
  <artifactId>zkclient</artifactId>
  <version>0.10</version>
</dependency>
3)Curator
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-recipes</artifactId>
  <version>4.0.0</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-framework</artifactId>
  <version>4.0.0</version>
</dependency>
												
											Zookeeper的核心概念以及java客户端使用的更多相关文章
- ZooKeeper系列(四)—— Java 客户端 Apache Curator
		
一.基本依赖 Curator 是 Netflix 公司开源的一个 Zookeeper 客户端,目前由 Apache 进行维护.与 Zookeeper 原生客户端相比,Curator 的抽象层次更高,功 ...
 - ZooKeeper学习之路(四)—— Java 客户端 Apache Curator
		
一.基本依赖 Curator是Netflix公司开源的一个Zookeeper客户端,目前由Apache进行维护.与Zookeeper原生客户端相比,Curator的抽象层次更高,功能也更加丰富,是目前 ...
 - Apache Zookeeper Java客户端Curator使用及权限模式详解
		
这篇文章是让大家了解Zookeeper基于Java客户端Curator的基本操作,以及如何使用Zookeeper解决实际问题. Zookeeper基于Java访问 针对zookeeper,比较常用的J ...
 - [转载] ZooKeeper的Java客户端API
		
转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...
 - ZooKeeper 系列(一)—— ZooKeeper核心概念详解
		
一.Zookeeper简介 二.Zookeeper设计目标 三.核心概念 3.1 集群角色 3.2 会话 3.3 数据节点 3.4 节点 ...
 - Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)
		
Elasticsearch之重要核心概念如下: 1.cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是 ...
 - ZooKeeper学习之路(一)—— ZooKeeper简介及核心概念
		
一.Zookeeper简介 Zookeeper是一个开源的分布式协调服务,目前由Apache进行维护.Zookeeper可以用于实现分布式系统中常见的发布/订阅.负载均衡.命令服务.分布式协调/通知. ...
 - ZooKeeper系列(一)—— ZooKeeper 简介及核心概念
		
一.Zookeeper简介 Zookeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护.Zookeeper 可以用于实现分布式系统中常见的发布/订阅.负载均衡.命令服务.分布式协调 ...
 - ZooKeeper入门实战教程(一)-介绍与核心概念
		
1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...
 
随机推荐
- NLP-文本分类之开始(0)
			
转眼读研一年了,开题也开了,方向也定了,大方向就是NLP,然而从一开始的上课.做项目开题什么的(自己也比较贪玩,以前不打游戏,结果王者上瘾了),到现在对NLP是一知半解,不对,半解都没有半解,然后时间 ...
 - MDS算法及其matlab实现
			
问题背景: 在求解MTSP问题的时候,因为已知的为各个巡检点之间路径耗时长度,而这个具体描述采用无向图结构可以很好的描述,在matlab中通过函数(graphallshortestpaths)可以得到 ...
 - 吴裕雄--天生自然python学习笔记:python 用pygame模块处理音频文件
			
除了对图片. Word 等普通格式的文件进行处理外, Python 还有强大的多媒体文件操作能力,如对音频.视频 文件的操作 . 如果要播放音乐,我们可以用 pygame 包中的 mixer 对 象. ...
 - 《ECMAScript 6 入门教程 - 阮一峰著》学习笔记
			
在刷LeetCode的过程中看到很多新的语法糖,系统学习一下以便代码更加规范,美观,健壮.
 - left join on注意点
			
右侧表的条件参数需要放在on后面 where 后面进放置左表的条件参数 比如消息表和用户消息表 消息表里存在类型为<系统消息>的消息是发送给全部用户 我们发送给系统消息时,不直接插入用户消 ...
 - 向通用自动驾驶部门Cruise投资22.5亿美元,软银打得什么主意?
			
5月29日,加利福尼亚州的一辆特斯拉Model S撞上停在路边的警车.据透露,当时这辆特斯拉正处于自动辅助驾驶即Autopilot模式.而在今年,这已经不是第一次特斯拉自动驾驶模式出问题了.此外,Ub ...
 - QuickSort(快速排序)原理及C++代码实现
			
快速排序可以说是最重要的排序,其中延伸的思想和技巧非常值得我们学习. 快速排序也使用了分治的思想,原理如下: 分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r ...
 - spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate
			
什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现 ...
 - javaweb_forQuery
			
http://how2j.cn/k/tmall_ssm/tmall_ssm-1516/1516.html 总体思路 使用springMVC+spring+mybatis的方式打通表现层/业务层/持久层 ...
 - python练习题——猜数字游戏
			
增加了按照对半找数的方法来计算最短几次就可以猜到随机数,决定到游戏结束共猜数的次数: from random import * import numpy as np from numpy import ...