源码
git地址:
https://github.com/apache/zookeeper
https://github.com/apache/zookeeper.git

下载源码但是有很多类是编译生成的,不在源码里
image.png
已经补充了未生成的类的可以启动的源码
zookeeper-branch-3.5.8.7z

编译

mvn clean install -DskipTests

启动主类

org.apache.zookeeper.server.quorum.QuorumPeerMain

复制一个zoo.cfg
复制一份log4j.properties配置文件
这些都在zip中修改,改依赖的scope

启动的配置;

Main class : org.apache.zookeeper.server.quorum.QuorumPeerMain VM options: -Dzookeeper_server_cnxn_factory=org.apach.zookeeper.server.NettyServerCnxFactory program arguments: D:\pdf\code\zookeeper-branch-3.5.8\zookeeper-branch-3.5.8\conf\zoo.cfg

image.png

集群启动需要配置多个zoo.cfg
需要在zoo.cfg目录下配置多个myid文件

启动选举leader的过程

  1. 每台会向配置中的serverList发送选票,包括发给自己
  2. 选票格式是(myid,zxId)
  3. 对于初始化时,zxid(最新的操作记录)是一样的,这时候myid大谁就当选,源码规定的
  4. 这时候判断当前是不是过半了,过半了就更新当前机器的状态
  5. 如果没过半,就把胜出的票再头一次
  6. 新机器加入是,状态是looking,就会发起投票
  7. 但是旧的机器接受到选票时状态已确定,就把新机器的票作废返回leader
  8. 新机器就会更新自己的状态为follower了

各个节点直接是socket双工通讯,当建立链接是会关闭myid小的向大的连接

image.png
leader选举多层队列架构
架构设计把业务与通讯分层
分为业务层:
消息传输层:
各层通讯通过消息队列,避免相互影响
而且是针对不同的节点维护一个小心队列,保证不同节点发送消息的状态不受其他节点的影响
image.png

启动源码

从zkServer.sh中找

ZOOMAIN=”-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain”

启动主类:QuorumPeerMain

源码看主线code,条件判断之类的代码可以跳过,找主线
异步编程提高代码性能,如何使用并发编码
启动过程

设计思考

可以使用一个容器,进行解耦,消息队列,或者中间件MQ
存取的过程也要抽象成接口,可以给不同的实现,方便以后替换扩展

Zookeeper.png