四字命令

操作方式

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 - 四字命令解析相关推荐

  1. 4-5 zookeeper四字命令

    zk四字命令 Four Letter Words 四字命令简介 zk可以通过它自身提供的简写命令来和服务器进行交互 zk通过简写的命令和服务器进行交互,进行交互之后可以提供一些服务器的状态信息.环境变 ...

  2. zookeeper 四字命令的使用

    Linux中的命令NetCat有"瑞士军刀"的美誉.我们可以通过nc命令查看Zookeeper的一行属性数据.在Zookeeper中有很多四字命令,汇总如下: 序号 使用命令 输出 ...

  3. 开启 Zookeeper 四字命令(is not executed because it is not in the whitelist)

    有时候我们需要使用四字命令查看 ZK 的一些信息,如果没有配置开启,救会出现这样的异常: ➜ bin echo mntr | nc localhost 2181 mntr is not execute ...

  4. zookeeper四字命令_java培训

    zookeeper支持某些特定的四字命令,他们大多是用来查询ZK服务的当前状态及相关信息的, 通过telnet或nc向zookeeper提交相应命令,如:echo ruok | nc 127.0.0. ...

  5. Zookeeper四字命令

    zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过 telenet 或者 nc(netcat) 向 zookeeper 提 ...

  6. zookeeper命令行(zkCli.shzkServer.sh)使用及四字命令

    zookeeper提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh). 还提供了一系列四字命令,方便我们跟服务器进行各种交互,来确认 ...

  7. Zookeeper的四字命令

    一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...

  8. zookeeper的acl权限控制_zookeeper权限acl与四字命令

    权限acl介绍,acl的构成与id acl是Access control lists 的缩写,也就是权限控制列表: 针对节点可以设置相关读写等权限,目的是为了保障数据安全性 权限permissions ...

  9. zookeeper四字监控命令

    文章目录 zookeeper四字监控命令 什么是四字监控命令 配置监控属性 安装nc conf命令 cons命令 crst命令 dump命令 envi命令 ruok命令 stat命令 srst命令 w ...

最新文章

  1. grafana3.1.0安装配置
  2. java.security.InvalidKeyException:illegal Key Size
  3. 杨清彦:《像三国》游戏3D动效制作经验分享
  4. window下搭建Python3.7+selenium3.1.1+pycharm环境
  5. 屏蔽wget下载网站内容
  6. 2017.9.14 dispatching 思考记录
  7. Java多线程(二)——多线程基本特性
  8. 一篇搞定导航守卫(vue-router源码学习)
  9. 解决排列组合问题的通用算法(转)
  10. JAVA中字符串函数subString的用法小结
  11. 在MySQL中生成随机经度和纬度
  12. Android开发--更换字体
  13. 一位IT博士的大学十年
  14. C#在word中插入表格(包含从excel中选取表格插入到word中)
  15. 【Rust精彩blog】Rust 中几个智能指针的异同与使用场景
  16. Android应用声明Open Source Licenses
  17. php文字加边框,word怎么给段落加边框
  18. IOS免签支持在线封装app分发源码 免签封装带绿标
  19. 微信小程序踩坑之微信支付提示商户未开通支付权限
  20. 淘宝宝贝标题优化2个字:日增10000个IP访问

热门文章

  1. WeX5 BeX5 页面框架核心之数据绑定2021-11-15
  2. 磁盘数据线接触不良的故障排查
  3. 手机app开发需要哪些技术?
  4. Java8之新日期时间篇
  5. java 比较当前时间_java时间比较
  6. ig信息增益 java_【Python 编程】实现文本分类中的信息增益算法
  7. Springboot与Kafka的小插曲
  8. STM32F407ZGT6芯片介绍
  9. 天干地支计算公式_任何一天干支的计算方法 天干地支对照表
  10. C#实现物体尺寸测量(利用坐标转换)