
Zookeeper
文章平均质量分 82
Zookeeper源码
宋小生的博客
《中间件源码》 示例先行,深入浅出的源码解析分享
展开
-
从一个 Demo 说起 Zookeeper 服务端源码
可以看到启动一个单机版的Zookeeper服务并不复杂只需要配置属性,启动服务即可,前面的整个案例仅仅是一个入门案例可以方便借助开发工具来Debug源码,清晰的了解代码执行过程,更多原理与源码解析可以订阅微信公众号《中间件源码》及时获取。原创 2023-02-09 12:52:23 · 292 阅读 · 1 评论 -
[Zookeeper-3.6.2源码解析系列]-16-QuorumPeer主循环运行中的各状态的逻辑
QuorumPeer 类型是ZookeeperThread的子类型是一个线程类型,在QuorumPeer 中通过super.start()方法启动线程在线程中根据集群的状态来决定是否需要参与投票,加入集群 这里先贴一下线程运行的完整代码:集群节点状态 QuorumPeer#ServerState 枚举// 寻找leader状态。当服务器处于该状态时,它会认为当- 前集群中没有leader,因此需要进入leader选举状态。当处于LOOKING状态时我们看下核心逻辑:startLeaderElecti原创 2022-06-05 09:17:38 · 290 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-15-选举算法的准备等待选举
先来回顾下QuorumPeer的启动方法:15.2 开始选举源码启动时候从磁盘加载数据到内存,然后开启服务端的网络处理服务,然后开启一个管理端,接下来就进入比较重要的一个章节,选举功能QuorumPeer的startLeaderElection方法ZK节点状态角色ZK集群单节点状态(每个节点有且只有一个状态),ZK的定位一定需要一个leader节点处于lading状态。QuorumPeer的createElectionAlgorithm方法electionType 的值是哪里来的呢 其实是来源配原创 2022-06-04 10:39:22 · 440 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-14-Zookeeper使用到的Reactor网络模型原理分析
回到QuorumPeer的start()方法,数据恢复之后开始进行网络交互的startServerCnxnFactory();继续往下看:在QuorumPeerMain类型中的runFromConfig方法中调用ServerCnxnFactory.createFactory();方法创建连接工厂 在创建工厂对象方法中通过判断JVM参数zookeeper.serverCnxnFactory工厂类型配置参数是否存在,不存在的话将会默认NIOServerCnxnFactory类型创建连接对象的代码如下:Q原创 2022-06-03 09:48:02 · 484 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-13- 法定人对象QuorumPeer启动之加载磁盘快照与事务日志
目录13- 法定人对象QuorumPeer启动之加载磁盘快照与事务日志13.1 简介12.3 恢复本地数据到内存的模板方法13.3 Zookeeper数据库管理加载磁盘快照的核心方法13.3.1 事务快照日志的恢复过程这里我们主要看两个点就行了 :13.3.2 反序列化事务快照日志的过程13.4 事务增量日志加载13- 法定人对象QuorumPeer启动之加载磁盘快照与事务日志13.1 简介前面我们了解了管理协议的法定人对象QuorumPeer的启动方法如下//重写了线程的start方法 start原创 2022-05-29 09:45:31 · 314 阅读 · 1 评论 -
[Zookeeper-3.6.2源码解析系列]-12- 管理协议的法定人对象QuorumPeer创建与初始化
目录12 QuorumPeer是什么12 .1 简介11.2 管理协议的法定人对象QuorumPeer 启动12 QuorumPeer是什么12 .1 简介在前面我们说到QuorumPeerMain使用配置运行的时候 <<10-使用配置信息启动运行入口>>相关代码如下: //节点创建与配置初始化 quorumPeer = getQuorumPeer(); quorumPeer.setTxnFactory(new FileTxnSnapLog原创 2022-05-28 08:47:41 · 187 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-11- ServerCnxnFactory 服务器连接工厂对象的创建与属性初始化
10- ServerCnxnFactory 服务器连接工厂对象的创建与属性初始化回顾QuorumPeerMain类型中根据配置来启动的代码runFromConfig方法public void runFromConfig(QuorumPeerConfig config) throws IOException, AdminServerException { try { ManagedUtil.registerLog4jMBeans(); } catch原创 2022-05-21 09:22:42 · 175 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-10-使用配置信息启动运行入口
10-使用配置信息启动运行入口在 QuorumPeerMain类型中前面我看了解了刚刚启动时候的配置加载,日志清理工具开启,接下来我们先回顾一下:protected void initializeAndRun(String[] args) throws ConfigException, IOException, AdminServerException { //配置加载前面看过 QuorumPeerConfig config = new QuorumPeerConfig();原创 2022-05-21 09:13:06 · 204 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-9-日志清理定时任务的启动
9-日志清理定时任务的启动9.1 简介前面我们说了程序刚刚启动时候会去加载配置信息,配置信息加载完毕之后将会启动一个清理日志的工具(这个工具非常有用) 接下来详细看下:QuorumPeerMain的初始化和启动方法initializeAndRun如下protected void initializeAndRun(String[] args) throws ConfigException, IOException, AdminServerException { QuorumPeerCo原创 2022-05-21 09:06:53 · 403 阅读 · 0 评论 -
[Zookeeper-3.6.2源码解析系列]-10-可观测性信息的开启
9-可观测性信息的开启9.1 Log4j JMX mbean针对Java的JMX MBean可以参考地址:JMX官网链接先来看第一步注册log4j JMX mbean 设置环境变量zookeeper.jmx.log4j.disable为true可以禁用注册.我们往往需要运行时调整一下日志记录水平参数,又不想重启进程然后将配置全部重新Load一次, JMX就排上用场了。Log4j是内置JMX的支持,对于这个问题是有很好的解决的。只需要把相应的Log4j对象包装到MBean中去并注册到MBean服务器原创 2022-05-15 09:05:52 · 531 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-8-配置信息是如何加载到内存空间的
8-配置信息是如何加载到内存空间的8.1 配置信息的加载过程在执行zkServer命令启动Zookeeper的时候,Zookeeper启动脚本在启动java进程时会主动为Java进程加上java参数conf文件位置,默认为Zookeeper文件夹的conf目录下的zoo.cfg文件,在Zookeeper入口函数QuorumPeerMain类中的main方法执行时可以通过args[0]获取conf文件路径在初始化的时候执行如下代码进行解析配置: QuorumPeerConfig config = ne原创 2022-05-01 20:37:23 · 1117 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-7-服务器启动流程入个门
7-服务器启动流程入个门7.1 程序入口默认情况下我们会执行命令bin/zkServer.sh start启动zookeeper服务端程序,打开zkServer.sh可以看到有这样配置主类ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"和启动命令nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PRO原创 2022-05-01 20:25:24 · 1164 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-6-Watch监听通知机制简介
目录6-Watch监听通知机制简介6.1 Watcher接口6.2 IWatchManager 接口6.3 WatchManager6-Watch监听通知机制简介6.1 Watcher接口此接口指定事件处理程序类必须具有的公共接口实施。ZooKeeper客户端将从ZooKeeper获取各种事件它所连接的服务器。使用这种客户机的应用程序处理这些通过向客户机注册回调对象。回调对象应为实现观察者接口的类的实例。6.2 IWatchManager 接口在DataTree中有两个IWatchManager类原创 2022-04-22 23:50:52 · 2238 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-5-Zookeeper的树形节点的基础数据模型
目录5-Zookeeper的基础数据模型5.1 Zookeeper节点存储5.1.1 DataNode类型5.1.2 StatPersisted5.1.3 DataTree5.1.4 NodeHashMap5-Zookeeper的基础数据模型5.1 Zookeeper节点存储在Zookeeper中基础数据使用树形结构来存储对应源码中的类型为DataTree,树中的节点在这里称为znode对应源码中的类型为DataNode。5.1.1 DataNode类型DataNode类型主要用来存储节点的数据,原创 2022-04-21 21:15:30 · 1396 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-5-源码下载与源码目录解析
目录5-源码下载与源码目录解析5.1 源码下载5.2 源码目录说明5-源码下载与源码目录解析5.1 源码下载首先我们访问github官方仓库来拉取最新代码 https://github.com/apache/zookeeper克隆代码:git clone https://github.com/apache/zookeeper.git或者git clone git@github.com:apache/zookeeper.git查看版本列表git tag切换到3.6.2版本:git ch原创 2022-04-20 21:07:07 · 1131 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-5-教你如何用Zookeeper开发锁与生产者消费者?(来自官网的学习笔记)
目录5-教你如何用Zookeeper开发锁与生产者消费者?5.1 使用Java和Zookeeper开发一个生产者消费者队列例子5.2 分布式锁5.3 共享锁:5.4 使用锁来进行主节点选举5.5 Java客户端使用Java和Zookeeper开发一个屏障例子5-教你如何用Zookeeper开发锁与生产者消费者?5.1 使用Java和Zookeeper开发一个生产者消费者队列例子所谓的生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题。通俗的讲,就是生产者在不断的生产,消费者也在不断的消费原创 2022-04-15 18:47:40 · 1203 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-4-客户端的入门使用(来自官网的学习笔记)
4客户端的使用?4.1 命令行客户端打开安装目录的bin目录输入命令bin/zkCli.sh -server 127.0.0.1:2181就可以进去zookeeper的脚本页面可以输入help查看当前支持的命令的用法命令用法如下4.2 zookeeper常用命令是什么?这里列举个表格Zookeeper链接过程发生了哪些状态变更,分别在什么场景下发生的?Java客户端使用Java和Zookeeper开发一个屏障例子barrier是一种原语,允许一组线程/进程在到达某个栅栏点(common原创 2022-04-13 21:10:13 · 952 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-3-zookeeper安装配置(来自官网的学习笔记)
3 zookeeper安装配置?可以打开如下地址找到自己所需要的版本进行下载https://zookeeper.apache.org/releases.html#download下载文件中一共有两个地址一个是带源码的下载一个是不带源码的下载可以根据自己需要进行下载,下载完毕之后可以对文件进行解压,我们可以看下不带源码的安装目录其中主要包含了bin目录下的脚本文件,conf配置文件,lib依赖库,docs离线教程等3.1单个机器单个节点如何启动需要什么配置?独立模式启动比较简单可以执行bin目录下面原创 2022-04-09 11:39:29 · 1126 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-2-Zookeeper的实现(来自官网的学习笔记)
2 Zookeeper的实现2.1 主要组成Zookeeper服务主要由几大部分组成,请求处理器,原子广播,可复制的数据库等组件组成主要的请求处理如下图所示可复制的数据库可复制的数据库是一个包含整个数据树的内存数据库,更新被记录到磁盘上以保证可恢复性,写操作在更新内存数据库之前会先将数据序列化到磁盘来做持久化。读请求处理客户端只连接到一个服务器来提交请求。读取请求由每个服务器数据库本地副本提供服务。写请求处理作为协议的一部分,所有来自客户端的写请求都被转发到一个名为leader的服务器上,Z原创 2022-04-09 11:33:20 · 1769 阅读 · 0 评论 -
[Zookeeper版本3.6.2源码系列]-1-Zookeeper的设计简介(来自官网的学习笔记)
1 Zookeeper的设计1.1 什么是Zookeeper?可用于实现高度可靠的分布式高性能协调的服务,Zookeeper是用于维护配置信息,命名,提供分布式同步以及提供组服务的集中式服务,使用Zookeeper可以实现共识,组管理,领导者选举和状态协议,也可以根据自己的需求来构建分布式应用功能,Zookeeper目前是apache下的开源项目,本文档以3.6.2版本进行说明。代码位置:https://github.com/apache/zookeeper/tree/release-3.6.21.原创 2022-04-01 08:37:49 · 709 阅读 · 0 评论