手把手带你撸zookeeper源码(配置文件)

前言

在上一篇手把手带你撸zookeeper源码(前言)中zookeeper源码系列文章的一些问题和准备工作,看一个框架或者系统源码是需要循序渐进的逐步学习,不能一口吃个胖子,一飞冲天成为专家或者高手,需要踏实放下心,慢慢磨练自己的底层技术能力。在我们手动启动一个zookeeper server时,会先让你上网下载apache-zookeeper-3.6.1-bin.tar.gz, 然后解压到本地目录里面,接着会让你修改conf/zoo_sample.cfg配置文件为zoo.cfg,然后进入bin目录下执行./zkServer.sh start,然后就启动了zk server,那么zoo.cfg里面我们都可以配置哪些东西呢?今天我们着重了解一下zoo.cfg里面我们都能配置哪些东西,后续我们会讲解这些配置文件在zookeeper源码中如何进行解析,怎么使用的

 

默认配置文件都有哪些内容

既然我们上一篇文章已经把zookeeper的源码导入到了idea中,那么我们直接使用idea来打开配置文件,来看看里面的配置

tickTime: 可以把它当做一个时间的单位,我们可以设置,系统里面默认的是3000ms

initLimit:  zk集群启动的时候,leader会在启动之后会等待follower跟自己建立连接以及同步数据,最长等待initLimit * tickTime时间,如果在此时间内有follower没有跟leader建立连接,leader会直接进入消息广播模式,对外提供服务了,如果follower和leader之间有比较大的数据量进行同步时,可以适当调大这个参数

syncLimit:  leader和follower之间会进行心跳,这个参数的意思是如果在这个时间内follower没有给leader发送心跳, leader就会把follower给剔除掉,认为这个follower已经死掉了

dataDir: 主要是保存zk内存日志快照、这些快照主要是为zk重启、故障恢复时可以快速恢复之前的数据

dataLogDir: 事务日志文件目录,在进行写数据时,zookeeper会使用zab协议保证数据的一致性,会进行2PC,在proposal阶段会写事务日志(每写一条数据都会写一条事务日志,顺序写,要保证zookeeper的写磁盘数据的性能,最好使用SSD硬盘)

clientPort: 客户端和服务端通信端口

 

再讲解一下其他的配置: 大家有兴趣的可以看一下官网文档: https://zookeeper.apache.org/doc/r3.4.13/zookeeperStarted.html

       server.1=zoo1:2888:3888
       server.2=zoo2:2888:3888
       server.3=zoo3:2888:3888

在我们配置集群的时候会在zoo.cfg里面配置如上信息

server.x中x的数字是在dataDir里面myid中配置的数字(这个数字的大小可以自己任意配置, 此数字会影响到leader选举,在讲解选举源码的时候会仔细讲解)

zoo1、zoo2、zoo3是在hosts里面配置的服务器别名,或者是服务器的ip地址

2888: 可以自己配置的,主要用来服务器内部之间的通信接口(底层是用nio进行通信的),比如leader和follower之间的数据同步、ack、commit等

3888: 主要是用来leader选举进行通信时使用的(底层直接使用的socket bio实现的)

最后还可以指定当前zookeeper的角色比如:server.1=zoo1:2888:3888:observer, 则说明myid=1这个zookeeper是observer角色

备注: observer角色zookeeper不参与leader选举,  不参与ZAB数据过半写提交quorum的限定,默认都是参与者

peerType: observer/participant, 指定当前zk服务的角色

autopurge.snapRetainCount: 保存快照剩余数量(默认为3个)

autopurge.purageInterval: 清理快照文件时间间隔(默认1小时)

maxClientCnxns: zk server连接的客户端最大数量,默认为60个,如有必要,可适当调整

electionAlg: 指定选举算法(默认为3),3.4.13版本的zookeeper默认剩余一种选举方式,其他两种都已过期了,源码的时候讲

扩展

上面的配置主要是在zoo.cfg中配置的,在zookeeper内部,还可以通过系统环境变量来设定某些属性,如下:

zookeeper.leaderServers: yes, 默认为yes, 意思是leader是否接受客户端的连接请求, 比如:有三台zookeeper服务,其中两台follower对外提供读写服务,如果有写请求,则由follower转发给leader进行写请求的处理

zookeeper.cnxTimeout: 在进行leader选举时,会基于3888那个端口建立TCP连接,TCP连接建立的超时时间

zookeeper.forceSync: 这个参数表关键,它关乎着在2PC节点是否会丢数据的风险,在2PC中的第一阶段proposal时,会先把数据写入到本地磁盘的事务日志中,在写入磁盘之前一般都会先写入os cache,然后由操作系统定时flush到磁盘文件。如果你允许少量故障宕机时数据的丢失,想要更高的性能保证,可以设置为no。如果你不允许任何数据的丢失,则设置为yes,写事务日志时会强制刷入磁盘中,因为事务日志都是顺序写,再如果使用SSD固态硬盘,顺序写磁盘和随机写内存性能差不多,性能其实也是很高的。主要看你需求,默认值为yes

注:如果想了解更多通过环境变量配置的参数,可以在idea导入的zookeeper源码全局搜索System.getProperty, 自定了解每个参数作用,这里不再过多列出

 

总结

贴一张图片,单个zk最少配置,就是这一些配置就能启动一个zk服务,然后去操作学习

但是我们线上的zk服务都是集群的部署方式,对于线上的配置都需要做一些配置的,比如session超时配置, 快照文件梳理,定时清理等,所以多去了解一些配置是很有必要的

最后如果大家感兴趣,可以先看一下QuorumPeerConfig这个类,里面的属性基本上都可以在zoo.cfg里面配置的,parseProperties这个方法对zoo.cfg进行解析的,更多配置可以先看一下,后续我们详细讲解

 

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页