本文的命令和配置都是基于zookeeper-3.4.6版本。优化很多时候都是基于监控的,所以把这两个内容写在了一起,慢慢消化。

监控

简单地说,监控无非就是获取服务的一些指标,再根据实际业务情况给这些指标设定一个合适的阈值,然后进行告警的一个过程。

如何获取这些指标?

ZooKeeper 提供了四字命令(The Four Letter Words),用来获取 ZooKeeper 服务的当前状态及相关信息。

有哪些命令可以使用?

ZooKeeper四字命令 功能描述
conf 打印配置
cons 列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。
crst 重置所有连接的连接和会话统计信息。
dump 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。
envi 打印出服务环境的详细信息。
reqs 列出未经处理的请求
ruok 即"Are you ok",测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。
stat 输出关于性能和连接的客户端的列表。
srst 重置服务器的统计。
srvr 列出连接服务器的详细信息
wchs 列出服务器watch的详细信息。
wchc 通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。
wchp 通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。
mntr 输出可用于检测集群健康状态的变量列表

如何使用四字命令?

可以在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令。举个最常用的栗子:

echo mntr | nc ip 2181
指标名 解释
zk_version 版本
zk_avg_latency 平均 响应延迟
zk_max_latency 最大 响应延迟
zk_min_latency 最小 响应延迟
zk_packets_received 收包数
zk_packets_sent 发包数
zk_num_alive_connections 活跃连接数
zk_outstanding_requests 堆积请求数
zk_server_state 主从状态
zk_znode_count znode 数
zk_watch_count watch 数
zk_ephemerals_count 临时节点数
zk_approximate_data_size 近似数据总和大小
zk_open_file_descriptor_count 打开 文件描述符 数
zk_max_file_descriptor_count 最大 文件描述符 数
leader才有的指标
zk_followers Follower 数
zk_synced_followers 已同步的 Follower 数
zk_pending_syncs 阻塞中的 sync 操作

优化方案

1.日志

快照目录 dataDir 和 事务日志目录 dataLogDir 分离

写事务日志的目录,需要保证目录空间足够大,并挂载到单独的磁盘上

为了保证数据的一致性,Zookeeper 默认 forceSync 配置为 yes ,

即在返回客户端事务请求响应之前,要将此次请求对应的事务日志刷入到磁盘中,所以事务日志的写入速度,直接决定了 Zookeeper 的吞吐率

Log4j日志优化

调整为 DaliyRollingFileAppender,每天滚动创建新的日志文件

vim $ZOOKEEPER_HOME/conf/log4j.properties

  zookeeper.root.logger=INFO, CONSOLE
  zookeeper.console.threshold=INFO
  zookeeper.log.dir=.
  zookeeper.log.file=zookeeper.log
  zookeeper.log.threshold=DEBUG
  zookeeper.tracelog.dir=.
  zookeeper.tracelog.file=zookeeper_trace.log
  log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
  log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
  log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
  log4j.appender.ROLLINGFILE.DatePattern='.'yyyy-MM-dd

增加 ZOO_LOG_DIR 配置

vim bin/zkServer.sh


  ZOO_LOG_DIR=$ZOOBINDIR/../log4j

CONSOLE改为ROLLINGFILE

vim bin/zkEnv.sh


  # if [ "x${ZOO_LOG4J_PROP}" = "x" ]
  # then
  #     ZOO_LOG4J_PROP="INFO,CONSOLE"
  # fi
  if [ "x${ZOO_LOG4J_PROP}" = "x" ]
  then
      ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
  fi

2.zoo.cfg配置

  • globalOutstandingLimit=100000

客户端连接过多,限制客户端请求,避免OOM

  • preAllocSize=64M 日志文件预分配大小; snapCount=100,000 多少次写事务,生成一个快照如果快照生成频繁可适当调大该参数。

一般zk的应用提倡读大于写,性能较好(10:1),存储元数据用来协调分布式数据最终一致。写过于频繁使用缓存更好

  • 日志文件自动清除
autopurge.snapRetainCount=3 # 要在dataDir中保留的快照数
autopurge.purgeInterval=24 # 设置日志清除时间间隔;设置为“0”以禁用自动清除功能

谨慎修改:

  • skipACL=yes

忽略ACL验证,可以减少权限验证的相关操作,提升一点性能。

  • forceSync=no

在不追求强一致性的情况下可以把这个设为no,对写请求的性能提升很有帮助。

forceSync指每次写请求都强制从pagecache固化到磁盘上,才算是写成功返回。

当写请求数量到达一定程度的时候,后续写请求会等待前面写请求的forceSync操作,造成一定延时。

如果追求低延时的写请求,配置forceSync=no,数据写到pagecache后就返回。

但是机器断电的时候,pagecache中的数据有可能丢失。

  • forceSync=yes;fsync.warningthresholdms=50

若为强一致性场景,可以再设置个fsync.warningthresholdms=50, 数据固化到磁盘的操作fsync超过50ms的时候,将会在zookeeper.out中输出一条warn日志(forceSync=yes有效)。

zookeeper-监控与优化-《每日五分钟搞定大数据》的更多相关文章

  1. zookeeper核心-zab协议-《每日五分钟搞定大数据》

    上篇文章<paxos与一致性>说到zab是在paxos的基础上做了重要的改造,解决了一系列的问题,这一篇我们就来说下这个zab. zab协议的全称是ZooKeeper Atomic Bro ...

  2. zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图   zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...

  3. HDFS-异常大全-《每日五分钟搞定大数据》

    点击看<每日五分钟搞定大数据>完整思维导图以及所有文章目录 问题1:Decomminssioning退役datanode(即删除节点) 1.配置exclude: <name>d ...

  4. zookeeper-操作与应用场景-《每日五分钟搞定大数据》

    Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...

  5. zookeeper-如何修改源码-《每日五分钟搞定大数据》

    本篇文章仅仅是起一个抛砖迎玉的作用,举一个如何修改源码的例子.文章的灵感来自 ZOOKEEPER-2784. 提一个问题先 之前的文章讲过zxid的设计,我们先复习下: zxid有64位,分成两部分: ...

  6. zookeeper-分布式锁的代码实现-【每日五分钟搞定大数据】

    本文涉及到几个zookeeper简单的知识点,永久节点.有序节点.watch机制.比较基础,熟悉的就别看了跳过这篇吧 每个线程在/locks节点下创建一个临时有序节点test_lock_0000000 ...

  7. redis- info调优入门-《每日五分钟搞定大数据》

    本文根据redis的info命令查看redis的内存使用情况以及state状态,来观察redis的运行情况以及需要作出的相应优化. info 1.memory used_memory:13409011 ...

  8. 五分钟搞定Go.js

    五分钟搞定Go.js  1.基于html5~因为Go.js是一个依赖于HTML5特性的JavaScript库,所以需要确保您的页面声明它是一个HTML5文档,当然需要加载库 <!DOCTYPE ...

  9. 五分钟搞定 HTTPS 配置,二哥手把手教

    01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...

随机推荐

  1. Testlink1.9.17使用方法(第五章 测试用例管理)

    第五章 测试用例管理 QQ交流群:585499566 TestLink支持的测试用例的管理包含二层:分别为新建测试用例集(Test Suites).创建测试用例(Test Cases).可以把测试用例 ...

  2. git 入门教程之github 教程

    github 教程 github 是一个基于 git 的代码托管平台,是平时工作学习的好帮手,学会如何用好 github 网站能够帮助我们更好分享代码或者与其他开发人员合作. 注册 github 账号 ...

  3. Vue 加载第三方插件

    如添加jquery. 在终端项目根目录输入命令: npm i -D jquery 等待安装完成 编辑/build/webpack.base.conf.js,在resolve的alias下添加'jque ...

  4. 单用户模式启动SQL Server实例总结

      在SQL Server的数据库维护过程中,有时候在一些特殊情况下需要在单用户模式下启动SQL Server实例. 下面总结一下单用户模式启动SQL Server的几种方式: 1:命令模式(sqls ...

  5. Java的sql动态参数

    在C#的方法中可以使用params Parameter[] values来动态获取sql语句中的参数值数组.Java中可以自己封装出一个类似于C#的方法 1.获取结果集 /** * 获取结果集 * @ ...

  6. Linux进程调度器概述--Linux进程的管理与调度(十五)

    调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1 背景知识 1.1 什么是调度器 ...

  7. 通过jquery隐藏和显示元素

    通过jquery隐藏和显示元素 调用jquery本身提供的函数 $("xxx").hide();//隐藏xxx $("xxx").show();//显示xxx ...

  8. JAVA的下载与安装和环境变量配置等详细教程

    初学JAVA时,新手常常不知如何下载JAVA,也不知如何安装JAVA以及对JAVA配置环境变量.近期学弟学妹常请教我如何下载安装和配置JAVA,于是写下此博文以便更多新手快速入门,由于我本人是玩智能车 ...

  9. js实现的省市联动

    最近工作,要用到省市联动的功能.网上搜了一下,发现有很多这样的例子,看了不少实例,把觉得写得不错的代码穿上来,好给大家分享一下. <!DOCTYPE html PUBLIC "-//W ...

  10. Java入门(一):Hello World !

    前言 从今天开始,准备写Java Web开发的系列文章,毕竟自己主攻的还是Java方向,Python只是业余学习的兴趣使然,在第二技能还没有培养成熟前,做好第一技能的巩固和提高是很有必要的.从正式入行 ...