zookeeper1==zookeeper源码阅读,源码启动ZK集群

下载源码

Tags · apache/zookeeper · GitHub

https://codeload.github.com/apache/zookeeper/zip/refs/tags/release-3.9.1

JDK8

MAVEN3.8.6

mvn -DskipTests=true package

配置ZK1

zkServer.cmd中指出了启动类是 QuorumPeerMain

QuorumPeer翻译成集群成员比较合理,Quorum集群Peer成员

在代码目录下新建data文件夹和log文件夹

并在data目录下创建myid文件,内容为1

在conf目录下新建zoo.cfg,内容为

复制代码
# zoo1.cfg
# 同步配置
tickTime=2000
initLimit=10
syncLimit=5
# 目录配置,注意需要 2个
dataDir=E:\\zk3.9.1\\data
dataLogDir=E:\\zk3.9.1\\log
# 端口配置
clientPort=2181
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890

配置启动ZK2和ZK3

直接上官方网站下载最近的版本的ZIP文件,作为集群的另两个节点启动,当然也可以拷贝刚才的源码额外从源码启动来作为两个节点。我这就直接下载官方打好的包了。

下载地址:Apache ZooKeeper

刚好有和源码对应的3.9.1,下载后指定配置文件和创建data目录和log目录,data目录下创建myid文件,里面的内容分别为2和3。

配置文件分别为

复制代码
# zoo1.cfg
# 同步配置
tickTime=2000
initLimit=10
syncLimit=5
# 目录配置,注意需要 2个
dataDir=E:\\zk-jiqun\\zk2\\data
dataLogDir=E:\\zk-jiqun\\zk2\\log
# 端口配置
clientPort=2182
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890

# zoo1.cfg
# 同步配置
tickTime=2000
initLimit=10
syncLimit=5
# 目录配置,注意需要 2个
dataDir=E:\\zk-jiqun\\zk3\\data
dataLogDir=E:\\zk-jiqun\\zk3\\log
# 端口配置
clientPort=2183
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890

启动zk2和zk3

从源码启动zk1加入集群

修改org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun方法

指定配置文件的路径(为什么要在这里改?研究下zkServer.cmd干了什么就知道了)

复制代码
//指定配置文件
        args=new String[1];
        args[0]="E:\\zk3.9.1\\conf\\zoo.cfg";

启动报错

说有个类找不到,java.lang.NoClassDefFoundError: com/codahale/metrics/Reservoir

找到该类所在包的引入位置把scope直接注释掉。我这为了方便直接所有scope都给注释掉了

再次启动,成功,zk1成了follwer

测试

启动个客户端,直接点击zkCli.cmd即可,默认连接上本机2181的ZK1。敲两个命令测试下

再连接上另一个节点,

zkCli.cmd -server localhost:2182

查看下刚才创建的ZNODE发现这台机上也能查到,说明集群是成功的。

查看谁是leader,看日志也能看出来。或者BASH环境执行zkServer.sh status

三个节点均使用源码启动

下一篇研究下zk1启动后发生了什么。大致上就是连接上配置文件中指定的集群内的其他SERVER,然后创建连接,然后根据ZAB协议找到LEADER。

相关推荐
songjxin7 小时前
离线部署kubernetes v1.34.3
云原生·容器·kubernetes
阿里云云原生8 小时前
Android App 崩溃排查实战:如何利用 RUM 完整数据与符号化技术定位问题?
android·阿里云·云原生·rum
熊出没10 小时前
Kubernetes 实操命令大全
云原生·容器·kubernetes
阿里云云原生10 小时前
深度解析云监控 2.0 日志审计:统一采集、实体建模与告警溯源能力
阿里云·云原生·云监控·可观测
脸大是真的好~10 小时前
分布式锁-基于redis实现分布式锁(不推荐)- 改进利用LUA脚本(不推荐)前面都是原理 - Redisson分布式锁
redis·分布式·lua
liuniansilence11 小时前
🚀 高并发场景下的救星:BullMQ如何实现智能流量削峰填谷
前端·分布式·消息队列
阿基米东14 小时前
Let‘s Encrypt 是什么?它是如何工作的?
云原生·https·云计算
故事写到这14 小时前
第一章 Ubuntu24.04环境下的K8S部署【入门保姆级】
云原生·容器·kubernetes
探索云原生14 小时前
Buildah 简明教程:让镜像构建更轻量,告别 Docker 依赖
linux·docker·云原生·go·cicd
走路带_风14 小时前
Ubuntu server 22.04 安装kubernetes
云原生·容器·kubernetes