zookeeper-监控与优化-《每日五分钟搞定大数据》
本文的命令和配置都是基于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-监控与优化-《每日五分钟搞定大数据》的更多相关文章
- zookeeper核心-zab协议-《每日五分钟搞定大数据》
上篇文章<paxos与一致性>说到zab是在paxos的基础上做了重要的改造,解决了一系列的问题,这一篇我们就来说下这个zab. zab协议的全称是ZooKeeper Atomic Bro ...
- zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》
本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图 zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...
- HDFS-异常大全-《每日五分钟搞定大数据》
点击看<每日五分钟搞定大数据>完整思维导图以及所有文章目录 问题1:Decomminssioning退役datanode(即删除节点) 1.配置exclude: <name>d ...
- zookeeper-操作与应用场景-《每日五分钟搞定大数据》
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...
- zookeeper-如何修改源码-《每日五分钟搞定大数据》
本篇文章仅仅是起一个抛砖迎玉的作用,举一个如何修改源码的例子.文章的灵感来自 ZOOKEEPER-2784. 提一个问题先 之前的文章讲过zxid的设计,我们先复习下: zxid有64位,分成两部分: ...
- zookeeper-分布式锁的代码实现-【每日五分钟搞定大数据】
本文涉及到几个zookeeper简单的知识点,永久节点.有序节点.watch机制.比较基础,熟悉的就别看了跳过这篇吧 每个线程在/locks节点下创建一个临时有序节点test_lock_0000000 ...
- redis- info调优入门-《每日五分钟搞定大数据》
本文根据redis的info命令查看redis的内存使用情况以及state状态,来观察redis的运行情况以及需要作出的相应优化. info 1.memory used_memory:13409011 ...
- 五分钟搞定Go.js
五分钟搞定Go.js 1.基于html5~因为Go.js是一个依赖于HTML5特性的JavaScript库,所以需要确保您的页面声明它是一个HTML5文档,当然需要加载库 <!DOCTYPE ...
- 五分钟搞定 HTTPS 配置,二哥手把手教
01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...
随机推荐
- Android智能指针SP WP使用方法介绍
Android手机操作系统既然是开源的操作系统.那么在具体的文件夹中就会存放着各种相关功能的开源代码.我们在使用的时候可以根据这些源代码进行相应的修改就能轻松的完成我们所需的功能.在这里大家就一起来看 ...
- Centos 中无法上网的问题
我是 Centos 最小化安装的,安装网后 Centos 竟然无法上网...有点奇葩, 应该是网卡没有激活的问题了,下面是解决的过程 查看网卡 ip addr 其中 lo 是 Loop back ad ...
- getprop从哪获取属性
Android SystemProperties设置/取得系统属性的用法总结 通过调查得知,Android系统中取得/设置系统属性的用法参考以下3篇文章就足够了. 1.Android SystemPr ...
- C++反射机制:可变参数模板实现C++反射
1. 概要 本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在Github ...
- Hive之FAILED: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient异常
一.场景 Hive启动不报错,当使用show functions;或create table...时报:FAILED: SemanticException org.apache.hadoop.hive ...
- mysql---SQLZOO:从WORLD选择教程/ zh
名称 大陆 区 人口 gdp 阿富汗 亚洲 652230 25500100 20343000000 阿尔巴尼亚 欧洲 28748 2831741 12960000000 阿尔及利亚 非洲 238174 ...
- java POI导出Excel文件数据库的数据
在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...
- webApi添加视图出现/Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage<TModel>。
是因为webApi Views文件夹下缺乏web.config文件,从mvc项目相同目录拷贝一个web.Config文件放入 删除多余的namespaces 即可 web.config配置如下: &l ...
- foreach Transform 同时chils.setParent引起的bug
Transform继承自IEnumerable,可以对它进行迭代.但当你在迭代的同时,又对child进行setParent操作时,会出现意想不到的结果. 下面是我使用foreach和getchild得 ...
- 安装Jenkins getting started卡住
前言 jenkins版本:2.32.3 操作系统:windows 卡住信息 如果在安装jenkins时卡在getting startted的界面,如下所示 解决方法 1.打开 运行 输入 servi ...