Zookeeper深入理解(三)(Zookeeper管理之运维)
preAllocSize
preAllocSize事务日志文件的预分配大小(kb)(zookeeper.preAllocSize)。当Server写入事务日志时,会一次性申请preAllocSize大小的文件块,这会减少磁盘空间分配和元数据更新的开销,更重要的是减少了寻址的次数。preAllocSize默认为64M。事务日志文件会随每一次快照后,新建另一个日志文件,如每次快照之间产生的事务不是很多,那64M大小确实偏大,比如每1000个事务就进行一次快照,每个事务大概100字节,那preAllocSize设置为100KB要合理得多。而默认的preAllocSize对于默认的snapCount,及事务日志平均512字节的情况是合理的。
snapCount
snapCount即快照间的事务数量(zookeeper.snapCount),默认值为100000。因为快照是比较影响性能的,但只要集群中的Server不是同时进行快照,就不会出现性能问题,出于这个原因,实际快照的事务日志数将是一个接近snapCount的随机数。如果上一次快照还没有结束,本次快照将等待上一次快照结束再开始。
autopurge.snapRetainCount
autopurge.snapRetainCount表示Zookeeper清理快照时,需要保留的快照数。Zookeeper会每隔一段时间,对快照进行垃圾回收,autopurge.snapRetainCount指定了需要保留多少个快照,默认值为3。
autopurge.purgeInterval
autopurge.purgeInterval表明了旧快照和日志清理工作的间隔时间(小时),默认设置为0,这时必须手动执行zkCleanup.sh脚本进行清理工作。
fsync.warningthresholdms
fsync.warningthresholdms表明同步存储变化的时间超过该值,如果系统同步调用sync花费太多时间,将严重影响系统性能,当花费的时间超过该值时,将发出一个提醒。
weight.x=n
和group选项一起使用,当正在形成法定人数时,这将分配一个权重n给Server x,n将作为投票的权重值,默认为1。
traceFile
用于记录Zookeeper操作的跟踪文件,格式为traceFile.year.month.day,须设置为requestTraceFile才能生效,这可能会引起CPU和磁盘争用,应避免与日志文件dataLogDir一样,该配置不用加上zookeeper前缀。
网络配置
globalOutstandingLimit
globalOutstandingLimit(zookeeper.globalOutstandingLimit)限制Zookeeper最大的未完成请求数,默认为1000。Client提交请求的速度可以比Server处理请求的速度快,这将导致请求被排队,最终导致Server内存溢出,为了防止这种情况发生,一旦客户端排队请求达到该值,Server将对客户端请求进行控制。但globalOutstandingLimit并不是一个硬性限制,每个Client必须至少有一个未完成的请求,或者连接正开始超时。因此,在未完成请求数达到该值后,只要Client没有挂起的请求,Server则会读取来自Client的连接。
maxClientCnxns
允许每个IP最大的并发Socket连接数,默认是60,但这个限制是针对某个Server,而不是整个集群。
clientPortAddress
Client连接Server的网络地址,通常是内网。
minSessionTimeout
当Client创建了Connection,并设置了特定的超时时间,但超时时间不将低于minSessionTimeout(ms),默认为2 * tickTime,该值过低会导致错误地判断Client崩溃,同理,过高将延迟判断Client崩溃。
maxSessionTimeout
当Client创建了Connection,并设置了特定的超时时间,但超时时间不将高于maxSessionTimeout(ms),默认为20 * tickTime
集群配置
请保证集群中的每个Server都具有一致的集群配置。initLimit
Follower初始化连接Leader的超时时间(initLimit * tickTime)。当Follower落后Leader很多时,将需要传输很多数据,会耗费比较多的时间,因此initLimit大小应该取决于Follower和Leader的数据传输量和网络传输速度。
syncLimit
Follower同步Leader的超时时间(initLimit * tickTime),这将取决于网络延迟和吞吐量。
leaderServes
通过yes或no指明Leader是否可以接受Client连接(zookeeper.leaderServes)。
server.x=[hostname]:n:n[:observer]
配置集群中的Server。(该配置所有Server应保持一致)x表示Server ID,hostname表示Server主机名,n表示连接端口,第一个表示发送事务的端口(默认2888),第二个表示Leader选举使用的端口(默认3888),observer标识该Server为Observer。
cnxTimeout
在Leader选举期间,打开连接的超时时间(zookeeper.cnxTimeout)。在Leader选举过程,Server互相连接,该值将决定Server在尝试重新连接之前,需要等待的时间。
日志配置
Zookeeper使用SLF4J作为日志抽象层,默认使用Log4J作为日志实现,需在类路径下放置log4j.properties。
下面是一份简单的配置zookeeper.root.logger=INFO, CONSOLEzookeeper.console.threshold=INFOzookeeper.log.dir=.zookeeper.log.file=zookeeper.logzookeeper.log.threshold=DEBUGzookeeper.tracelog.dir=.zookeeper.tracelog.file=zookeeper_trace.loglog4j.rootLogger=${zookeeper.root.logger}log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -...log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppenderlog4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}log4j.appender.ROLLINGFILE.MaxFileSize=10MBlog4j.appender.ROLLINGFILE.MaxBackupIndex=10log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout