Zookeeper是一款开源的分布式存储系统。
ZooKeeper主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
Zookeeper分成客户端和服务端两部分,服务端通常运行于集群模式,统一为客户端提供分布式数据一致性管理服务,集群可提供水平扩展能力,以及避免单点故障。
ZooKeeper让分布式进程可通过共享的、与标准文件系统类似的分层名字空间相互协调。名字空间由znode组成,znode是和文件目录类似的树形结构。有子节点,并且ZooKeeper为znode提供了常驻内存服务,提高性能。
Zookeeper还提供了数据动态监测机制, 客户端注册监听它关心的目录节点,当znode发生变化(数据改变、被删除、子目录节点增加删除)时,客户端会触发注册事件。
ZooKeeper的实现很重视高性能、高可用性,以及严格的顺序访问。高性能意味着可将ZooKeeper用于大的分布式系统。可靠性使之可避免单点失败。严格的顺序访问使得客户端可以实现复杂的同步原语。
服务端通常有多台服务器,这些服务器都通过QuorumPeer进程维持分布式系统间的数据交换,选举领导者(Leader)和追随者(Follower),动态监控集群,一旦发生节点故障则重新启动选举流程,选出新的Leader。每个服务器维护相同的一份全局数据,通过QuorumPeer维持数据之间的同步,这样提供高可靠性和横向扩展性。
源码地址:https://github.com/apache/zookeeper
文件目录结构,为了方便解析整个ZooKeeper的源码结构,这里只是列出主要的目录和文件:
-
/:根目录下主要是ZooKeeper客户端相关的文件
-
/cli:命令行方式的Java类
-
/server:ZooKeeperServer相关,为ZooKeeper客户端提供服务
-
/server/command:服务端命令
-
/server/admin:ZooKeeper服务端Web管理,基于Jetty实现
-
/server/persistence:事务日志和快照的持久化
-
/server/quorum:集群间状态维护和切换,实现分布式事务
客户端提供的操作包括启动、关闭、创建节点、设置节点数据、删除节点、获取节点、获取节点数据等。这里只是取其中的几个命令做为示例。
主要客户端命令表:
-
ls:获取子路径列表
-
create:创建路径和数据
-
delele:删除路径
-
get:获取路径的数据
-
set:设置路径的数据
-
connect:连接服务端
-
close:关闭与服务端连接
-
quit:退出客户端
-
setacl:设置znode路径的Acl
-
getacl:获取znode路径的Acl
1)启动客户端
zkCli.sh
2)连接服务端
Connect 10.10.27.21
3)创建路径节点
创建一个新的 znode ,使用 create /test “hello” 。这个命令在根目录下创建了一个新的 znode 节点“ test ”以及与它关联的字符串:
4)获取目录
使用 ls 命令来查看当前 ZooKeeper 中所包含的内容,这里显示/目录下有test、zookeeper两个子节点。
5)获取节点数据
运行 get 命令来确认第二步中所创建的 znode ,显示znode的数据、创建时间等状态信息。
示例数据:
6)设置节点数据
通过 set 命令来对 zk 所关联的字符串进行设置,设置/test路径的数据为“welcome!”。
7)删除节点
delete /test
这篇就先了解一下zookeeper的应用场景和基本操作,还有Watch功能是监听zookeeper目录结构的变化的,发生变化时所有连接到zookeeper的客户端都会实时收到事件,表明zookeeper的哪个目录内容发生了变化,变化前后的数据分别是什么。通过watch功能,所有zookeeper客户端实现了分布式一致性存储和及时更新。