源码
git地址:
https://github.com/apache/zookeeper
https://github.com/apache/zookeeper.git
下载源码但是有很多类是编译生成的,不在源码里
已经补充了未生成的类的可以启动的源码
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
集群启动需要配置多个zoo.cfg
需要在zoo.cfg目录下配置多个myid文件
启动选举leader的过程
- 每台会向配置中的serverList发送选票,包括发给自己
- 选票格式是(myid,zxId)
- 对于初始化时,zxid(最新的操作记录)是一样的,这时候myid大谁就当选,源码规定的
- 这时候判断当前是不是过半了,过半了就更新当前机器的状态
- 如果没过半,就把胜出的票再头一次
- 新机器加入是,状态是looking,就会发起投票
- 但是旧的机器接受到选票时状态已确定,就把新机器的票作废返回leader
- 新机器就会更新自己的状态为follower了
各个节点直接是socket双工通讯,当建立链接是会关闭myid小的向大的连接
leader选举多层队列架构
架构设计把业务与通讯分层
分为业务层:
消息传输层:
各层通讯通过消息队列,避免相互影响
而且是针对不同的节点维护一个小心队列,保证不同节点发送消息的状态不受其他节点的影响
启动源码
从zkServer.sh中找
ZOOMAIN=”-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain”
启动主类:QuorumPeerMain
源码看主线code,条件判断之类的代码可以跳过,找主线
异步编程提高代码性能,如何使用并发编码
启动过程
设计思考
可以使用一个容器,进行解耦,消息队列,或者中间件MQ
存取的过程也要抽象成接口,可以给不同的实现,方便以后替换扩展