Zookeeper指标分析

1. 问题描述
通过CDH管理平台,进入Zookeeper管理界面,Zookeeper的平均请求延迟、最小请求延迟、最大请求延迟指标趋势图维持不变,指标数据异常。

2.问题复现
登录CDH平台,进入Zookeeper管理页面,查看Zookeeper各服务器状态,页面如下:
在这里插入图片描述
查看如下指标
平均请求延迟、最小请求延迟、最大请求延迟三个指标维持不变,指标异常。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.问题分析
3.1 指标来源

该指标是CDH通过ZookeeperJMX方式获取,具体参考Zookeeper官网
http://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperJMX.html#ch_jmx
通过命令方式获取Zookeeper指标信息


[root@ip-172-31-10-61 ~]# echo mntr |nc 172.31.10.61 2181
zk_version       3.4.5-cdh5.10.0--1, built on 01/20/2017 20:10 GMT
zk_avg_latency  0
zk_max_latency  10
zk_min_latency  0
zk_packets_received      30569
zk_packets_sent 31521
zk_num_alive_connections        7
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count  62
zk_watch_count  14
zk_ephemerals_count      9
zk_approximate_data_size        3049
zk_open_file_descriptor_count   43
zk_max_file_descriptor_count    32768

通过以上分析可以判断指标数据非CDH计算得来,而是Zookeeper计算,排除CM问题;

3.2 分析Zookeeper源码
命令行调用Zookeeper监控指标代码片段(MonitorCommand.java)

public void  commandRun() {
        if  (!isZKServerRunning()) {
            pw.println(ZK_NOT_SERVING);
            return;
        }
        ZKDatabase zkdb = zkServer.getZKDatabase();
        ServerStats stats = zkServer.serverStats();
 
        print("version",  Version.getFullVersion());
 
        print("avg_latency", stats.getAvgLatency());
        print("max_latency", stats.getMaxLatency());
        print("min_latency", stats.getMinLatency());
 
        print("packets_received", stats.getPacketsReceived());
        print("packets_sent", stats.getPacketsSent());
        print("num_alive_connections", stats.getNumAliveClientConnections());
 
        print("outstanding_requests", stats.getOutstandingRequests());
 
        print("server_state", stats.getServerState());
        print("znode_count", zkdb.getNodeCount());
 
        print("watch_count", zkdb.getDataTree().getWatchCount());
        print("ephemerals_count", zkdb.getDataTree().getEphemeralsCount());
        print("approximate_data_size", zkdb.getDataTree().approximateDataSize());
 
        OSMXBean osMbean = new  OSMXBean();
        if (osMbean != null  && osMbean.getUnix()  == true) {
            print("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount());
            print("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount());
        }
 
        if (stats.getServerState().equals("leader")) {
            Leader leader =  ((LeaderZooKeeperServer)zkServer).getLeader();
 
            print("followers", leader.getLearners().size());
            print("synced_followers", leader.getForwardingFollowers().size());
            print("pending_syncs", leader.getNumPendingSyncs());
        }
}

通过查看源码,指标数据是通过ServerStats获取“请求延迟”指标
分析ServerStats代码,代码片段(ServerStats.java)


//更新minLatency、maxLatency、count、totalLatency数据
synchronizedvoid  updateLatency(longrequestCreateTime) {
        longlatency = Time.currentElapsedTime()  - requestCreateTime;
        totalLatency += latency;
        count++;
        if (latency < minLatency) {
            minLatency = latency;
        }
        if (latency > maxLatency)  {
            maxLatency = latency;
        }
}
//获取avgLatency指标
synchronizedpubliclong getAvgLatency() {
    if (count != 0) {
        returntotalLatency / count;
    }
    return 0;
}

ServerStats只提供了updateLatency方法来更新maxLatency和minLatency指标。
调用更新ServerStats方法代码片段如下:(FinalRequestProcessor.java)


case OpCode.ping: {
                zks.serverStats().updateLatency(request.createTime);
 
                lastOp = "PING";
                cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp,
                        request.createTime, Time.currentElapsedTime());
 
                cnxn.sendResponse(new  ReplyHeader(-2,
                        zks.getZKDatabase().getDataTreeLastProcessedZxid(),  0), null, "response");
                return;
            }
            case OpCode.createSession: {
                zks.serverStats().updateLatency(request.createTime);
 
                lastOp = "SESS";
                cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp,
                        request.createTime, Time.currentElapsedTime());
 
                zks.finishSessionInit(request.cnxn, true);
                return;
            }

3.3 异常指标分析
通过分析代码,maxLatency和minLatency指标数据在Zookeeper服务器启动记录每次Request的指标数据;
在获取Zookeeper服务器的的maxLatency和minLatency指标记录服务器所有请求中最大请求延迟和最小请求延迟;
最大请求延迟指标
Zookeeper服务器1,在通过A请求更新ServerStats的maxLatency的指标值为100ms,在之后所有请求均未超过maxLatency为100ms的值。CDH平台每次获取Zookeeper服务器1的maxLatency指标时均为100ms,因此导致文章开头CDH平台Zookeeper的maxLatency指标维持不变“异常”。
最小请求延迟指标
Zookeeper服务器1,在通过A请求后更新ServerStats的minLatency的指标值为0ms,在之后所有请求均未小于minLatency为0ms的值。CDH平台每次获取Zookeeper服务器1的minLatency指标时均为0ms,因此导致文章开头CDH平台Zookeeper的minLatency指标为0ms维持不变的“异常”。
平均请求延迟指标
Zookeeper服务器1累计所有请求的延迟时间(totalLatency),累计总共请求次数(count),通过totalLatency/count获取avgLatency指标。至于avgLatency指标持续维持为0ms,由于totalLatency <count导致。
由此推断多次请求Latency的延迟为0ms。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Zookeeper连接工具是一种用于与Zookeeper进行交互的软件工具,它可以通过图形界面或命令行接口实现对Zookeeper集群进行管理和监控。Zookeeper连接工具可以方便地查看和管理Zookeeper中的节点、数据、ACL权限等内容,实时监测集群的运行状态和性能指标,帮助用户更好地理解和分析集群的行为和数据变化。常见的Zookeeper连接工具有ZooInspector、ZooNavigator、ZkUI等,它们都可以在开源社区中自由下载和使用。使用Zookeeper连接工具可以方便地进行Zookeeper的调试和管理,减少人工操作的繁琐性和风险性,提高运维效率和集群安全性。同时,需要注意的是,在使用Zookeeper连接工具时应当遵循最佳实践,如使用安全认证、合理配置参数、备份数据等,以确保集群的稳定和可靠性。 ### 回答2: Zookeeper连接工具是指一些方便用户连接、管理Zookeeper集群的工具。Zookeeper是一个分布式的协同服务框架,用户可以通过它在分布式环境下进行信息共享、命名服务、配置管理等操作。在实际应用中需要管理多个Zookeeper节点,执行一些基本的操作,如查看节点状态、读取数据、添加/删除节点等。Zookeeper连接工具就是解决这些问题的工具。 常见的Zookeeper连接工具有Apache ZooKeeper Browser、ZooInspector、Exhibitor、ZooKeeper Desktop等。它们都提供简单易用的图形化界面,使用户可以方便地查看Zookeeper节点的状态、管理Zookeeper集群的一些基本操作。其中,Apache ZooKeeper Browser是Zookeeper官方推荐的,而Exhibitor则是Apache ZooKeeper的一个开源管理工具,提供自动备份、节点迁移、集群监控等功能。 总之,Zookeeper连接工具使得Zookeeper集群的管理更加方便、高效,减少了手动操作的负担,使得Zookeeper服务的使用更加便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值