简单介绍zookeeper几个什么叫核心概念念

&&&从Paxos到Zookeeper:分布式一致性原理与实践
自营订单满49元(含)免运费
不足金额订单收取运费5元起
邀请好友参加吧
开 本:16开纸 张:胶版纸包 装:平装是否套装:否国际标准书号ISBN:9所属分类:&&
下载免费当当读书APP
下载当当读书APP,免费阅读万本电子书。
本商品暂无详情。
当当价:为商品的销售价,具体的成交价可能因会员使用优惠券、积分等发生变化,最终以订单结算页价格为准。
划线价:划线价格可能是图书封底定价、商品吊牌价、品牌专柜价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品曾经展示过的销售价等,由于地区、时间的差异化和市场行情波动,商品吊牌价、品牌专柜价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:折扣指在划线价(图书定价、商品吊牌价、品牌专柜价、厂商指导价等)某一价格基础上计算出的优惠比例或优惠金额。如有疑问,您可在购买前联系客服咨询。
异常问题:如您发现活动商品销售价或促销信息有异常,请立即联系我们补正,以便您能顺利购物。
当当购物客户端手机端1元秒
当当读书客户端万本电子书免费读博客分类:
[转载请注明作者和,
如有谬误, 欢迎在评论中指正. ]
通过之前的3篇博文, 讲述了ZooKeeper的基础知识点. 可以看出, ZooKeeper提供的核心功能是非常简单, 且易于学习的. 可能会给人留下ZooKeeper并不强大的印象, 事实并非如此, 基于ZooKeeper的核心功能, 我们可以扩展出很多非常有意思的应用. 接下来的几篇博文, 将陆续介绍ZooKeeper的典型应用场景.
在分布式应用中, 我们经常同时启动多个server, 调用方(client)选择其中之一发起请求.分布式应用必须考虑高可用性和可扩展性: server的应用进程可能会崩溃, 或者server本身也可能会宕机. 当server不够时, 也有可能增加server的数量. 总而言之, server列表并非一成不变, 而是一直处于动态的增减中.那么client如何才能实时的更新server列表呢? 解决的方案很多, 本文将讲述利用ZooKeeper的解决方案.
启动server时, 在zookeeper的某个znode(假设为/sgroup)下创建一个子节点. 所创建的子节点的类型应该为ephemeral, 这样一来, 如果server进程崩溃, 或者server宕机, 与zookeeper连接的session就结束了, 那么其所创建的子节点会被zookeeper自动删除. 当崩溃的server恢复后, 或者新增server时, 同样需要在/sgroup节点下创建新的子节点.对于client, 只需注册/sgroup子节点的监听, 当/sgroup下的子节点增加或减少时, zookeeper会通知client, 此时client更新server列表.
实现AppServer
AppServer的逻辑非常简单, 只须在启动时, 在zookeeper的"/sgroup"节点下新增一个子节点即可.
public class AppServer {
private String groupNode = "sgroup";
private String subNode = "sub";
* 连接zookeeper
* @param address server的地址
public void connectZookeeper(String address) throws Exception {
ZooKeeper zk = new ZooKeeper("localhost:4180,localhost:4181,localhost:4182", 5000, new Watcher() {
public void process(WatchedEvent event) {
// 不做处理
// 在"/sgroup"下创建子节点
// 子节点的类型设置为EPHEMERAL_SEQUENTIAL, 表明这是一个临时节点, 且在子节点的名称后面加上一串数字后缀
// 将server的地址数据关联到新创建的子节点上
String createdPath = zk.create("/" + groupNode + "/" + subNode, address.getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("create: " + createdPath);
* server的工作逻辑写在这个方法中
* 此处不做任何处理, 只让server sleep
public void handle() throws InterruptedException {
Thread.sleep(Long.MAX_VALUE);
public static void main(String[] args) throws Exception {
// 在参数中指定server的地址
if (args.length == 0) {
System.err.println("The first argument must be server address");
System.exit(1);
AppServer as = new AppServer();
as.connectZookeeper(args[0]);
as.handle();
将其打成appserver.jar后待用, 生成jar时别忘了指定入口函数. 具体的教程请自行搜索.
实现AppClient
AppClient的逻辑比AppServer稍微复杂一些, 需要监听"/sgroup"下子节点的变化事件, 当事件发生时, 需要更新server列表.注册监听"/sgroup"下子节点的变化事件, 可在getChildren方法中完成. 当zookeeper回调监听器的process方法时, 判断该事件是否是"/sgroup"下子节点的变化事件, 如果是, 则调用更新逻辑, 并再次注册该事件的监听.
public class AppClient {
private String groupNode = "sgroup";
private ZooK
private Stat stat = new Stat();
private volatile List&String& serverL
* 连接zookeeper
public void connectZookeeper() throws Exception {
zk = new ZooKeeper("localhost:4180,localhost:4181,localhost:4182", 5000, new Watcher() {
public void process(WatchedEvent event) {
// 如果发生了"/sgroup"节点下的子节点变化事件, 更新server列表, 并重新注册监听
if (event.getType() == EventType.NodeChildrenChanged
&& ("/" + groupNode).equals(event.getPath())) {
updateServerList();
} catch (Exception e) {
e.printStackTrace();
updateServerList();
* 更新server列表
private void updateServerList() throws Exception {
List&String& newServerList = new ArrayList&String&();
// 获取并监听groupNode的子节点变化
// watch参数为true, 表示监听子节点变化事件.
// 每次都需要重新注册监听, 因为一次注册, 只能监听一次事件, 如果还想继续保持监听, 必须重新注册
List&String& subList = zk.getChildren("/" + groupNode, true);
for (String subNode : subList) {
// 获取每个子节点下关联的server地址
byte[] data = zk.getData("/" + groupNode + "/" + subNode, false, stat);
newServerList.add(new String(data, "utf-8"));
// 替换server列表
serverList = newServerL
System.out.println("server list updated: " + serverList);
* client的工作逻辑写在这个方法中
* 此处不做任何处理, 只让client sleep
public void handle() throws InterruptedException {
Thread.sleep(Long.MAX_VALUE);
public static void main(String[] args) throws Exception {
AppClient ac = new AppClient();
ac.connectZookeeper();
ac.handle();
将其打包成appclient.jar后待用, 别忘了指定入口函数.
在运行jar包之前, 需要确认zookeeper中是否已经存在"/sgroup"节点了, 没有不存在, 则创建该节点. 如果存在, 最好先将其删除, 然后再重新创建. ZooKeeper的相关命令可参考我的另一篇博文.运行appclient.jar: java -jar appclient.jar 开启多个命令行窗口, 每个窗口运行appserver.jar进程:java -jar appserver.jar server0000. "server0000"表示server的地址, 别忘了给每个server设定一个不同的地址. 观察appclient的输出.依次结束appserver的进程, 观察appclient的输出.appclient的输出类似于:
server list updated: []
server list updated: [server0000]
server list updated: [server0000, server0001]
server list updated: [server0000, server0001, server0002]
server list updated: [server0000, server0001, server0002, server0003]
server list updated: [server0000, server0001, server0002]
server list updated: [server0000, server0001]
server list updated: [server0000]
server list updated: []
浏览 23910
文章不错。要跑通例子程序,需要先创建EPHEMERAL类型的“sgroup”。“sgroup”如果为EPHEMERAL类型的,是不能建立子节点的吧,会报NoChildrenForEphemeralsException的错误
浏览: 760256 次
来自: 北京
浏览量:71647
xunux 写道windows下,dataDir目录若是用需要 ...
我是按照你的伪集群进行配置的
然后启动第二个和第三个 ...
博主应该把vector设定为全局变量,更加清晰一些
jps16437 QuorumPeerMain16663 Zo ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'世界上唯一不用努力就能得到的,只有年龄
Zookeeper核心机制
  Zookeeper是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠的协调系统,提供的功能包括命名服务、配置维护、分布式同步、集群服务等。
  Zookeeper是可以集群复制的,集群间通过Zab(Zookeeper Atomic Broadcast)协议来保持数据的一致性。
  该协议包括2个阶段:leader election阶段和Actomic broadcast阶段。集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过broadcast将所有的更新告诉follower。当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。当leader被选举出来,且大多数服务器完成了和leader的状态同步后,leader election的过程就结束了,将进入Atomic broadcast的过程。Actomic broadcast同步leader和follower之间的信息,保证leader和follower具备相同的系统状态。
  Zookeeper集群的结构图如下:
路由和负载均衡的实现
  当服务越来越多,规模越来越大时,对应的机器数量也越来越庞大,单靠人工来管理和维护服务及地址的配置信息,已经越来越困难。并且,依赖单一的硬件负载均衡设备或者使用LVS、Nginx等软件方案进行路由和负载均衡调度,单点故障的问题也开始凸显,一旦服务路由或者负载均衡服务器宕机,依赖其的所有服务均将失效。如果采用双机高可用的部署方案,使用一台服务器“stand by”,能部分解决问题,但是鉴于负载均衡设备的昂贵成本,已难以全面推广。
  一旦服务器与ZooKeeper集群断开连接,节点也就不存在了,通过注册相应的watcher,服务消费者能够第一时间获知服务提供者机器信息的变更。利用其znode的特点和watcher机制,将其作为动态注册和获取服务信息的配置中心,统一管理服务名称和其对应的服务器列表信息,我们能够近乎实时地感知到后端服务器的状态(上线、下线、宕机)。Zookeeper集群间通过Zab协议,服务配置信息能够保持一致,而Zookeeper本身容错特性和leader选举机制,能保证我们方便地进行扩容。
  Zookeeper中,服务提供者在启动时,将其提供的服务名称、服务器地址、以节点的形式注册到服务配置中心,服务消费者通过服务配置中心来获得需要调用的服务名称节点下的机器列表节点。通过前面所介绍的负载均衡算法,选取其中一台服务器进行调用。当服务器宕机或者下线时,由于znode非持久的特性,相应的机器可以动态地从服务配置中心里面移除,并触发服务消费者的watcher。在这个过程中,服务消费者只有在第一次调用服务时需要查询服务配置中心,然后将查询到的服务信息缓存到本地,后面的调用直接使用本地缓存的服务地址列表信息,而不需要重新发起请求到服务配置中心去获取相应的服务地址列表,直到服务的地址列表有变更(机器上线或者下线),变更行为会触发服务消费者注册的相应的watcher进行服务地址的重新查询。这种无中心化的结构,使得服务消费者在服务信息没有变更时,几乎不依赖配置中心,解决了之前负载均衡设备所导致的单点故障的问题,并且大大降低了服务配置中心的压力。
  通过Zookeeper来实现服务动态注册、机器上线与下线的动态感知,扩容方便,容错性好,且无中心化结构能够解决之前使用负载均衡设备所带来的单点故障问题。只有当配置信息更新时服务消费者才会去Zookeeper上获取最新的服务地址列表,其他时候使用本地缓存即可,这样服务消费者在服务信息没有变更时,几乎不依赖配置中心,能大大降低配置中心的压力。
zookeeper集群
ZooKeeper Distributed模式
ZooKeeper集群中具有两个关键的角色:Leader和Follower。集群中所有的结点作为一个整体对分布式应用提供服务,集群中每个结点之间都互相连接,所以,在配置的ZooKeeper集群的时候,每一个结点的host到IP地址的映射都要配置上集群中其它结点的映射信息。
zookeeper 监控
zookeeper-monitor
监控zookeeper server 健康状态的各种指标:
未完成客户端请求数
leader/follower 状态
临时节点数
近似数据大小 应该是一个总和的值
打开文件描述符 数
最大文件描述符 数
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!记录技术笔记
5分钟让你了解 ZooKeeper 的功能和原理
一 .Zookeeper功能简介
ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。
分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协
调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列
二 . ZooKeeper基本概念
本节将介绍 ZooKeeper 的几个核心概念
因此有必要预先了解这些概念。
一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。
ZooKeeper 配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值} 的{数值}部分。
zoo.cfg配置文件示例
在装有 ZooKeeper 的机器的终端执行 zookeeper-server status 可以看当前节点的
ZooKeeper是什么角色(Leader or Follower)。
ZooKeeper 默认只有 Leader 和 Follower 两种角色,没有 Observer 角色。为了使用 Observer 模式,在任何想变成Observer的节点的配置文件中加入:peerType=observer 并在所有 server 的配置文件中,配置成 observer 模式的 server 的那行配置追加 :observer
2 . 节点读写服务分工
1.ZooKeeper 集群的所有机器通过一个 Leader 选举过程来选定一台被称为『Leader』
的机器,Leader服务器为客户端提供读和写服务。
2.Follower 和 Observer 都能提供读服务,不能提供写服务。两者唯一的区别在于,
Observer机器不参与 Leader 选举过程,也不参与写操作的『过半写成功』策略,因
此 Observer 可以在不影响写性能的情况下提升集群的读性能。
3 . Session
Session 是指客户端会话,在讲解客户端会话之前,我们先来了解下客户端连接。在
ZooKeeper 中,一个客户端连接是指客户端和 ZooKeeper 服务器之间的TCP长连接。
ZooKeeper 对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP
连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通
过心跳检测和服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同
时还能通过该连接接收来自服务器的 Watch 事件通知。
Session 的 SessionTimeout 值用来设置一个客户端会话的超时时间。当由于服务器
压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在
SessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话
仍然有效。
4 . 数据节点
zookeeper的结构其实就是一个树形结构,leader就相当于其中的根结点,其它节点就相当于
follow节点,每个节点都保留自己的内容。
zookeeper的节点分两类:持久节点和临时节点
- 持久节点:
所谓持久节点是指一旦这个 树形结构上被创建了,除非主动进行对树节点的移除操
作,否则这个 节点将一直保存在 ZooKeeper 上。
- 临时节点:
临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创
建的所有临时节点都会被移除。
5 . 状态信息
每个 节点除了存储数据内容之外,还存储了 节点本身的一些状态信息。用 get 命令可以
同时获得某个 节点的内容和状态信息
在 ZooKeeper 中,version 属性是用来实现乐观锁机制中的『写入校验』的(保证分布
式数据原子性操作)。
6 .事物操作
在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点
创建与删除、数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,ZooKeeper
都会为其分配一个全局唯一的事务ID,用 ZXID 表示,通常是一个64位的数字。每一个 ZXID
对应一次更新操作,从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些事务操作请求的
全局顺序。
7 .Watcher(事件监听器)
是 ZooKeeper 中一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些 Watcher,
并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去。该
机制是 ZooKeeper 实现分布式协调服务的重要特性。
三 .ZooKeeper应用的典型场景
ZooKeeper 是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架
能够很好地保证分布式环境中数据的一致性。也是基于这样的特性,使得 ZooKeeper 成为了
解决分布式一致性问题的利器。
1 . 数据发布与订阅(配置中心)
数据发布与订阅,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,
供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和动态更新。
对于:数据量通常比较小。数据内容在运行时动态变化。集群中各机器共享,配置一致。
这样的全局配置信息就可以发布到 ZooKeeper上,让客户端(集群的机器)去订阅该消息。
发布/订阅系统一般有两种设计模式,分别是推(Push)和拉(Pull)模式。
服务端主动将数据更新发送给所有订阅的客户端
客户端主动发起请求来获取最新数据,通常客户端都采用定时轮询拉取的方式
ZooKeeper 采用的是推拉相结合的方式:
客户端想服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应
的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据
2 . 命名服务
命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使用命名服务,客户端
应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的
机器,提供的服务,远程对象等等——这些我们都可以统称他们为名字。
其中较为常见的就是一些分布式服务框架(如RPC)中的服务地址列表。通过在ZooKeepr里
创建顺序节点,能够很容易创建一个全局唯一的路径,这个路径就可以作为一个名字。
ZooKeeper 的命名服务即生成全局唯一的ID。
3 . 分布式协调服务/通知
ZooKeeper 中特有 Watcher 注册与异步通知机制,能够很好的实现分布式环境下不同机器,
甚至不同系统之间的通知与协调,从而实现对数据变更的实时处理。使用方法通常是不同的客户端
如果 机器节点 发生了变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应
ZooKeeper的分布式协调/通知,是一种通用的分布式系统机器间的通信方式。
4 . Master选举
Master 选举可以说是 ZooKeeper 最典型的应用场景了。比如 HDFS 中 Active NameNode 的选举、YARN 中 Active ResourceManager 的选举和 HBase 中 Active HMaster 的选举等。
针对 Master 选举的需求,通常情况下,我们可以选择常见的关系型数据库中的主键特性来
实现:希望成为 Master 的机器都向数据库中插入一条相同主键ID的记录,数据库会帮我们进行
主键冲突检查,也就是说,只有一台机器能插入成功——那么,我们就认为向数据库中成功插入数据
的客户端机器成为Master。
依靠关系型数据库的主键特性确实能够很好地保证在集群中选举出唯一的一个Master。
但是,如果当前选举出的 Master 挂了,那么该如何处理?谁来告诉我 Master 挂了呢?
显然,关系型数据库无法通知我们这个事件。但是,ZooKeeper 可以做到!
利用 ZooKeepr 的强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够
保证全局唯一性,即 ZooKeeper 将会保证客户端无法创建一个已经存在的 数据单元节点。
也就是说,如果同时有多个客户端请求创建同一个临时节点,那么最终一定只有一个客户端
请求能够创建成功。利用这个特性,就能很容易地在分布式环境中进行 Master 选举了。
成功创建该节点的客户端所在的机器就成为了 Master。同时,其他没有成功创建该节点的
客户端,都会在该节点上注册一个子节点变更的 Watcher,用于监控当前 Master 机器是否存
活,一旦发现当前的Master挂了,那么其他客户端将会重新进行 Master 选举。
这样就实现了 Master 的动态选举。
5 . 分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式
分布式锁又分为排他锁和共享锁两种
ZooKeeper如何实现排它锁?
ZooKeeper 上的一个 机器节点 可以表示一个锁
把ZooKeeper上的一个节点看作是一个锁,获得锁就通过创建临时节点的方式来实现。
ZooKeeper 会保证在所有客户端中,最终只有一个客户端能够创建成功,那么就可以
认为该客户端获得了锁。同时,所有没有获取到锁的客户端就需要到/exclusive_lock
节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。
因为锁是一个临时节点,释放锁有两种方式
当前获得锁的客户端机器发生宕机或重启,那么该临时节点就会被删除,释放锁
正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除,释放锁。
无论在什么情况下移除了lock节点,ZooKeeper 都会通知所有在 /exclusive_lock 节点上注册了节点变更 Watcher 监听的客户端。这些客户端在接收到通知后,再次重新发起分布式锁获取,即重复『获取锁』过程。
共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。
本文介绍的 Zookeeper 的基本知识,以及介绍了几个典型的应用场景。这些都是 Zookeeper
的基本功能,最重要的是 Zoopkeeper 提供了一套很好的分布式集群管理的机制,就是它这种基于
层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数
据管理模型,而不仅仅局限于上面提到的几个常用应用场景
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 核心概念 的文章

 

随机推荐