zookeeper的文件系统、shell常用命令、及监听机制的shell命令
初识zookeeper
hadoop 存在分布式一致性。包括:
数据一致性: 集群中的每一个节点的配置文件保持一致。
状态一致性: namenode的存活状态一致。
一致性理论:
2000年的 CAP理论。在cap理论中,一致性是指强一致性。
C:consistency:一致性
A:Availability:可用性(高可用)
P:Partition:Tolerance分区容错性。
CAP 理论中,C和A是冲突的,不可实现的。
`
CAP 理论中,C和A是冲突的,不可实现的。
`
Base理论:
`
针对cap理论,c和a的折中。
base理论中,一致性指最终一致性。
高可用,是指基本可用。
`
一致性中,保证多个副本的一致性,多副本写入时,只能允许一个入口,这个入口就是 主 master,所以需要选主。
选主:paxos理论
`
paxos理论是一致性选主的理论。此理论来源于希腊的邦主选主。过半选举的机制。
paxos算法的最完美的实现:zookeeper
其它的都是不完美实现。
`
zookeeper是一款成熟的分布式协调框架。
zookeeper的文件系统
文件系统:
- 1)zk的文件系统的结构类似于linux的,从 / 开始
- 2)zk的文件系统访问方式:绝对路径 (访问任何路径都要从 / 开始(类似于hdfs))
- 3)zk中不存在目录的概念,也不存在文件的概念,只存在znode(节点)的概念。这里的znode既具有文件的功能,又具有目录的功能。
zookeeper中znode的分类:
按照节点类型,分为:
- 1)永久节点
create + 参数 + 路径 + 内容
eg:create bd1906 “hello” - 2)临时节点
创建: create + -e + path + data
eg:create -e /test “test linshi”
注意:
1)临时节点只对当前客户端生效,只要当前客户端退出,则临时节点会自动删除。而永久节点则对所有客户端生效,不会自动删除。
2)临时节点不可以有子节点,永久节点可以。(有子节点的节点一定是永久节点)
按照有无编号,可以分为:
- 1、有编号节点:
创建: create -s path data
在创建节点的时候,会自动分配一个编号,一个节点可以无限创建,这个编号是父节点维护的,从0开始顺序递增,但是在递增的过程中,无论父节点下的子节点是否有编号,都会递增(无编号会默默递增)。 - 2、无编号节点:
只允许创建一次。(再次创建会报错)
各种类型节点创建方式:
各种znode的创建方式:
create path data 创建永久无编号节点
create -s path data 创建永久有编号节点
create -e path data 创建临时无编号节点
create -e -s path data 创建临时有编号节点
对于zk来说,znode存储的大小不要超过1m,最好不要超过1kb, 这样做的好处是:
- 1)便于数据同步,速度快(zk中每一个节点存储的数据都是一致的,只要在一个节点进行操作,其他节点自动进行数据同步)
- 2)减少存储,减少zk中每一个节点(机器)的压力。(对于zk来说,存储的数据的份数:有几个zk节点(机器),就存几份。)
- 3)在zk中,是可以添加监听的,监听的对象只能是znode
zookeeper常用的 shell 操作命令
1、进入zookeeper的客户端:zkCli.sh
zkCli.sh
出现 [zk: localhost:2181(CONNECTED) 0]
即表示成功进入了客户端
2、查看帮助: help
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history 查看历史命令 eg:history 10
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit 退出客户端
getAcl path
close 关闭连接
connect host:port 连接其他客户端 eg:connect hadoop02:2181
3、添加节点:create [-s] [-e] path data acl
create [-s] [-e] path data acl
eg:
[zk: localhost:2181(CONNECTED) 17] create /dd "this is dd"
Created /dd
3、查看节点内容: get path [watch]
get path [watch]
eg:
[zk: localhost:2181(CONNECTED) 8] get /aa
aa的内容
cZxid = 0x59000004de
ctime = Mon Dec 02 10:51:10 CST 2019
mZxid = 0x9500000370
mtime = Sun Dec 29 06:06:42 CST 2019
pZxid = 0x8a00000048
cversion = 2
dataVersion = 22
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0
4、查看子节点: ls path
ls path
eg:
[zk: localhost:2181(CONNECTED) 13] ls /bb
[cc]
5、修改节点内容:set path data
set path data
eg: set /bb/cc "hello"
[zk: localhost:2181(CONNECTED) 14] set /bb/cc "hello"
cZxid = 0x950000038b
ctime = Sun Dec 29 06:37:22 CST 2019
mZxid = 0x950000038e
mtime = Sun Dec 29 06:44:19 CST 2019
pZxid = 0x950000038b
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
6、删除节点:delete 、rmr
delete path 删除空节点(没有子节点的节点)
rmr path 可以级联删除非空节点
7、stat path: 查看节点状态信息
stat path
eg:
[zk: localhost:2181(CONNECTED) 0] stat /aa
cZxid = 0x1700000002
ctime = Wed Oct 09 14:20:34 CST 2019 创建时间
mZxid = 0x170000000d
mtime = Wed Oct 09 15:07:15 CST 2019 修改时间
pZxid = 0x170000000a
cversion = 3 创建时的版本编号
dataVersion = 1 数据版本
aclVersion = 0 权限版本
ephemeralOwner = 0x0 临时节点的拥有者
如果是永久节点,值是0x0
如果是临时节点,这里是临时节点的客户端的sessionId
dataLength = 9 存储的内容的长度(单位是byte)
numChildren = 3 子节点的个数
cZxid = 0x1700000002
mZxid = 0x170000000d
pZxid = 0x170000000a
cZxid ,mZxid,pZxid 全局的时间提交的顺序,是全局顺序递增的
cZxid 创建节点的事件id
mZxid 修改节点的事件id
pZxid 子节点变化的事件id
这3个id,共同标识,全局事件的提交顺序。
zk中各个节点(机器)上,哪一个节点的zxid越大,代表这个节点(机器)上的数据越新
8、退出zookeeper文件系统:quit
quit
[zk: localhost:2181(CONNECTED) 0] quit
Quitting...
zookeeper的监听机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、 节点删除、 子目录节点增加删除)时, ZooKeeper 会通知客户端。 监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。
监听器的工作机制,其实是在客户端会专门创建一个监听线程,在本机的一个端口上等待
zk 集群发送过来事件。
注意:shell命令下,监听只生效一次。
1)监听的事件类型
- NodeDataChanged 节点存储的内容是否发生变化
- NodeDeleted 节点是否删除了
- NodeCreated 节点是否被创建事件
- NodeChildrenChanged 当前节点是否创建了子节点
2)添加监听(关注事件)
shell 命令下 watch
ls path watch ---> 子节点变化nodechildrenchanged
get path watch ----> 节点内容变化 nodedatachanged
exists ---> nodecreated nodedeleted
3)触发监听
create 创建节点
delete rmr 删除节点
set path data 修改节点
zk的核心就是:用监听机制,监听文件系统。实现分布式数据一致性。
需要注意的是:监听只生效一次, 添加一次监听,只能生效一次 ,只能触发一次
监听测试
监听子节点变化
添加监听
ls path watch
eg:ls /bb watch
触发监听:
create /bb/aa " "
在客户端就会出现提示:
WATCHER::
WatchedEvent state: type:NodeChildrenChanged path:/bb
watcher 就是监听器的意思。
监听内容变化
添加监听
get path watch
eg:get /aa watch
触发监听:
set path data
eg:set /aa "tt"
NodeDataChanged
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/aacZxid = 0x59000004de
监听删除节点
添加监听
ls path watch
eg:ls /bb/cc watch
触发监听:
delete path
eg:delete /bb/cc
在客户端出现提示:
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/bb/cc