`
zhangxiong0301
  • 浏览: 359749 次
社区版块
存档分类
最新评论

zookeeper疑问

阅读更多

今年年初的时候,写了一篇ZooKeeper的入门文章《初识ZooKeeper》,一直到这一周,才有时间将ZooKeeper整个源码通读了一遍。不能说完全理解了ZooKeeper的工作原理与细节,但是之前心中一直关于ZooKeeper的疑问都得到了解释。

现在网上关于ZooKeeper的文章很多,有介绍Leader选举算法的,有介绍ZooKeeper Server内部原理的,还有介绍ZooKeeper Client的。本文不打算再写类似的内容,而专注与解答读者对ZooKeeper的相关疑问。

ZOOKEEPER在客户端究竟做了什么事情

使用过ZooKeeper的读者都知道,初始化客户端的代码如下:

 

System.out.println("Starting ZK:");
zk = new ZooKeeper(address, 3000, this);
System.out.println("Finished starting ZK: " + zk);

 

完成客户段的初始化之后,就可以对ZooKeeper进行相应的操作了:

 

if (zk != null) {
    try {
        Stat s = zk.exists(root, false);
        if (s == null) {
            zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
                    CreateMode.PERSISTENT);
        }
    } catch (KeeperException e) {
        System.out
                .println("Keeper exception when instantiating queue: "
                        + e.toString());
    } catch (InterruptedException e) {
        System.out.println("Interrupted exception");
    }
}

 

虽然上面的代码看起来简单明了,但是ZooKeeper的客户端在后台默默做了许多事情:

  1 与ZooKeeper服务端进行通信,包括:连接,发送消息,接受消息。

  2 发送心跳信息,保持与ZooKeeper服务端的有效连接与Session的有效性。

  3 错误处理,如果客户端当前连接的ZooKeeper服务端失效,自动切换到另一台有效的ZooKeeper服务端。

  4 管理Watcher,处理异常调用和Watcher。

WATCHER的事件通知机制是如何实现的

看过Google的分布式锁机制Chubby论文会发现,ZooKeeper中多了一个事件订阅机制:Watcher。那么Watcher内部究竟是如何实现的呢?

其实,在ZooKeeper客户端中,有一个成员变量(ZKWatchManager)专门负责管理所有的Watcher,当用户使用如下代码时:

 

List<String> list = zk.getChildren(path, watcher);

 

ZooKeeper会将这个Watcher存储在ZKWatchManager中,同时通知ZooKeeper服务器记录该Client对应的Session中的Path下注册的事件类型。当ZooKeeper服务器发生了指定的事件后,ZooKeeper服务器将通知ZooKeeper客户端,ZooKeeper客户端再从ZKWatchManager中找到对应的回调函数,并予以执行。

整个过程中,客户端存储事件的信息和Watcher的执行逻辑,服务端只存储事件的信息。

如何用好ZOOKEEPER客户端

每实例化一个ZooKeeper客户端,就开启了一个Session。ZooKeeper客户端是线程安全的,也可以认为它实现了连接池。

因此,每一个应用只需要实例化一个ZooKeeper客户端即可,同一个ZooKeeper客户端实例可以在不同的线程中使用。

除非你想同一个应用中开启多个Session,使用不同的Watcher,在这种情况下,才需要实例化多个ZooKeeper客户端。

ZOOKEEPER是否对ZNODE有大小限制

如果你仔细看过ZooKeeper的文档,会发现文档中对ZNode的大小做了限制,最大不能超过1M。

这个1M的大小限制在ZooKeeper的客户端和服务端都有限制:

客户端:

 

packetLen = Integer.getInteger("jute.maxbuffer", 4096 * 1024);

int len = incomingBuffer.getInt();
if (len < 0 || len >= packetLen) {
	throw new IOException("Packet len" + len + " is out of range!");
}

 

服务端:

 

static public final int maxBuffer = determineMaxBuffer();
private static int determineMaxBuffer() {
    String maxBufferString = System.getProperty("jute.maxbuffer");
    try {
        return Integer.parseInt(maxBufferString);
    } catch(Exception e) {
        return 0xfffff;
    }
    
}

if (len < 0 || len > maxBuffer) {
    throw new IOException("Unreasonable length = " + len);
}

 

可以看出,ZooKeeper确实对数据的大小有限制,默认就是1M,如果希望传输超过1M的数据,可以修改环境变量“jute.maxbuffer”即可。

为什么要限制ZOOKEEPER中ZNODE的大小

ZooKeeper是一套高吞吐量的系统,为了提高系统的读取速度,ZooKeeper不允许从文件中读取需要的数据,而是直接从内存中查找。

还句话说,ZooKeeper集群中每一台服务器都包含全量的数据,并且这些数据都会加载到内存中。同时ZNode的数据并支持Append操作,全部都是Replace。

所以从上面分析可以看出,如果ZNode的过大,那么读写某一个ZNode将造成不确定的延时;同时ZNode过大,将过快地耗尽ZooKeeper服务器的内存。这也是为什么ZooKeeper不适合存储大量的数据的原因。

如何提升ZOOKEEPER集群的性能

我们说性能,可以从两个方面去考虑:写入的性能与读取的性能。

由于ZooKeeper的写入首先需要通过Leader,然后这个写入的消息需要传播到半数以上的Fellower通过才能完成整个写入。所以整个集群写入的性能无法通过增加服务器的数量达到目的,相反,整个集群中Fellower数量越多,整个集群写入的性能越差。

ZooKeeper集群中的每一台服务器都可以提供数据的读取服务,所以整个集群中服务器的数量越多,读取的性能就越好。但是Fellower增加又会降低整个集群的写入性能。为了避免这个问题,可以将ZooKeeper集群中部分服务器指定为Observer。

分享到:
评论

相关推荐

    activemq和zookeeper资源

    标题中的"activemq"和"zookeeper"是两个在分布式系统中广泛使用的开源软件。activemq是Apache基金会开发的消息中间件,主要用于处理应用程序之间的消息传递,...如果有任何疑问,联系提供者获取帮助是非常明智的选择。

    zookeeper.zip

    在分布式系统领域,Zookeeper 和 SpringCloud 是两个重要的组件,它们在构建大规模、高可用的应用架构中发挥着关键作用。...同时,如果有任何疑问,可以通过博客或留言的方式寻求解答,进一步提高自己的技能。

    kafka0.8.1+zookeeper3.4.9+storm0.9.1

    搭建storm+kafka+zookeeper环境所需要的三个环境组件,里面的参数已经配置完成,你只需要把对应的集群的ipHost换成你搭建的ip即可,已经成功搭建并测试,如果有疑问可以访问本人的博客,里面有详细的配置可供参考

    ZooKeeper的安装及部署教程

    ZooKeeper的安装及部署教程 ZooKeeper是一个针对大型...如果大家有任何疑问,请随时留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    linux上安装zookeeper 启动和关闭的教程

    在Linux系统中安装和管理Apache ZooKeeper是一项重要的任务,因为Zookeeper是一个分布式协调服务,广泛用于分布式系统中的数据管理...如果你有任何疑问或需要进一步的指导,请随时提问。同时,感谢你对我们网站的支持!

    阿里巴巴—蚂蚁金服.pdf

    描述:“这里主要是阿里巴巴技术面试环节的问题,如果大家对面试题目,面试流程,或者java上的任何技术问题,有疑问的,都可以私信我。” 从标题和描述来看,这份文档很有可能是关于阿里巴巴集团旗下的蚂蚁金服在...

    PyPI 官网下载 | kenn-1.0.tar.gz

    标题中的“PyPI 官网下载 | kenn-1.0.tar.gz”表明这是一个在Python Package Index(PyPI)上发布的软件包,名为...如果有任何疑问或需要进一步的帮助,开发者通常会在项目的GitHub页面或相关论坛上寻求社区的支持。

    SpringBoot整合Dubbo

    SpringBoot整合Dubbo,包括ZooKeeper,包括3个项目:1.传统的eclipse开发的点对点的Dubbo入门项目。2.加入注册中心ZooKeeper,dubbo和ZooKeeper整合。3使用SpringBoot整合Dubbo...内有详细文档,如有疑问,请咨询本人。

    PyPI 官网下载 | indexiterator-0.1.0.tar.gz

    标题中的"PyPI 官网下载 | indexiterator-0.1.0.tar.gz"表明这是一个在Python Package Index(PyPI)官方仓库上发布的软件包,名为`indexiterator...如果有任何疑问,还可以参考项目提供的示例代码或向项目维护者提问。

    hadoop&hbase;高可用测试环境搭建

    在构建大数据处理和存储系统时,Hadoop和HBase是两个关键组件。Hadoop是一个开源框架,主要用于分布式存储和计算,而HBase是基于Hadoop的...在实际操作中,如有疑问,应查阅官方文档或相关社区资源,以确保搭建成功。

    PyPI 官网下载 | ftw.slider-3.0.0.tar.gz

    5. 如果有疑问或遇到问题,可以在PyPI页面查找联系方式,或者在社区如Stack Overflow上寻求帮助。 由于没有实际的库源代码和详细文档,以上都是基于标签和通用知识的推测。对于具体的技术实现和应用场景,需要更多...

    分布式ID生成器的解决方案总结.docx

    百度的UidGenerator是基于Snowflake算法的实现,但在国内开源项目的维护性方面可能存在疑问。 9. Leaf 美团的Leaf是一个更全面的ID生成器,支持全局唯一、趋势递增、单调递增和信息安全,但需要依赖数据库和...

    SpringBoot-Dubbo:SpringBoot整合Dubbo服务

    SpringBoot-Dubbo脚手架项目 构建 Zookeeper + Dubbo + Spring Boot 的分布式调用项目 安装 Zookeeper 并启动 Zookeeper 服务 安装 Dubbo 服务端 ...如果对项目有任何疑问或者建议,欢迎到我的博客留言!

    dubbo demo in maven

    【标题】"dubbo demo in maven"是一个关于在Maven工程中实现Dubbo示例的项目,旨在帮助开发者理解如何在开发环境中整合并运用Dubbo框架。Dubbo是阿里巴巴开源的一...如果有任何疑问,可以直接联系项目的作者进行咨询。

    百度地图毕业设计源码-spring-boot-seckill:spring-boot-秒杀

    IDEA、SpringBoot1.5.10、zookeeper3.4.6、kafka_2.11、redis-2.8.4、curator-2.10.0 启动说明 启动前 请配置 application.properties 中相关redis、zk以及kafka相关地址,建议在Linux下安装使用。 数据库脚本位于 ...

    百度地图毕业设计源码-seckill:秒杀系统改进

    JDK1.7、Maven、Mysql、Eclipse、SpringBoot1.5.10、zookeeper3.4.6、kafka_2.11、redis-2.8.4、curator-2.10.0 启动说明 启动前 请配置 application.properties 中相关redis、zk以及kafka相关地址,建议在Linux下...

    百度地图毕业设计源码-spring-boot-seckill:大佬秒杀的源码mark学习

    JDK1.7、Maven、Mysql、Eclipse、SpringBoot1.5.10、zookeeper3.4.6、kafka_2.11、redis-2.8.4、curator-2.10.0 启动说明 启动前 请配置 application.properties 中相关redis、zk以及kafka相关地址,建议在Linux下...

Global site tag (gtag.js) - Google Analytics