摘要
本节讲解集群版配置解析类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
网友评论