ZooKeeper源码研究系列(1)源码环境搭建

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

1 系列目录

2 搭建步骤

2.1 到github中fork该项目

项目地址 https://github.com/apache/zookeeper。fork完成之后就存至自己的仓库中了。

2.2 clone上述自己的仓库地址到本地

先看下大体的代码格式:

ZooKeeper的源码目录

2.3 使用ant对源码编译成eclipse工程

首先选定一个分支,我自己选择branch-3.4分支来进行源码研究。即

git checkout branch-3.4

上述源码还不是eclipse工程。需要使用ant eclipse命令来转换成eclipse工程。ant就不用再说了,自行网上搜索与配置。

ant eclipse

这里来重点说说ant eclipse执行失败的问题。

上述两个问题解决后,再重新执行ant eclipse命令。

2.4 导入项目到eclipse工程中

将eclipse的编译器版本设置为1.7。然后整个世界就安静了,终于不再报错了。下面就是要看看如何在eclipse中运行

3 运行ZooKeeper

我们首先看下单机版ZooKeeper的启动类org.apache.zookeeper.server.ZooKeeperServerMain。

它的启动参数有两种情况:

情况1:直接给出相应的参数设置。

有4个参数,前两个参数必填,后两个参数可选

对客户端暴漏出的端口port,dataDir的目录,tickTime值,maxClientCnxns值(最大的客户端连接数)。下面分别来简单介绍下:

  • 对客户端暴漏出的端口port,即如下客户端代码指定的端口

    new ZooKeeper("192.168.126.130:2181",5000,this)

  • dataDir的目录

    ZooKeeper有两类数据要存储。一种就是事务记录,另一种就是ZooKeeper的内存树中的数据,以快照方式存储。 所以可以给这两种数据指定不同的目录。dataDir用来指定内存树快照的存储位置,dataLogDir用来指定事务记录的存储位置。只给出了dataDir的目录,则代表两种数据都存储在该目录下。

  • tickTime值,单位ms,默认3000

    • 用途1:用于指定session检查的间隔

      服务器会每隔一段时间检查一次连接它的客户端的session是否过期。该间隔就是tickTime。

    • 用途2:用于给出默认的minSessionTimeout和maxSessionTimeout

      如果没有给出maxSessionTimeout和minSessionTimeout(为-1),则minSessionTimeout和maxSessionTimeout的取值如下:

      minSessionTimeout == -1 ? tickTime 2 : minSessionTimeout; maxSessionTimeout == -1 ? tickTime 20 : maxSessionTimeout;

      分别是tickTime的2倍和20倍。

      客户端代码在创建ZooKeeper对象的时候会给出一个sessionTimeout时间,而上述的minSessionTimeout和maxSessionTimeout就是用来约束客户端的sessionTimeout。源码如下:

      输入图片说明

  • maxClientCnxns值,用于指定服务器端最大的连接数。

参数说完了,我们就来设置一下:

ZooKeeper参数

同时,ZooKeeper采用log4j来作为日志输出,所以需要将log4j的配置文件(在conf文件夹中)放置到类路径下。

所以该项目右键,Build Path-》Add Class Folder 添加conf文件夹作为类路径的一部分。

然后就可以Run了。

情况2:给出配置文件地址

当org.apache.zookeeper.server.ZooKeeperServerMain类的启动参数只有一个时,则代表着配置文件的路径。

也可以修改conf文件夹中的zoo_sample.cfg配置文件,修改下dataDir指定的路径。然后把该配置文件的路径作为参数

配置文件启动

4 结束语

至此完成了ZooKeeper的源码环境搭建,可以随意修改和debug了。下一篇文章就会介绍下客户端和服务器端的交互过程。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
6天前
|
存储 负载均衡 算法
深入浅出Zookeeper源码(七):Leader选举
对于一个分布式集群来说,保证数据写入一致性最简单的方式就是依靠一个节点来调度和管理其他节点。在分布式系统中我们一般称其为Leader。
170 6
|
6天前
|
消息中间件 存储 Kafka
Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
【2月更文挑战第19天】Kafka【环境搭建 02】kafka_2.11-2.4.1 基于 zookeeper 搭建高可用伪集群(一台服务器实现三个节点的 Kafka 集群)
146 1
|
6天前
|
存储 算法 Java
【分布式】Zookeeper 使用环境搭建
【1月更文挑战第25天】【分布式】Zookeeper 使用环境搭建
|
6天前
|
Apache
Apache ZooKeeper - 构建ZooKeeper源码环境及StandAlone模式下的服务端和客户端启动
Apache ZooKeeper - 构建ZooKeeper源码环境及StandAlone模式下的服务端和客户端启动
47 2
|
6天前
|
存储 设计模式 算法
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
当我们向zk发出一个数据更新请求时,这个请求的处理流程是什么样的?zk又是使用了什么共识算法来保证一致性呢?带着这些问题,我们进入今天的正文。
140 1
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
|
6天前
|
存储 设计模式 算法
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
当我们向zk发出一个数据更新请求时,这个请求的处理流程是什么样的?zk又是使用了什么共识算法来保证一致性呢?带着这些问题,我们进入今天的正文。
117 0
|
6天前
|
Java API 开发者
深入浅出Zookeeper源码(四):Watch实现剖析
用过zookeeper的同学都知道watch是一个非常好用的机制,今天我们就来看看它的实现原理。 在正文开始前,我们先来简单回忆一下watch是什么? zk提供了分布式数据的发布/订阅功能——即典型的发布订阅模型,其定义了一种一对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态变化时,则会通知所有订阅者。具体来说,则是zk允许一个客户端向服务端注册一个watch监听,当服务端的一些指定事件触发了这个watch,那么就会向该客户端发送事件通知。
91 0
|
6天前
|
网络协议 数据库
深入浅出Zookeeper源码(五):BadVersionException到底是怎么一回事
最近在开发时偶尔会观测到zk报出`BadVersionException`,后在搜索引起上得知了是乐观锁相关的问题,很快就解决了问题。不过学而不思则罔:无论是单体应用还是分布式系统,在运行过程中总要有一种**机制**来保证数据排他性。接下来,我们就来看看zk是如何实现这种**机制**的。
105 1
|
6天前
|
网络协议 数据库
深入浅出Zookeeper源码(三):会话管理
我们知道zookeeper是一个分布式协同系统。在一个大型的分布式系统中,必然会有大量的client来连接zookeeper。那么zookeeper是如何管理这些session的生命周期呢?带着这个问题,我们进入今天的正文。
104 1
|
6天前
|
存储 关系型数据库 MySQL
深入浅出Zookeeper源码(二):存储技术
在上篇文章中,我们简单提到了Zookeeper的几个核心点。在这篇文章中,我们就来探索其存储技术。在开始前,读者可以考虑思考下列问题: - Zookeeper的数据存储是如何实现的? - Zookeeper进行一次写操作的时候,会发生什么å? - 当一个Zookeeper新加入现有集群时,如何同步现集群中的数据?
61 0