Zookeeper旨在分布式应用中,提供可靠的、可扩展的、分布式的、可配置的协调机制来管理整个集群的状态。
Zookeeper旨在分布式应用中,提供可靠的、可扩展的、分布式的、可配置的协调机制来管理整个集群的状态
一,Zookeeper的应用场景
1,集群管理
a,掌控集群服务器的数据
b,掌控集群服务器的地址
c,监控集群服务节点的运行状态,是正常运行还是宕机
2,统一命名服务:为集群中的每台服务器命名,便于管理。要求命名要具备全局唯一性
3,统一配置管理:使得集群全部或部分节点的配置信息保持一致
4,实现集群内部的主备切换,从而避免单点故障问题
5,实现数据的订阅和发布
6,分布式环境下的协调通知
7,实现分布式锁服务。在分布式环境下之前所学的同步代码块、重入锁机制等不能满足,因为是针对一台服务器内部的多个线程而言。所以要实现分布式锁,需要用新的技术和思路来实现。
针对第7点锁的补充:
活锁的产生:线程在执行任务中,由于某些条件的产生, 导致任务重新执行,再次碰撞,再碰撞,依次循环往复,就成型了活锁。处于活锁的线程都不能抢占到资源,危害是活锁的线程是非阻塞的,会造成CPU空转,白白耗费CPU资源。
二,Zookeeper的由来
来源于雅虎研究院,意思是动物园管理员,借鉴了Google的一篇论文《The Chubby Lock Service For losely coupled distributed System》。
1,Yahoo 2010年
2,Hadoop集群
3,Hive
4,Pig
5,Hbase
三,zookeeper结构
1,zookeeper有一个根节点 /(可以通过 ls /查看)
2,每一个节点都可以有自己的子节点
3,每一个节点称为znode节点
4,多个znode节点最终所形成称为znode树
5,每个znode节点都可以存储数据
6,zookeeper为了提供快速的数据访问,会将数据维系在内存中
7,zookeeper为了防止数据丢失,也会在磁盘上进行落地存储,存储的路径可以通过配置文件来指定(zookeeper/config/zoo.cfg下,dataDir=/home/software/zookeeper-3.4.7/tmp)
8,zk的所有操作指令,比如 查看、创建、更新、删除都是基于路径来操作的。
9,zookeeper中的路径是具有全局唯一性的,所有可以基于这个特性来实现命名服务。
Zookeeper服务端指令
指令 | 说明 |
sh zkServer.sh start | 启动zk服务的 |
sh zkServer.sh stop | 停止zk服务 |
sh zkServer.sh restart | 重启zk服务 |
sh zkServer.sh status | 查看zk服务角色,有: Standalone Leader Follower Observer |
sh zkCli.sh | 进入zk客户端 |
Zookeeper客户端指令
指令 | 说明 | 示例 |
ls | 查看 | ls / 查看根路径 ls /park01 查看park01路径 |
create | 创建 | create /park02 "" create /park02/node01 创建park02的子节点 |
get | 获取指定节点信息 | cZxid = 0x2 #创建此节点的事务id ctime = Wed Jan 17 10:55:25 PST 2018 #创建此节点的时间戳 mZxid = 0x2 #修改此节点的事务id mtime = Wed Jan 17 10:55:25 PST 2018 #修改此节点的时间戳 pZxid = 0x4 cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner= 0x0 #如果此节点不是临时节点,则为0 dataLength = 9#数据长度 numChildren = 1 #子节点数量 |
set | 更新节点数据 | set /park01 hellozk |
delete | 删除子节点为空的节点 | delete /park01 |
rmr | 递归删除指定节点 | rmr /park02 |
quit (或ctrl+c) | 退出客户端 | |
create -e | 创建临时节点,当创建此节点的客户端下线时,节点被删除。 | |
create -s | 创建顺序节点,每次创建节点时,会跟上一个递增的顺序号 | |
create -e -s | 创建临时顺序节点 | |