
ZooKeeper源码分析
文章平均质量分 81
菜鸟+1024
这个作者很懒,什么都没留下…
展开
-
ZooKeeper源码分析十八之原子广播
一、原子广播当完成Leader选举或者集群崩溃恢复之后,就开始原子广播过程,这个过程是保证当前集群中的数据一致性,原子广播也就是ZAB协议的实现过程。选举出来的Leader中的事务id,通常来说是集群中最新的,但是Follower和Observer节点可能存在数据不一致的情况,此时需要进行数的同步操作。我们以Follower节点为例,完成Leader选举之后,会调用followLeader()方法,方法中首先会设置当前的ZAB状态为DISCOVERY。self.setZabState(QuorumPe原创 2022-01-05 16:54:54 · 567 阅读 · 0 评论 -
ZooKeeper源码分析十七之崩溃恢复
一、崩溃恢复崩溃恢复一般指当前集群中不存在Leader节点时,此时集群处于一个崩溃的状态需要及时的选举出新的Leader,然后进行数据一致性处理,Leader崩溃是指,Leader节点退出或者重启以及集群中半数Follower不能与Leader保持通信,此时认为处于崩溃状态。针对这几种情况从源码角度分析集群的恢复过程。1、Leader宕机或者重启出现这种情况是,集群中的Follower节点会重新选举新的Leader节点,此时我们从Follower节点来分析,新的Leader发起过程。在完成Leader原创 2022-01-05 14:08:23 · 1795 阅读 · 0 评论 -
ZooKeeper源码分析十六之集群下Leader数据处理流程
一、LeaderLeader处理写请求,发起Proposal提案给Follower进行表决,协调集群中其它节点,同步最新数据给集群中其它节点。QuorumPeer的run方法中会根据当前的状态是LEADING执行对应的操作: //设置当前leader setLeader(makeLeader(logFactory)); //调用lead方法 leader.lead(); setLeader(null); vo原创 2022-01-05 10:37:58 · 781 阅读 · 0 评论 -
ZooKeeper源码分析十五之集群下Follower数据处理流程
一、FollowerFollower节点在集群中会参与投票以及Leader选举,同样会转发事务请求给Leader节点,然后通过Leader发起的投票进行表决,通过后提交当前事务。如果是写请求直接执行操作。与Observer节点不一样的地方在于Follower会参与投票和Leader选举。QuorumPeer的run方法中会根据当前的状态是FOLLOWING执行对应的操作 setFollower(makeFollower(logFactory)); follower.f原创 2022-01-04 16:25:07 · 290 阅读 · 0 评论 -
ZooKeeper源码分析十四之集群下Observer数据处理流程
一、请求处理前文分析了Leader选举过程,完成选举之后,就会把对应节点设置成对应的状态,我们知道集群中有三种角色Leader、Follower、Observer,分别对应着源码中的LEADING、FOLLOWING、OBSERVING。还是回到QuorumPeer的run方法: public void run() { try { while (running) { switch (getPeerState()) {原创 2022-01-04 14:42:23 · 728 阅读 · 0 评论 -
ZooKeeper源码分析十三之Leader选举(2)
一、QuorumPeer的run方法前文,只是为Leader选举做好前期准备,但是还没触发选举过程,在start方法中,调用完startLeaderElection()后,会启动QuorumPeer线程,接下来我们就从他的run方法入手。 public void run() { try { while (running) { switch (getPeerState()) { case LOOK原创 2021-12-31 18:14:05 · 613 阅读 · 0 评论 -
ZooKeeper源码分析十二之Leader选举(1)
一、节点角色ZooKeeper中节点角色有Leader、Follower、Observer。Leader:负责处理处理写请求、协调集群中的其它节点、发起投票,以及同步最新数据给其它节点Follower:负责读请求,当接收到写请求会转发当前的写请求给Leader节点,参与Leader选举Observer:负责读请求,不参与Leader选举二、源码分析接下我们从源码的角度去分析ZooKeeper中的ZAB实现过程,回到集群启动的QuorumPeer的start方法: public syn原创 2021-12-31 10:34:52 · 325 阅读 · 0 评论 -
ZooKeeper源码分析十一之ZAB协议
一、数据一致性1、背景随着业务的不断增大,单点系统不足以支撑业务的不断壮大,此时就引出了分布式服务,分布式服务就是把原本的单点系统进行拆分,拆分又分为水平拆分和垂直拆分,水平拆分按照分层模式来拆分,比如表示层和业务逻辑层进行拆分,分别部署到不同的机器上,每一层还可以进行集群搭建,垂直拆分就是把一个系统进行模块化拆分,比如电商系统中的用户模块、购物车模块、订单模块等,每个模块单独部署,所以通过服务拆分,集群部署等多种技术提高了原来系统的可用性。在分布式环境中节点故障、网络的不可靠性等因素,给构建高性能、原创 2021-12-29 17:37:10 · 601 阅读 · 0 评论 -
ZooKeeper源码分析十之集群启动
一、ZooKeeper集群我们先模拟搭建一个ZooKeeper集群环境:第一步,把下载好的文件复制好三份第二步,准备三个数据目录第三步,在每个数据目录下创建myid文件,文件内容分别写入1、2、3第四步,修改每个zoo.cfg配置文件,具体修改内容如下,不同的服务使用不同的clientPort端口tickTime=2000initLimit=10syncLimit=5dataDir=D:\\zookeeper\\data1clientPort=2181server.1=127.0.原创 2021-12-29 11:50:51 · 495 阅读 · 0 评论 -
ZooKeeper源码分析九之Watcher机制
一、什么是WatcherWatcher是观察员的意思,ZooKeeper中Watcher就是观察节点状态变化的观察员,也就是说ZooKeeper通过在节点上添加一个Watcher来感知节点的变化,我们先来看一个简单样例:先通过命令创建一个/wathcer节点:通过get命令注册一个watcher通知在该节点上:再起一个客户端去修改当前的节点值:此时,原来的客户端就会接收到一条通知:当我们再去修改节点值的时候,就会发现客户端不在收到节点变化通知,说明watcher是一次性的。以上大致处理原创 2021-12-28 17:35:50 · 653 阅读 · 0 评论 -
ZooKeeper源码分析八之Session管理
一、Session客户端成功连接到服务端表示一个会话建立成功,会话成功建立后,客户端和服务端就可以正常的交互,所以本文将从服务端源码级来探寻ZooKeeper中的Session管理机制。还是先回到NIOServerCnxn的doIO方法,这是处理客户端连接的入口方法,由之前的分析我们知道,客户端请求建立连接时候,会先调用readConnectRequest()方法,这个方法是处理客户端的连接请求,转而又调用ZooKeeperServer中的processConnectRequest方法(省略了部分代码)原创 2021-12-27 14:49:42 · 589 阅读 · 0 评论 -
ZooKeeper源码分析七之通信协议
一、序列化和反序列化以上,有任何不对的地方,请留言指正,敬请谅解。原创 2021-12-24 16:11:03 · 781 阅读 · 0 评论 -
ZooKeeper源码分析六之FileTxnSnapLog
一、FileTxnSnapLog前边分析可知,ZooKeeper中数据的持久化以及日志文件的写入都是通过FileTxnSnapLog对象来实现的,本文大致分析一下这个对象的整体结构。FileTxnSnapLog的初始化在runFromConfig方法中:FileTxnSnapLog txnLog = new FileTxnSnapLog(config.dataLogDir, config.dataDir)其中dataDir和dataLogDir是在配置文件中进行路径配置,并且dataDir必须的且原创 2021-12-23 16:10:43 · 943 阅读 · 0 评论 -
ZooKeeper源码分析五之ZKDatabase
一、数据结构ZooKeeper中数据结构是以树(DataTree)的形式保存,树中的节点对象是DataNode,主要保存节点值data、当前节点的权限acl、以及当前节点的状态stat(节点状态和权限在第一节的时候简单分析过),DataNode中还保存了children子节点的路径。DataTree会保存当前所有节点到nodes集合中,DataTree中还有两个属性dataWatches和childWatches,这是实现watcher机制的重要属性。dataWatches是监控当前节点的变化,chil原创 2021-12-23 13:57:05 · 1263 阅读 · 2 评论 -
ZooKeeper源码分析四之接收请求(单机启动下)
一、接收请求前文分析了ZooKeeper单机模式下的简单启动过程,本文接着前文继续分析,ZooKeeper启动之后,是怎么样处理来自客户端的请求。前文分析可知,ZooKeeper开启了三类线程来处理客户端的请求,AcceptThread、SelectorThread、ExpirerThread,本文将围绕着这三类线程进行展开,同时还需要注意WorkerService对象,三个线程的实例化都是在ServerCnxnFactory的configure方法中实现。expirerThread = new Co原创 2021-12-23 11:04:31 · 652 阅读 · 0 评论 -
ZooKeeper源码分析三之单机启动
一、解析配置文件单机启动时,配置文件解析对象是ServerConfig,查看其parse方法: public void parse(String path) throws ConfigException { //这里是通过集群启动下的解析对象来解析配置文件 QuorumPeerConfig config = new QuorumPeerConfig(); //解析配置文件,先从文件中读取配置信息到Properties对象中,然后赋值到对应的属性上,配原创 2021-12-21 14:26:18 · 1555 阅读 · 0 评论 -
ZooKeeper源码分析二之启动类
一、启动类如果你编辑zkServer.cmd文件就会发现ZooKeeper的启动类是QuorumPeerMain实例,既然是启动类,必然存在一个main方法。如下: public static void main(String[] args) { QuorumPeerMainmain = new QuorumPeerMain(); main.initializeAndRun(args); }main方法通过调用QuorumPeerMainmain的ini原创 2021-12-17 11:23:32 · 583 阅读 · 0 评论 -
ZooKeeper源码分析一之初识ZooKeeper
一、什么是ZooKeeper?ZooKeeper是Apache旗下开源的分布式协调服务,可以支持分布式配置、分布式同步、命名注册等服务,这是进行分布式系统开发中非常重要的一个软件,本文开始将从源码级来认识ZooKeeper。二、ZooKeeper安装第一步:从官网下载对应版本的安装包第二步:修改conf目录下的zoo_sample.cfg为zoo.cfg第三步:编辑zoo.cfg 找到dataDir字符配置好对应的位置第四步:启动zkServer.cmd,此时ZooKeeper就可以正常启动原创 2021-12-16 15:55:51 · 800 阅读 · 0 评论