zk日常运维管理

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 清理数据目录dataDir目录指定了ZK的数据目录,用于存储ZK的快照文件(snapshot)。

清理数据目录

dataDir目录指定了ZK的数据目录,用于存储ZK的快照文件(snapshot)。另外,默认情况下,ZK的事务日志也会存储在这个目录中。在完成若干次事务日志之后(在ZK中,凡是对数据有更新的操作,比如创建节点,删除节点或是对节点数据内容进行更新等,都会记录事务日志),ZK会触发一次快照(snapshot),将当前server上所有节点的状态以快照文件的形式dump到磁盘上去,即snapshot文件。这里的若干次事务日志是可以配置的,默认是100000,具体参看下文中关于配置参数“snapCount”的介绍。
正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理,这里介绍4种清理日志的方法。在这4种方法中,推荐使用第一种方法

第一种,也是运维人员最常用的,写一个删除日志脚本,每天定时执行即可:


#!/bin/bash

#snapshot file dir

dataDir=/home/nileader/taokeeper/zk_data/version-2

#tran log dir

dataLogDir=/home/nileader/taokeeper/zk_log/version-2

#zk log dir

logDir=/home/nileader/taokeeper/logs

#Leave 60 files

count=60

count=$[$count+1]

ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f

ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f

ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f

以上这个脚本定义了删除对应两个目录中的文件,保留最新的60个文件,可以将他写到crontab中,设置为每天凌晨2点执行一次就可以了。**

第二种,使用ZK的工具类PurgeTxnLog,它的实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html,可以指定要清理的目录和需要保留的文件数目,简单使用如下:

1.java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir><snapDir> -n <count>

第三种,对于上面这个Java类的执行,ZK自己已经写好了脚本,在bin/zkCleanup.sh中,所以直接使用这个脚本也是可以执行清理工作的。

第四种,从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:

autopurge.purgeInterval 这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。

autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

日志输出到指定文件夹

ZK默认是没有向ROLLINGFILE文件输出程序运行时日志的,需要我们自己在conf/log4j.properties中配置日志路径。另外,没有特殊要求的话,日志级别设置为INFO或以上,我曾经测试过,日志级别设置为DEBUG的话,性能影响很大!
具体操作请看:http://www.tuicool.com/articles/MbUb63n

监控

1、 ZK提供一些简单但是功能强大的4字命令,通过对这些4字命令的返回内容进行解析,可以获取不少关于ZK运行时的信息。

常用的四字命令

conf:
输出server的详细配置信息。

echo conf|nc localhost 2181 

clientPort=2181 
dataDir=/home/test/taokeeper/zk_data/version-2 
dataLogDir=/test/admin/taokeeper/zk_log/version-2 
tickTime=2000 
maxClientCnxns=1000 
minSessionTimeout=4000 
maxSessionTimeout=40000 
serverId=2 
initLimit=10 
syncLimit=5 
electionAlg=3 
electionPort=3888 
quorumPort=2888 
peerType=0

cons:
输出指定server上所有客户端连接的详细信息,包括客户端IP,会话ID等。 New in 3.3.0类似于这样的信息:

echo cons|nc localhost 2181 
/1.2.3.4:43527[1](queued=0,recved=152802,sent=152806,sid=0x2389e662b98c424,lop=PING,est=1350385542196,to=6000,lcxid=0×114,lzxid=0xffffffffffffffff,lresp=1350690663308,llat=0,minlat=0,avglat=0,maxlat=483)
……

crst:
功能性命令。重置所有连接的统计信息。New in 3.3.0

dump:
这个命令针对Leader执行,用于输出所有等待队列中的会话和临时节点的信息。

envi:
用于输出server的环境变量。包括操作系统环境和Java环境。

ruok:
用于测试server是否处于无错状态。如果正常,则返回“imok”,否则没有任何响应。 注意:ruok不是一个特别有用的命令,它不能反映一个server是否处于正常工作。“stat”命令更靠谱。

stat
输出server简要状态和连接的客户端信息。

srvr
和stat类似,New in 3.3.0

echo stat|nc localhost 2181 

Zookeeper version: 3.3.5-1301095, built on 03/15/2012 19:48 GMT 
Clients: 
/10.2.3.4:59179[1](queued=0,recved=44845,sent=44845) 

Latency min/avg/max: 0/0/1036 
Received: 2274602238 
Sent: 2277795620 
Outstanding: 0 
Zxid: 0xa1b3503dd 
Mode: leader 
Node count: 37473

echo srvr|nc localhost 2181 

Zookeeper version: 3.3.5-1301095, built on 03/15/2012 19:48 GMT 
Latency min/avg/max: 0/0/980 
Received: 2592698547 
Sent: 2597713974 
Outstanding: 0 
Zxid: 0xa1b356b5b 
Mode: follower 
Node count: 37473

srst:
重置server的统计信息。

wchs:
列出所有watcher信息概要信息,数量等

wchc:
出所有watcher信息,以watcher的session为归组单元排列

echo wchc|nc localhost 2181 

0x2389e662b97917f 
/mytest/test/path1/node1 
0x3389e65c83cd790 
/mytest/test/path1/node2 
0x1389e65c7ef6313 
/mytest/test/path1/node3 
/mytest/test/path1/node1

wchp
列出所有watcher信息,以watcher的path为归组单元排列

echo wchp|nc localhost 2181 

/mytest/test/path1/node 
0x1389e65c7eea4f5 
0x1389e65c7ee2f68 
/mytest/test/path1/node2 
0x2389e662b967c29 
/mytest/test/path1/node3 
0x3389e65c83dd2e0 
0x1389e65c7f0c37c 
0x1389e65c7f0c364 

注意,wchc和wchp这两个命令执行的输出结果都是针对session的,对于运维人员来说可视化效果并不理想,可以尝试将cons命令执行输出的信息整合起来,就可以用客户端IP来代替会话ID了,具体可以看这个实现:http://rdc.taobao.com/team/jm/archives/1450

mntr:
输出一些ZK运行时信息,通过对这些返回结果的解析,可以达到监控的效果。

$ echo mntr | nc localhost 2185 
zk_version 3.4.0 
zk_avg_latency 0 
zk_max_latency 0 
zk_min_latency 0 
zk_packets_received 70 
zk_packets_sent 69 
zk_outstanding_requests 0 
zk_server_state leader 
zk_znode_count 4 
zk_watch_count 0 
zk_ephemerals_count 0 
zk_approximate_data_size 27 
zk_followers 4 – only exposed by the Leader 
zk_synced_followers 4 – only exposed by the Leader 
zk_pending_syncs 0 – only exposed by the Leader 
zk_open_file_descriptor_count 23 – only available on Unix platforms 
zk_max_file_descriptor_count 1024 – only available on Unix platforms

JMX方式

用jmx也能够获取一些运行时信息,详细可以查看这里:http://zookeeper.apache.org/doc/r3.4.3/zookeeperJMX.html
**第一种方式 :参数配置:java.env
**

$ cd $ZK_HOME/conf
$ vi java.env
JVMFLAGS=" -Djava.rmi.server.hostname=192.168.56.112 -Dcom.sun.management.jmxremote.port=8988 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xms512m -Xmx512m $JVMFLAGS"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
ZOO_LOG_DIR="/var/log/zookeeper/"

**第二种方式:打开%ZK_HOME%/bin目录下的zkServer.sh文件.找到如下配置
**

找到zkServer.sh文件
ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain"

在这个配置中并没有打开远程连接jmx的端口命令,通常需要再加上以下三个配置才能开启远程jmx
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8988
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
````

当配置 JMX 后,可以使用 jconsole 工具连接监控 zookeeper





<div class="se-preview-section-delimiter"></div>

###工具监控
1. 查看内存中的节点信息:ZooInspector
2. 查看并修改节点信息:node-zk-brower
3. 性能监控的工具 zookeeper-benchmark,zk-smoketest





<div class="se-preview-section-delimiter"></div>

###查看快照文件及事务日志文件




<div class="se-preview-section-delimiter"></div>

$ java -cp zookeeper-3.4.6.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter ./datalog/version-2/log.30060aab4

$ java -cp zookeeper-3.4.6.jar:lib/log4j-1.2.16.jar:lib/slf4j-log4j12-1.6.1.jar:lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter ./data/version-2/snapshot.300629b34
“`

加载数据出错

ZK在启动的过程中,首先会根据事务日志中的事务日志记录,从本地磁盘加载最后一次提交时候的快照数据,如果读取事务日志出错或是其它问题(通常在日志中可以看到一些IO异常),将导致server将无法启动。碰到类似于这种数据文件出错导致无法启动服务器的情况,一般按照如下顺序来恢复:
1、确认集群中其它机器是否正常工作,方法是使用“stat”这个命令来检查:echo stat|nc ip 2181
2、如果确认其它机器是正常工作的(这里要说明下,所谓正常工作还是指集群中有过半机器可用),那么可以开始删除本机的一些数据了,删除dataDir/version2dataLogDir/version-2 两个目录下的所有文件。
重启server。重启之后,这个机器就会从Leader那里同步到最新数据,然后重新加入到集群中提供服务。

注意事项

1 保持Server地址列表一致
A、客户端使用的server地址列表必须和集群所有server的地址列表一致。(如果客户端配置了集群机器列表的子集的话,也是没有问题的,只是少了客户端的容灾。)
B、集群中每个server的zoo.cfg中配置机器列表必须一致。
2 独立的事务日志输出
对于每个更新操作,ZK都会在确保事务日志已经落盘后,才会返回客户端响应。因此事务日志的输出性能在很大程度上影响ZK的整体吞吐性能。强烈建议是给事务日志的输出分配一个单独的磁盘。
3 配置合理的JVM堆大小
确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。

注意事项

1 保持Server地址列表一致
A、客户端使用的server地址列表必须和集群所有server的地址列表一致。(如果客户端配置了集群机器列表的子集的话,也是没有问题的,只是少了客户端的容灾。)
B、集群中每个server的zoo.cfg中配置机器列表必须一致。
2 独立的事务日志输出
对于每个更新操作,ZK都会在确保事务日志已经落盘后,才会返回客户端响应。因此事务日志的输出性能在很大程度上影响ZK的整体吞吐性能。强烈建议是给事务日志的输出分配一个单独的磁盘。
3 配置合理的JVM堆大小
确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
存储 运维 Java
Apache ZooKeeper - 高可用ZK集群模式搭建与运维
Apache ZooKeeper - 高可用ZK集群模式搭建与运维
233 0
|
3天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的全方位实践
本文深入探讨了构建高效运维体系的关键要素,从监控、日志管理、自动化工具、容器化与微服务架构、持续集成与持续部署(CI/CD)、虚拟化与云计算以及安全与合规等方面进行了全面阐述。通过引入先进的技术和方法,结合实际案例和项目经验,为读者提供了一套完整的运维解决方案,旨在帮助企业提升运维效率,降低运营成本,确保业务稳定运行。
|
15天前
|
运维 Ubuntu Devops
自动化运维工具的魅力:Ansible入门
【9月更文挑战第5天】在快速变化的IT世界里,自动化运维不再是可选项,而是必需品。Ansible,一款简单却强大的自动化工具,正成为众多DevOps工程师的首选。本文将带你了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook,从而开启你的自动化之旅。
62 35
|
1天前
|
机器学习/深度学习 人工智能 运维
高效运维:从自动化到智能化的演进之路
在当今数字化时代,运维领域正经历着从人工到自动化,再向智能化迈进的深刻变革。本文将探讨自动化运维的实践方法、面临的挑战以及如何向智能化运维转型的策略,旨在为读者提供一条清晰的演进路径,帮助企业提升运维效率,降低风险,并最终实现价值最大化。
|
1天前
|
机器学习/深度学习 运维 Prometheus
构建高效运维体系:从自动化部署到智能监控的全方位实践
在当今数字化时代,企业对运维效率和稳定性的要求越来越高。本文将探讨如何构建一个高效的运维体系,从自动化部署、持续集成与持续交付(CI/CD)、智能监控、故障管理以及数据驱动决策等方面进行深入分析和实践指导。通过这些方法,企业可以实现更快速、更可靠的软件发布和问题解决,提升整体运营效率。
|
12天前
|
存储 弹性计算 运维
自动化监控和响应ECS系统事件
阿里云提供的ECS系统事件用于记录云资源信息,如实例启停、到期通知等。为实现自动化运维,如故障处理与动态调度,可使用云助手插件`ecs-tool-event`。该插件定时获取并转化ECS事件为日志存储,便于监控与响应,无需额外开发,适用于大规模集群管理。详情及示例可见链接文档。
|
5天前
|
存储 运维 监控
构建高效运维体系:从监控到自动化的全方位实践指南
在当今数字化时代,企业对运维(Operations)的需求日益增长。运维不仅仅是保持系统运行那么简单,它涉及到监控、日志管理、故障排除、性能优化和自动化等多个层面。本文将从实际操作的角度出发,详细探讨如何构建一个高效的运维体系。通过具体案例,我们将了解不同运维工具和方法的应用,以及它们是如何帮助企业提高生产效率和降低运营风险的。无论你是刚接触运维的新手,还是经验丰富的专家,这篇文章都将为你提供宝贵的参考和启示。
|
5天前
|
机器学习/深度学习 运维 安全
构建高效运维体系:从自动化到智能化的演进之路
在数字化转型的浪潮中,运维管理作为信息技术基础设施的重要支柱,正经历着从传统手工操作向自动化、智能化的深刻变革。本文将探讨如何通过引入自动化工具和平台,实现运维流程的标准化与效率提升;进而利用大数据分析和人工智能技术,迈向预测性维护和智能决策支持的高级阶段。通过案例分析,揭示成功转型的关键因素,为运维专业人士提供一套可借鉴的升级路径。
|
3天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进之旅
在当今数字化时代,运维作为信息技术领域的核心组成部分,其重要性日益凸显。随着企业业务的不断扩展和技术的日新月异,传统手工运维方式已难以满足现代IT架构的需求。因此,构建一个高效、智能的运维体系成为业界共识。本文将探讨如何通过自动化和智能化手段,实现运维效率的质的飞跃,并分享一些成功案例与实践经验。
|
8天前
|
机器学习/深度学习 运维 监控
构建高效运维体系:从自动化到智能化的演进
在当今信息技术飞速发展的时代,运维领域正经历着从传统手动操作向高度自动化和智能化转变。本文旨在探讨如何通过集成自动化工具、实施持续集成与持续部署(CI/CD)、采用容器化技术和探索AIOps实践,构建一个高效、可靠的运维体系。我们将分析这些技术如何相互配合,提升运维效率,降低系统故障率,并实现快速响应市场变化的能力。通过案例分析和最佳实践的分享,本文将为IT专业人员提供一套实用的指南,帮助他们在数字化转型的浪潮中,保持运维工作的前瞻性和竞争力。