zookeeper是什么?
zookeeper是一个开放源代码的分布式协调服务是雅虎创建,是Google Chubby的开源实现。
设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使
用。
有哪些功能
zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于zookeeper实现数据发布/订阅、负载均衡,命名服
务,分布式协调/通知,集群管理,Master选举,分布式锁和分布式队列等功能。
zookeeper可以保证如下分布式一致性特性:
-
顺序一致性:从同一客户端发起的请求,最终将会严格按照其发起顺序被应用到zookeeper中。
-
原子性:所有的事务请求结果在整个集群中所有机器上的应用情况是一致的。不会出现集群中部分机器应用了该事务,而另一部分没用应用的情况。
-
单一视图:无论客户端连接那个zookeeper服务器,看到的服务器数据模型是一致的。
-
可靠性:一旦服务器成功地应用了一个事务,并完成对客户端的响应,那么该事务引起的服务端状态变更将会一直保留下来,除非有另一个事务对其进行变更。
-
实时性:zookeeper仅仅保证在一定时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
zookeeper的设计目标
zookeeper致力于提供一个高性能、高可用,且具有严格的顺序访问控制能力的分布式协调服务。
-
目标一:简单的数据模型 zookeeper使得分布式程序能够通过一个共享的、树型结构的名字空间来进行相互协调。
-
目标二:可以构建集群 一个zookeeper集群通常由一组机器组成。 组成zookeeper集群的每台机器都会在内存中维护当前的服务器状态,并且每一台机器之间都互相保持通信。只要集群中超过一半机器正常工作,那么整个集群就能够正常对外服务。
-
目标三:顺序访问 对于来自客户端的每个更新请求,zookeeper都会分配一个全局的递增编号,来反映所有事务操作的顺序,应用程序可以使用zookeeper的这个特性来实现更高层次的同步原语。
-
目标四:高性能 zookeeper将全量数据存储在内存中,并直接服务于客户端的所有的非事务请求,因此zookeeper尤其适用以读操作为主的应用场景。
Zookeeper数据模型
如果我们把zookeeper当成是一个内存数据库的话,那么crud就是对zookeeper内存数据库进行一个数 据的增删改查操作,那zookeeper的数据结构是什么样的呢?如图所示,zookeeper的视图结构和标 准的文件系统非常类似,每一个节点称之为ZNode, 是zookeeper的最小单元。每个znode上都可以保 存数据以及挂载子节点,构成一个层次化的树形结构

节点类型
Zookeeper中包含4种类型的节点,分别说明如下。
持久化节点
持久化节点可以细分为两种节点,分别是:
PERSISTENT:持久化,不会随客户端的断开而自动删除,默认类型

PERSISTENT_SEQUENTIAL:带序号的持久化,znode的名字将被附加一个单调递增的数字

临时节点
EPHEMERAL:临时节点,当客户端断开时自动删除,如图9-6所示,如果该Client创建了/Server1 和/Server2这两个节点,当Client的session断开后,这两个节点会被Zookeeper自动删除。

EPHEMERAL_SEQUENTIAL:带序号的临时节点,znode的名字将被附加一个单调递增的数字, 如图9-7所示 注意,临时节点不能存在子节点

Container节点
CONTAINER:container节点是一个特殊用途的节点,它是为Leader、Lock等操作而设计的节点 类型,它的作用是: 当容器节点的最后一个子节点被删除后,容器节点将会被标注并且在一段时 间后删除 。
由于容器节点存在这个特性,所以当我们在容器节点下创建一个子节点时,需要捕获 KeeperException.NoNodeException异常,如果捕获到这个异常,就需要重新创建容器节点。
TTL节点
如果某个节点设置为TTL节点类型,那么这个节点在指定TTL时间(单位为毫秒)段内没有修改并且没有 子节点时,该节点会在一段时间后被删除。
PERSISTENT_WITH_TTL:zookeeper的扩展类型,如果znode在给定的TTL内没有被修改,它将 在没有子节点时被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动 zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下 边),否则KeeperErrorCode = Unimplemented for /**。
设置zookeeper.extendedTypesEnabled=true
打开zookeeper bin/zkServer.sh(win是zkService.cmd),修改启动zookeeper的命令,加上Dzookeeper.extendedTypesEnabled=true,也就是设置java的一个环境变量。

PERSISTENT_SEQUENTIAL_WITH_TTL:同上,是不过是带序号的。
常用命令
\1. 启动ZK服务:
bin/zkServer.sh start
\2. 查看ZK服务状态:
bin/zkServer.sh status
\3. 停止ZK服务:
bin/zkServer.sh stop
\4. 重启ZK服务:
bin/zkServer.sh restart
\5. 连接服务器
zkCli.sh -timeout 0 -r -server ip:port
本文介绍了ZooKeeper,一款由雅虎开发的开源分布式协调服务。它简化了分布式系统中常见的复杂任务,如数据发布/订阅、负载均衡及集群管理等。ZooKeeper提供了简单易用的API,确保数据的一致性和可靠性。
750

被折叠的 条评论
为什么被折叠?



