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

摘要

本节讲解集群版配置解析类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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,642评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,168评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,809评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,921评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,924评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,415评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,794评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,765评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,297评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,331评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,458评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,065评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,777评论 3 337
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,233评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,366评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,001评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,524评论 2 365

推荐阅读更多精彩内容