
Zookeeper概述
Zookeeper 是一种分布式的,开源的,应用于分布式应用的协作服务。它提供了一些简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和分集群或者命名的服务。
Zookeeper 很容易编程接入,它使用了一个和文件树结构相似的数据模型。可以使用 Java或者 C来进行编程接入。其本质是分布式锁服务,可以在Storm集群中协调不同节点之间的工作。
- 与单机系统不同:内存地址一致、单机出问题概率低
- 分布式系统:一致性问题、容灾容错、执行顺序问题、事务性问题
Zookeeper数据模型
Zookeeper有一个树形层次机构的命名空间,ZooKeeper 树中的每个节点被称为—Znode。和文件系统的目录树一样,ZooKeeper 树中的每个节点可以拥有子节点。但也有不同之处:
- 引用方式必须是绝对路径,即一个文件有且仅有一个表示。
- ZooKeeper 命名空间中的Znode,兼具文件和目录两种特点。既像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。图中的每个节点称为一个 Znode。 Znode包含stat(状态信息、版本、权限)、data(关联的数据)、children(子节点)。
- ZooKeeper 可以关联一些数据,如分布式应用中的配置文件信息、状态信息、汇集位置等等。这些数据的共同特性就是它们都是很小的数据,通常以 KB为大小单位。
- ZooKeeper 中的每个节点存储的数据要被原子性的操作。也就是说读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
- 节点类型:Persistent Nodes(永久有效地节点,除非client 显式的删除,否则一直存在)、Ephemeral Nodes(:临时节点,仅在创建该节点 client 保持连接期间有效,一旦连接丢失,zookeeper 会自动删除该节点。)、Sequence Nodes(:顺序节点,client 申请创建该节点时, ZooKeeper 会自动在节点路径末尾添加递增序号,这种类型是实现分布式锁,分布式queue 等特殊功能的关键。)
- 客户端可以在节点上设置watch,我们称之为监视器。当节点状态发生改变时(Znode的增、删、改)将会触发watch所对应的操作。当 watch被触发时,ZooKeeper 将会向客户端发送且仅发送一条通知,watch仅能被触发一次。ZooKeeper可以为所有的读操作设置watch,这些读操作包括: exists()、 getChildren()及 getData()。
- 风险:客户端有可能看不到所有数据的变化,多个事件的监控有可能只会触发一次。
Zookeeper访问控制
Zookeeper中node的ACL不像传统文件系统,其是没有继承关系,是独立控制的。
用一个三元组来定义客户端的访问权限:(scheme:expression,perms)
- ip:19.22.0.0/16,READ)表示ip地址(机制)以19.22开头(用户)的主机有该数据节点的读权限(权限)
模式 | 描述 |
World | 它下面只有一个id, 叫anyone, world:anyone 代表任何人 |
Auth | 已经被认证的用户 |
Digest | 通过username:password字符串的 MD5 编码认证用户 |
Host | 匹配主机名后缀 |
IP | 通过IP 识别用户,表达式格式为 addr/bits |
权限 | 描述 |
Create | 由创建子节点的权限 |
Read | 有读取节点数据和子节点列表的权限 |
Write | 有修改节点数据的权限、无创建和删除子节点的权限 |
Delete | 有删除子节点的权限 |
Admin | 有设置节点权限的权限 |
Zookeeper应用场景
- 数据发布与订阅(配置中心):发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK 节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。
- 分布式锁服务:分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。锁服务可以分为两类,一个是保持独占,另一个是控制时序。(像保安一样!如果有多台机器请求,那当第一台进入后就锁定系统,不会接受其他机器的操作请求
- 分布式队列
在分布是系统中我们需要一个全局的主控,协调或控制中心。需要一个松散耦合的分布式系统中粗粒度锁以及可靠性存储(低容量)的系统。
- 松散耦合:对硬件的依赖性不强
- 分布式系统:在分布式里面服务
- 粗粒度锁:不需要特别精细、只需要保证每台机器可以协调看工作
- 可靠性存储:存储一些数据/信息
Zookeeper的特点
- Hadoop
- 开源、高效、可靠的协同工作系统
- 名字服务器、分布式同步、组服务
- Chubby
- Paxos协议
Zookeeper基础操作
./ start # 启动zk服务
./ status # 查看zk的运行状态
./ # 客户端连接zk
# 如下命令是客户端已经连接zk后
help 查看帮助命令
ls / # 查看节点
create /zk_test my_data # 创建节点 zk_test 节点内容为my_data
create -e /zk_test my_data #创建临时节点
#断开重连之后,临时节点自动消失
create -s /zk_test my_data #创建顺序节点 自动累加
create -s /zk_test my_data #创建顺序节点 自动累加
set /zk_test junk # 设置/修改/zk_test节点数据为junk
set /zk_test junk # 乐观锁
get /zk_test # 获取节点数据
get /zk_test watch #使用get命令添加watch事件
delete /zk_test # 删除节点
deleteall /zk_test # 如果删除的节点存在子节点,删除失败,使用以下命令。
stat /zk_test # 查看节点状态
stat /zk_test watch ## 添加watch 事件
# 对于zk_test的增、删、改都会触发watcher事件
ls2 /zookeeper # ls和stat命令的整合get获取节点数据和更新信息
- cZxid :创建节点的id
- ctime : 节点的创建时间
- mZxid :修改节点的id
- mtime :修改节点的时间
- pZxid :子节点的id
- cversion : 子节点的版本
- dataVersion : 当前节点数据的版本
- aclVersion :权限的版本
- ephemeralOwner :判断是否是临时节点
- dataLength : 数据的长度
- numChildren :子节点的数量
# crwda(即每个q权限单词的首字符缩写)
# 使用[scheme:id:permissions]来表示acl权限
getAcl /zk_test # 获取某个节点的acl权限信息
setAcl /zk_test world:anyone:crwa # 设置节点权限 crwa 不允许删除
yum install nc # 安装nc 四字命令
echo stat | nc 192.168.0.68 2181 # 查看状态信息
echo ruok | nc 192.168.0.68 2181 # 查看zk是否启动
echo dump | nc 192.168.0.68 2181 # 列出没有处理的节点、临时节点
echo conf | nc 192.168.0.68 2181 # 查看服务器配置
echo cons | nc 192.168.0.68 2181 # 显示连接到服务端的信息
echo envi | nc 192.168.0.68 2181 # 显示环境变量
echo wchs | nc 192.168.0.68 2181 # 查看watch的信息
















