美文网首页饥人谷技术博客技术干货
zk源码阅读27:集群版配置解析QuorumPeerConfig

zk源码阅读27:集群版配置解析QuorumPeerConfig

作者: 赤子心_d709 | 来源:发表于2017-07-31 14:49 被阅读298次

摘要

本节讲解集群版配置解析类QuorumPeerConfig,针对常用的配置参数进行解析
主要讲解

集群版配置demo
解析类QuorumPeerConfig常用属性
解析步骤流程

另外在 思考 中,自己理解的

配置文件的两个部分
sid的定义以及与myid,serverId的关系
配置中三个端口,clientPortAddress,port,electionPort的意义

样例

简单的集群版配置如下

tickTime=4000
initLimit=10
syncLimit=5
dataDir=D:\\zk-test\\datadir\\server1
clientPort=2181
maxClientCnxns=60

server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883

源码说明

主要看字段,如下

QuorumPeerConfig字段

最主要的几个属性列举,意义如下

字段 意义 备注
clientPortAddress 暴露给客户端的port
dataDir 快照日志目录
dataLogDir 事务日志目录
tickTime tick时间,默认三秒,用于在minSessionTimeout以及maxSessionTimeout没有配置时,提供默认值
minSessionTimeout 如果没有显式配置,默认-1,在QuorumPeer.getMinSessionTimeout()中,如果没有显式配置,则返回tickTime * 2
maxSessionTimeout 如果没有显式配置,默认-1,在QuorumPeer.getMaxSessionTimeout中,如果没有显式配置,则返回tickTime * 20
initLimit 初始化阶段,learner和leader的通信读取超时时间,最长为initLimit*tickTime 体现在LearnerCnxAcceptor.run()中
syncLimit 在初始化阶段之后的请求阶段Learner和Leader通信的读取超时时间 体现在Learner.connectToLeader() 和 LearnerHandler.run()对syncLimit的调用
electionAlg =3,即对应FastLeaderElection
electionPort 默认2182;//即选举用的端口
HashMap<Long,QuorumServer> servers 集群中所有server列表,key为集群中每台机器的serverId,value为QuorumServer
observers 集群中所有处于观察者的server列表,key为集群中每台机器的serverId,value为QuorumServer
serverId 即sid,从dataDir下的"myid"文件得到的long型,代表该server的id
LearnerType peerType learner分两种:PARTICIPANT 和 OBSERVER;这里默认PARTICIPANT
quorumListenOnAllIPs 该参数设置为true,Zookeeper服务器将监听所有可用IP地址的连接。他会影响ZAB协议和快速Leader选举协 默认是false

这里涉及到LearnerType,源码在
QuorumPeer.LearnerType

public enum LearnerType {
        PARTICIPANT, OBSERVER;
    }

还涉及到QuorumServer,源码在QuorumPeer.QuorumServer,就是对集群中一个服务器主要属性的记录
用到的构造函数如下:

    public QuorumServer(long id, String hostname,
                            Integer port, Integer electionPort,
                            LearnerType type) {
            this.id = id;//机器的serverId
            this.hostname=hostname;//host
            if (port!=null){
                this.port=port;//选举完之后,leader和learner的通信端口
            }
            if (electionPort!=null){
                this.electionPort=electionPort;//选举之前,各server参与选举的port
            }
            if (type!=null){
                this.type = type;//server类型,为PARTICIPANT 或者 OBSERVER;
            }
            this.recreateSocketAddresses();
        }

这里不展开

主要解析步骤

对应源码在QuorumPeerConfig#parseProperties中

1.解析各种配置
如syncLimit,initLimit等

2.配置验证
如dataDir没有设置,clientPort不合理,集群server个数为偶数等

3.myid文件解析
即从{dataDir}/"myid"文件下解析出serverId值

4.peerType验证
配置中,在配置中,可以理解为两个部分,在下面 "思考"部分有提到,唯一有重复定义的就是peerType
这里避免在“当前机器”配置中给他设置成A值,在“机器集群”中,对应serverId的机器又给他设置成B值

思考

配置的两个部分

这个是自己理解的
比如

tickTime=4000
initLimit=10
syncLimit=5
dataDir=D:\\zk-test\\datadir\\server1
clientPort=2181
maxClientCnxns=60

server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883

空行上面的部分,可以理解为当前机器的配置
空行下面的部分,可以理解为集群各个机器的配置

sid是在哪里定义的

配置中

server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883

里面1,2,3就是sid

sid和myid,serverId关系

其实看怎么理解

按照代码里面的写法

sid是就是上面提到的1,2,3,就是一个列表
myid是一个文件,存在于dataDir目录下
serverId是myid文件中的数据,是一个long型,代表当前机器的id

当然,网上很多说法也是可以理解的
sid和serverId是一回事,就是当前server的id

到底有几个端口,分别干嘛用的

clientPort:配置中必须声明,暴露给客户端的
port:配置中必须声明,即确定了leader之后,leader和learner的通信端口
electionPort:配置中可以不声明

可以结合上面的QuorumServer的构造函数分析

electionPort默认值问题

代码中,QuorumPeerConfig#electionPort默认2182但是并没有地方调用
也就是说配置中没有写的话,QuorumPeerConfig#parseProperties生成的QuorumServer的electionPort是null
QuorumPeer.QuorumServer#QuorumServer里面允许传递的electionPort为null

问题

暂无

吐槽

myid文件存在的意义

myid这个属于当前机器配置,为什么不直接放在配置文件里面去,比如加上myid=1

这里还要放在dataDir目录下,建立myid文件,里面写一个long代表serverid,很麻烦啊

注释

这么多属性没有注释,不常用的就不解释了

refer

https://my.oschina.net/xianggao/blog/538746 配置部分
http://blog.csdn.net/qianshangding0708/article/details/50067483

相关文章

网友评论

    本文标题:zk源码阅读27:集群版配置解析QuorumPeerConfig

    本文链接:https://www.haomeiwen.com/subject/xtfklxtx.html