ZooKeeper - 四字命令解析
四字命令
操作方式
echo “ruok” | nc 192.168.0.106 2181
cons
输出当前服务器的所有客户端的连接信息
NIOServerCnxn代码:
private class ConsCommand extends CommandThread {public ConsCommand(PrintWriter pw) {super(pw);}@SuppressWarnings("unchecked")@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);} else {// clone should be faster than iteration// ie give up the cnxns lock fasterHashSet<NIOServerCnxn> cnxns;synchronized (factory.cnxns) {cnxns = (HashSet<NIOServerCnxn>) factory.cnxns.clone();}for (NIOServerCnxn c : cnxns) {c.dumpConnectionInfo(pw, false);pw.println();}pw.println();}}}
ServerCnxn代码:
protected synchronized voiddumpConnectionInfo(PrintWriter pwriter, boolean brief) {pwriter.print(" ");pwriter.print(getRemoteSocketAddress());pwriter.print("[");int interestOps = getInterestOps();pwriter.print(interestOps == 0 ? "0" : Integer.toHexString(interestOps));pwriter.print("](queued=");pwriter.print(getOutstandingRequests());pwriter.print(",recved=");pwriter.print(getPacketsReceived());pwriter.print(",sent=");pwriter.print(getPacketsSent());if (!brief) {long sessionId = getSessionId();if (sessionId != 0) {pwriter.print(",sid=0x");pwriter.print(Long.toHexString(sessionId));pwriter.print(",lop=");pwriter.print(getLastOperation());pwriter.print(",est=");pwriter.print(getEstablished().getTime());pwriter.print(",to=");pwriter.print(getSessionTimeout());long lastCxid = getLastCxid();if (lastCxid >= 0) {pwriter.print(",lcxid=0x");pwriter.print(Long.toHexString(lastCxid));}pwriter.print(",lzxid=0x");pwriter.print(Long.toHexString(getLastZxid()));pwriter.print(",lresp=");pwriter.print(getLastResponseTime());pwriter.print(",llat=");pwriter.print(getLastLatency());pwriter.print(",minlat=");pwriter.print(getMinLatency());pwriter.print(",avglat=");pwriter.print(getAvgLatency());pwriter.print(",maxlat=");pwriter.print(getMaxLatency());}}pwriter.print(")");}
stat、srvr
输出ZooKeeper版本号、只读模式的判断、服务器状态信息、节点数量
stat额外输出当前服务器的所有客户端的连接信息。
private class StatCommand extends CommandThread {int len;public StatCommand(PrintWriter pw, int len) {super(pw);this.len = len;}@SuppressWarnings("unchecked")@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);}else { pw.print("Zookeeper version: ");pw.println(Version.getFullVersion());if (zkServer instanceof ReadOnlyZooKeeperServer) {pw.println("READ-ONLY mode; serving only " +"read-only clients");}if (len == statCmd) {LOG.info("Stat command output");pw.println("Clients:");// clone should be faster than iteration// ie give up the cnxns lock fasterHashSet<NIOServerCnxn> cnxnset;synchronized(factory.cnxns){cnxnset = (HashSet<NIOServerCnxn>)factory.cnxns.clone();}for(NIOServerCnxn c : cnxnset){c.dumpConnectionInfo(pw, true);pw.println();}pw.println();}pw.print(zkServer.serverStats().toString());pw.print("Node count: ");pw.println(zkServer.getZKDatabase().getNodeCount());}}}
dump
输出当前集群的所有会话信息,以及创建的临时节点信息。
private class DumpCommand extends CommandThread {public DumpCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);}else {pw.println("SessionTracker dump:");zkServer.sessionTracker.dumpSessions(pw);pw.println("ephemeral nodes dump:");zkServer.dumpEphemerals(pw);}}}
crst
重置所有客户端的连接状态信息。
private class CnxnStatResetCommand extends CommandThread {public CnxnStatResetCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);} else {synchronized(factory.cnxns){for(ServerCnxn c : factory.cnxns){c.resetStats();}}pw.println("Connection stats reset.");}}}
srst
重置当前服务器的状态信息
private class StatResetCommand extends CommandThread {public StatResetCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);}else { zkServer.serverStats().reset();pw.println("Server stats reset.");}}}
conf
输出当前服务器的配置信息
private class ConfCommand extends CommandThread {ConfCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);} else {zkServer.dumpConf(pw);}}}
envi
输出当前服务器的运行时的环境信息
private class EnvCommand extends CommandThread {EnvCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {List<Environment.Entry> env = Environment.list();pw.println("Environment:");for(Environment.Entry e : env) {pw.print(e.getKey());pw.print("=");pw.println(e.getValue());}} }
stmk
设置跟踪掩码
private class SetTraceMaskCommand extends CommandThread {long trace = 0;SetTraceMaskCommand(PrintWriter pw, long trace) {super(pw);this.trace = trace;}@Overridepublic void commandRun() {pw.print(trace);}}
gtmk
获取跟踪掩码
private class TraceMaskCommand extends CommandThread {TraceMaskCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {long traceMask = ZooTrace.getTextTraceLevel();pw.print(traceMask);}}
private static long traceMask = CLIENT_REQUEST_TRACE_MASK| SERVER_PACKET_TRACE_MASK | SESSION_TRACE_MASK| WARNING_TRACE_MASK;public static long getTextTraceLevel() {return traceMask;}
ruok
检测当前服务器是否正在运行
private class RuokCommand extends CommandThread {public RuokCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {pw.print("imok");}}
wchs、wchc、wchp
wchs:输出当前服务器的watcher的概要信息。
wchc:输出当前服务器的watcher的详细信息,以会话为单位归组。
wchp:输出当前服务器的watcher的详细信息,以路径为单位归组。
private class WatchCommand extends CommandThread {int len = 0;public WatchCommand(PrintWriter pw, int len) {super(pw);this.len = len;}@Overridepublic void commandRun() {if (zkServer == null) {pw.println(ZK_NOT_SERVING);} else {DataTree dt = zkServer.getZKDatabase().getDataTree();if (len == wchsCmd) {dt.dumpWatchesSummary(pw);} else if (len == wchpCmd) {dt.dumpWatches(pw, true);} else {dt.dumpWatches(pw, false);}pw.println();}}}
isro
输出当前服务器的模式 - ro (只读) / rw (可读写)
private class IsroCommand extends CommandThread {public IsroCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {if (zkServer == null) {pw.print("null");} else if (zkServer instanceof ReadOnlyZooKeeperServer) {pw.print("ro");} else {pw.print("rw");}}}
mntr
输出比stat命令更详尽的服务器状态信息,包括请求处理的延迟情况、服务器内存数据库的大小、集群数据的同步情况等。
private class MonitorCommand extends CommandThread {MonitorCommand(PrintWriter pw) {super(pw);}@Overridepublic void commandRun() {if(zkServer == null) {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());}}private void print(String key, long number) {print(key, "" + number);}private void print(String key, String value) {pw.print("zk_");pw.print(key);pw.print("\t");pw.println(value);}}
完整源代码
对于四字命令的检查处理。
/** Return if four letter word found and responded to, otw false **/private boolean checkFourLetterWord(final SelectionKey k, final int len)throws IOException{// We take advantage of the limited size of the length to look// for cmds. They are all 4-bytes which fits inside of an intString cmd = cmd2String.get(len);if (cmd == null) {return false;}LOG.info("Processing " + cmd + " command from "+ sock.socket().getRemoteSocketAddress());packetReceived();/** cancel the selection key to remove the socket handling* from selector. This is to prevent netcat problem wherein* netcat immediately closes the sending side after sending the* commands and still keeps the receiving channel open. * The idea is to remove the selectionkey from the selector* so that the selector does not notice the closed read on the* socket channel and keep the socket alive to write the data to* and makes sure to close the socket after its done writing the data*/if (k != null) {try {k.cancel();} catch(Exception e) {LOG.error("Error cancelling command selection key ", e);}}final PrintWriter pwriter = new PrintWriter(new BufferedWriter(new SendBufferWriter()));if (len == ruokCmd) {RuokCommand ruok = new RuokCommand(pwriter);ruok.start();return true;} else if (len == getTraceMaskCmd) {TraceMaskCommand tmask = new TraceMaskCommand(pwriter);tmask.start();return true;} else if (len == setTraceMaskCmd) {incomingBuffer = ByteBuffer.allocate(8);int rc = sock.read(incomingBuffer);if (rc < 0) {throw new IOException("Read error");}incomingBuffer.flip();long traceMask = incomingBuffer.getLong();ZooTrace.setTextTraceLevel(traceMask);SetTraceMaskCommand setMask = new SetTraceMaskCommand(pwriter, traceMask);setMask.start();return true;} else if (len == enviCmd) {EnvCommand env = new EnvCommand(pwriter);env.start();return true;} else if (len == confCmd) {ConfCommand ccmd = new ConfCommand(pwriter);ccmd.start();return true;} else if (len == srstCmd) {StatResetCommand strst = new StatResetCommand(pwriter);strst.start();return true;} else if (len == crstCmd) {CnxnStatResetCommand crst = new CnxnStatResetCommand(pwriter);crst.start();return true;} else if (len == dumpCmd) {DumpCommand dump = new DumpCommand(pwriter);dump.start();return true;} else if (len == statCmd || len == srvrCmd) {StatCommand stat = new StatCommand(pwriter, len);stat.start();return true;} else if (len == consCmd) {ConsCommand cons = new ConsCommand(pwriter);cons.start();return true;} else if (len == wchpCmd || len == wchcCmd || len == wchsCmd) {WatchCommand wcmd = new WatchCommand(pwriter, len);wcmd.start();return true;} else if (len == mntrCmd) {MonitorCommand mntr = new MonitorCommand(pwriter);mntr.start();return true;} else if (len == isroCmd) {IsroCommand isro = new IsroCommand(pwriter);isro.start();return true;}return false;}
ZooKeeper - 四字命令解析相关推荐
- 4-5 zookeeper四字命令
zk四字命令 Four Letter Words 四字命令简介 zk可以通过它自身提供的简写命令来和服务器进行交互 zk通过简写的命令和服务器进行交互,进行交互之后可以提供一些服务器的状态信息.环境变 ...
- zookeeper 四字命令的使用
Linux中的命令NetCat有"瑞士军刀"的美誉.我们可以通过nc命令查看Zookeeper的一行属性数据.在Zookeeper中有很多四字命令,汇总如下: 序号 使用命令 输出 ...
- 开启 Zookeeper 四字命令(is not executed because it is not in the whitelist)
有时候我们需要使用四字命令查看 ZK 的一些信息,如果没有配置开启,救会出现这样的异常: ➜ bin echo mntr | nc localhost 2181 mntr is not execute ...
- zookeeper四字命令_java培训
zookeeper支持某些特定的四字命令,他们大多是用来查询ZK服务的当前状态及相关信息的, 通过telnet或nc向zookeeper提交相应命令,如:echo ruok | nc 127.0.0. ...
- Zookeeper四字命令
zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过 telenet 或者 nc(netcat) 向 zookeeper 提 ...
- zookeeper命令行(zkCli.shzkServer.sh)使用及四字命令
zookeeper提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh). 还提供了一系列四字命令,方便我们跟服务器进行各种交互,来确认 ...
- Zookeeper的四字命令
一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...
- zookeeper的acl权限控制_zookeeper权限acl与四字命令
权限acl介绍,acl的构成与id acl是Access control lists 的缩写,也就是权限控制列表: 针对节点可以设置相关读写等权限,目的是为了保障数据安全性 权限permissions ...
- zookeeper四字监控命令
文章目录 zookeeper四字监控命令 什么是四字监控命令 配置监控属性 安装nc conf命令 cons命令 crst命令 dump命令 envi命令 ruok命令 stat命令 srst命令 w ...
最新文章
- grafana3.1.0安装配置
- java.security.InvalidKeyException:illegal Key Size
- 杨清彦:《像三国》游戏3D动效制作经验分享
- window下搭建Python3.7+selenium3.1.1+pycharm环境
- 屏蔽wget下载网站内容
- 2017.9.14 dispatching 思考记录
- Java多线程(二)——多线程基本特性
- 一篇搞定导航守卫(vue-router源码学习)
- 解决排列组合问题的通用算法(转)
- JAVA中字符串函数subString的用法小结
- 在MySQL中生成随机经度和纬度
- Android开发--更换字体
- 一位IT博士的大学十年
- C#在word中插入表格(包含从excel中选取表格插入到word中)
- 【Rust精彩blog】Rust 中几个智能指针的异同与使用场景
- Android应用声明Open Source Licenses
- php文字加边框,word怎么给段落加边框
- IOS免签支持在线封装app分发源码 免签封装带绿标
- 微信小程序踩坑之微信支付提示商户未开通支付权限
- 淘宝宝贝标题优化2个字:日增10000个IP访问