ZooKeeper源码之旅--概述

前言


每个Java程序员都应该看懂、吃透几套框架的源码,它将帮我们在技术功底上建立无与伦比的信心!

原因有以下几点:

  1. 我们在学习过程中,写过很多例子代码,但是这个例子代码,在工业实践中是确实可用的嘛?我们并没有底,直到看过工业界很成熟、很通用的技术框架,发现他们的用法,发现他们就是这么用的,或者也有一些更完善之处,印证之后,立刻顿悟。
  2. 吃透一套工业级框架,领会其完整流程,能极大提高设计思想和技术功底。原来他们是这么做的啊,我看懂了,我吃透了,我也能修复某个Bug了,我也能开发一套了。。。


如何看源码


DEBUG


刚开始看源码时,可能感到无从下手,不知道从哪里看起,这个阶段,有个小技巧,可以远程DEBUG,让框架运行起来,然后通过设置断点,看框架的运行、调用步骤。

比如,对于ZooKeeper,可以在zkServer.sh中增加配置,开启远程调试,如下:


然后,就可以通过IDE工具,进行远程调试了。


搭环境


框架如果是可以运行的,请一定搭一套可以运行的准生产环境,调整参数查看运行效果。

并辅助用Jstack、Jmap、MAT工具,分析类情况、分析堆情况、分析线程情况。

用一台机器,开多个端口,模拟1一个3台机器的集群。

zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/work/zookeeper/1/data/
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

server.1=localhost:2888:3888
server.2=localhost:2777:3777
server.3=localhost:2666:3666

zkStart

#!/bin/bash
/work/zookeeper/3/bin/zkServer.sh start
/work/zookeeper/2/bin/zkServer.sh start
/work/zookeeper/1/bin/zkServer.sh start

zkStop

#!/bin/bash
/work/zookeeper/3/bin/zkServer.sh stop
/work/zookeeper/2/bin/zkServer.sh stop
/work/zookeeper/1/bin/zkServer.sh stop

zkLog

#!/bin/bash
java -cp /work/zookeeper/1/zookeeper-3.4.8.jar:/work/zookeeper/1/lib/slf4j-api-1.6.1.jar:/work/zookeeper/1/lib/log4j-1.2.16.jar:/work/zookeeper/1/lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.LogFormatter $1


zkSnapshot

#!/bin/bash
java -cp /work/zookeeper/1/zookeeper-3.4.8.jar:/work/zookeeper/1/lib/slf4j-api-1.6.1.jar:/work/zookeeper/1/lib/log4j-1.2.16.jar:/work/zookeeper/1/lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter $1


记录和印证


请写学习笔记,无论是一遍WIKI,一个流程图,都可以。在Mac下画流程图的话,感觉Axure是不错的工具。

没事的时候,可以多翻翻别人写的源码学习笔记。

如果有身边的同事一起看,就更好了,没事还可以讨论一下。


ZooKeeper基础


基础Java知识


看ZooKeeper源码,需要这些Java基础知识:

  1. 必须:Socket(NIO、IO、对协议的理解)、线程(thread、runnable、wait、java.util.concurrent.*)
  2. 次之:持久化(序列号、反序列化)、数据结构(数、Map)
  3. 理论:原子广播,快速选举,找时间看看也行,先不看也行


基本概念


有问题,看官网:http://zookeeper.apache.org/doc/r3.4.8/

下面总结几个初级的,重要的:

http://blog.csdn.net/puma_dong/article/details/23520325#t8

ZXID:ZooKeeper Transaction ID,每一次事务操作(即写操作),都会生成一个ZXID,Long型,64位,前32位是EPOCH,后32位是事务递增ID

EPOCH:每一次选举结束,Leader都会有一个自己的EPOCH,有自己的一个朝代;ElectionEpoch,选择过程中的选举轮数,即逻辑锁

initLimit:集群选举期间,如果指定的initLimit内没有半数以上达成一致;或者工作期间,没有半数以上回应;则重新进入Leader选举;默认是10,代表10个tickTime,即20秒

syncLimit:发送和接受一次信息,允许的最长时间;默认是5,代表5个tickTime,即10秒


ZooKeeper核心内容流程图


概述




数据请求




快速选举




看看线程


Leader线程图示:


Follower1线程图示:


Follower2线程图示:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值