赞
踩
ZooKeeper集群目前有两种角色:leader、follower;
ZooKeeper集群也是主从架构的:leader为主,follower为从
通过客户端操作ZooKeeper集群,有两种类型的客户端:
# 启动ZooKeeper集群;在ZooKeeper集群中的每个节点执行此命令
${ZK_HOME}/bin/zkServer.sh start
# 停止ZooKeeper集群(每个节点执行以下命令)
${ZK_HOME}/bin/zkServer.sh stop
# 查看集群状态(每个节点执行此命令)
${ZK_HOME}/bin/zkServer.sh status
# 使用ZooKeeper自带的脚本,连接ZooKeeper的服务器
zkCli.sh -server node01:2181,node02:2181,node03:2181
# 端口位于${ZK_HOME}/conf/zoo.cfg配置文件的cliport属性
-server选项后指定参数node01:2181,node02:2181,node03:2181
表示客户端随机的连接三个服务器中的一个
客户端发出对ZooKeeper集群的读写请求
ZooKeeper集群中有类似于linux文件系统的一个简版的文件系统;目录结构也是树状结构(目录树)
重要技巧:不会就喊help
常用命令:
#查看ZooKeeper根目录/下的文件列表
ls /
#创建节点,并指定数据
create /kkb kkb
#获得某节点的数据
get /kkb
#修改节点的数据
set /kkb kkb01
#删除节点
delete /kkb
编程分两类:原生API编程;curator编程
分布式通信有几种方式:
1、直接通过网络连接的方式进行通信;
2、通过共享存储的方式,来进行通信或数据的传输
ZooKeeper使用第二种方式,提供分布式协调服务
ZooKeeper=①简版文件系统(Znode)+②原语+③通知机制(Watcher)
4.2.1 什么是ZNode
持久节点 | 临时节点 | |
---|---|---|
非有序节点 | create | create -e |
有序节点 | create -s | create -s -e |
4.2.2 持久节点
# 创建节点/zk_test,并设置数据my_data
create /zk_test my_data
# 持久节点,只有显示的调用命令,才能删除永久节点
delete /zk_test
4.2.3 临时节点
# client1上创建临时节点
create -e /tmp tmpdata
# client2上查看client1创建的临时节点 此时临时结点存在
ls /
# client1断开连接
close
# client2上观察现象,发现临时节点被自动删除
ls /
4.2.4 有序节点
ZNode也可以设置为有序节点
有序结点可以防止多个不同的客户端在同一目录下,创建同名ZNode,由于重名,导致创建失败
如何创建有序结点:
命令行使用-s选项:create -s /tmp data
Curator编程,可添加一个特殊的属性:CreateMode.EPHEMERAL
一旦节点被标记上这个属性,那么在这个节点被创建时,ZooKeeper 就会自动在其节点后面追加上一个整型数字
# 创建持久、有序节点
create -s /test01 test01-data
# Created /test010000000009
4.4.1 什么是会话
客户端要对ZooKeeper集群进行读写操作,得先与某一ZooKeeper服务器建立TCP长连接,此TCP长连接称为建立一个会话Session。
每个会话有超时时间:SessionTimeout
当客户端与集群建立会话后,如果超过SessionTimeout时间,两者间没有通信,会话超时
4.4.2 会话的特点
4.4.3 会话的生命周期
- 会话的生命周期包括:
事务:
事务特点:
ZXID结构:
4.6.1 为什么要有Watcher
方式一轮询:ZooKeeper以远程服务的方式,被客户端访问;客户端以轮询的方式获得znode数据,效率会比较低(代价比较大)
方式二基于通知的机制:
4.6.2 什么是Watcher
4.6.3 如何设置Watcher
注意:Watcher是一个单次触发的操作
可以设置watcher的命令如下:
示例1
#ls path [watch]
#node01 上执行
ls /zk_test watch
#node02 上执行
create /zk_test/dir01 dir01-data
#观察node-01上变化
[zk: node-01:2181,node-02:2181,node-03:2181(CONNECTED) 87]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zk_test
结果如图所示:
#监控节点数据的变化;
#node02上
get /zk_test watch
#node03上
set /zk_test "junk01"
#观察node2上cli的输出,检测到变化
示例3:节点上下线监控
原理:
用到的zk特性:
Watcher+临时节点
好处:
通过这种方式,检测和被检测系统不需要直接关联(如client1与client2),而是通过ZK上的某个节点进行关联,大大减少了系统耦合。
实现:
client1操作
# 创建临时节点
create -e /zk_tmp tmp-data
client2操作
# 在/zk_tmp注册监听器
ls /zk_tmp watch
client1操作
# 模拟节点下线
close
观察client2
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/zk_tmp
结果如图所示:
ZooKeeper应用场景:
NameNode使用ZooKeeper实现高可用.
Yarn ResourceManager使用ZooKeeper实现高可用.
利用ZooKeeper对HBase集群做高可用配置
kafka使用ZooKeeper:
zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题。
ACL(Access Control List)可以设置某些客户端,对zookeeper服务器上节点的权限,如增删改查等。
ZooKeeper 采用 ACL(Access Control Lists)策略来进行权限控制。ZooKeeper 定义了如下5种权限:
注意:CREATE 和 DELETE 都是针对子节点的权限控制。
7.1.3 如何设置ACL
# 1)增加一个认证用户
# addauth digest 用户名:密码明文
addauth digest zsc:zsc
# 2)设置权限
# setAcl /path auth:用户名:密码明文:权限
setAcl /zk_test auth:zsc:zsc:rw
# 3)查看ACL设置
getAcl /zk_test
运行结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。