热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

使用JMX监控Zookeeper状态JavaAPI

今天小编就为大家分享一篇关于使用JMX监控Zookeeper状态JavaAPI,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

一、背景

上一篇通过Java自带的JConsole来获取zookeeper状态。主要有几个不方便的地方,zk集群一般会部署3或者5台,在多个JConsole窗口中切换比较麻烦,各个zk服务及历史数据之间,不能直观比较。一般会做一个WEB管理页面来展示集群状态,设置报警阀值来做报警。

二、JVM平台提供Mbeans

在Java5.0以上版本,有一组API可以让Java应用程序和允许的工具监视和管理Java虚拟机(JVM)和虚拟机所在的本机操作系统。该组API在 java.lang.management包。可以通过这些API可以监控local端JVM,同时也可以监控远端JVM。

通过静态工厂方法获取MXBean实例,从本地访问正在运行的虚拟机的MXBean接口。这些Bean我们从ManagementFactory类中定义的静态方法获取;如ManagementFactory.getOperatingSystemMXBean();其中不足就是只能获取本地的JVM状态。无法获取远程的虚拟机数据。

  • ClassLoadingMXBean Java虚拟机的类加载系统
  • CompilationMXBean Java虚拟机的编译系统
  • MemoryMXBean Java虚拟机的内存系统
  • RuntimeMXBean Java虚拟机的运行时系统
  • OperatingSystemMXBean Java虚拟机在其上运行的操作系统
  • GarbageCollectorMXBean Java虚拟机中的垃圾回收器
  • MemoryManagerMXBean Java虚拟机中的内存管理器
  • MemoryPoolMXBean Java虚拟机中的内存池

三、Zookeeper提供出来的Mbeans

构造MXBean代理实例,通过代理将方法调用转发到给定的MBeanServe。JConsole能够监控的项目,通过API都能获取到。

具体代码如下:

import java.io.IOException;
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.CompilationMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.ThreadMXBean;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.zookeeper.server.ConnectionMXBean;
import org.apache.zookeeper.server.DataTreeMXBean;
import org.apache.zookeeper.server.ZooKeeperServerMXBean;
public class ZkJMXTest {
  static JMXConnector connector;
  /**
   * @param args
   * @throws IOException
   * @throws MalformedObjectNameException
   * @throws InstanceNotFoundException
   * @throws ReflectionException
   * @throws IntrospectionException
   */
  public static void main(String[] args) throws IOException, MalformedObjectNameException,
    InstanceNotFoundException, IntrospectionException, ReflectionException {
    OperatingSystemMXBean osbean = ManagementFactory.getOperatingSystemMXBean();
    System.out.println("体系结构:" + osbean.getArch());//操作系统体系结构
    System.out.println("处理器核数:" + osbean.getAvailableProcessors());///核数
    System.out.println("名字:" + osbean.getName());//名字
    System.out.println(osbean.getVersion());//操作系统版本
    ThreadMXBean threadBean=ManagementFactory.getThreadMXBean();
    System.out.println("活动线程:" + threadBean.getThreadCount());//总线程数
    ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();
    CompilationMXBean compilatiOnMXBean= ManagementFactory.getCompilationMXBean();
    System.out.println("===========");
    // 通过 MBeanServer间接地访问 MXBean 接口
    MBeanServerConnection mbsc = createMBeanServer("192.168.1.100", "9991", "controlRole", "123456");
    // 操作系统
    ObjectName os = new ObjectName("java.lang:type=OperatingSystem");
    System.out.println("体系结构:" + getAttribute(mbsc, os, "Arch"));//体系结构
    System.out.println("处理器核数:" + getAttribute(mbsc, os, "AvailableProcessors"));//核数
    System.out.println("总物理内存:" + getAttribute(mbsc, os, "TotalPhysicalMemorySize"));//总物理内存
    System.out.println("空闲物理内存:" + getAttribute(mbsc, os, "FreePhysicalMemorySize"));//空闲物理内存
    System.out.println("总交换空间:" + getAttribute(mbsc, os, "TotalSwapSpaceSize"));//总交换空间
    System.out.println("空闲交换空间:" + getAttribute(mbsc, os, "FreeSwapSpaceSize"));//空闲交换空间
    System.out.println("操作系统:" + getAttribute(mbsc, os, "Name")+ getAttribute(mbsc, os, "Version"));//操作系统
    System.out.println("提交的虚拟内存:" + getAttribute(mbsc, os, "CommittedVirtualMemorySize"));//提交的虚拟内存
    System.out.println("系统cpu使用率:" + getAttribute(mbsc, os, "SystemCpuLoad"));//系统cpu使用率
    System.out.println("进程cpu使用率:" + getAttribute(mbsc, os, "ProcessCpuLoad"));//进程cpu使用率
    System.out.println("============");//
    // 线程
    ObjectName Threading = new ObjectName("java.lang:type=Threading");
    System.out.println("活动线程:" + getAttribute(mbsc, Threading, "ThreadCount"));// 活动线程
    System.out.println("守护程序线程:" + getAttribute(mbsc, Threading, "DaemonThreadCount"));// 守护程序线程
    System.out.println("峰值:" + getAttribute(mbsc, Threading, "PeakThreadCount"));// 峰值
    System.out.println("启动的线程总数:" + getAttribute(mbsc, Threading, "TotalStartedThreadCount"));// 启动的线程总数
    ThreadMXBean threadBean2 = ManagementFactory.newPlatformMXBeanProxy
        (mbsc, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
    System.out.println("活动线程:" + threadBean2.getThreadCount());// 活动线程
    ThreadMXBean threadBean3 = ManagementFactory.getThreadMXBean();
    System.out.println("本地活动线程:" + threadBean3.getThreadCount());// 本地活动线程
    System.out.println("============");//
    ObjectName Compilation = new ObjectName("java.lang:type=Compilation");
    System.out.println("总编译时间 毫秒:" + getAttribute(mbsc, Compilation, "TotalCompilationTime"));// 总编译时间 毫秒
    System.out.println("============");//
    ObjectName ClassLoading = new ObjectName("java.lang:type=ClassLoading");
    System.out.println("已加载类总数:" + getAttribute(mbsc, ClassLoading, "TotalLoadedClassCount"));// 已加载类总数
    System.out.println("已加装当前类:" + getAttribute(mbsc, ClassLoading, "LoadedClassCount"));// 已加装当前类
    System.out.println("已卸载类总数:" + getAttribute(mbsc, ClassLoading, "UnloadedClassCount"));// 已卸载类总数
    System.out.println("==========================================================");//
    // http://zookeeper.apache.org/doc/r3.4.6/zookeeperJMX.html
    // org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1,name2=Follower
    ObjectName replica = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1");
    System.out.println("replica.1运行状态:" + getAttribute(mbsc, replica, "State"));// 运行状态
    mbsc = createMBeanServer("192.168.1.100", "9992", "controlRole", "123456");
    System.out.println("==============节点树对象===========");
    ObjectName dataTreePattern = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id?,name1=replica.?,name2=*,name3=InMemoryDataTree");
    Set dataTreeSets = mbsc.queryNames(dataTreePattern, null);
    Iterator dataTreeIterator = dataTreeSets.iterator();
    // 只有一个
    while (dataTreeIterator.hasNext()) {
      ObjectName dataTreeObjectName = dataTreeIterator.next();
      DataTreeMXBean dataTree = JMX.newMBeanProxy(mbsc, dataTreeObjectName, DataTreeMXBean.class);
      System.out.println("节点总数:" + dataTree.getNodeCount());// 节点总数
      System.out.println("Watch总数:" + dataTree.getWatchCount());// Watch总数
      System.out.println("临时节点总数:" + dataTree.countEphemerals());// Watch总数
      System.out.println("节点名及字符总数:" + dataTree.approximateDataSize());// 节点全路径和值的总字符数
      Map dataTreeMap = dataTreeObjectName.getKeyPropertyList();
      String replicaId = dataTreeMap.get("name1").replace("replica.", "");
      String role = dataTreeMap.get("name2");// Follower,Leader,Observer,Standalone
      String canOnicalName= dataTreeObjectName.getCanonicalName();
      int roleEndIndex = canonicalName.indexOf(",name3");
      ObjectName roleObjectName = new ObjectName(canonicalName.substring(0, roleEndIndex));
      System.out.println("==============zk服务状态===========");
      ZooKeeperServerMXBean ZooKeeperServer = JMX.newMBeanProxy(mbsc, roleObjectName, ZooKeeperServerMXBean.class);
      System.out.println(role + " 的IP和端口:" + ZooKeeperServer.getClientPort());// IP和端口
      System.out.println(role + " 活着的连接数:" + ZooKeeperServer.getNumAliveConnections());// 连接数
      System.out.println(role + " 未完成请求数:" + ZooKeeperServer.getOutstandingRequests());// 未完成的请求数
      System.out.println(role + " 接收的包:" + ZooKeeperServer.getPacketsReceived());// 收到的包
      System.out.println(role + " 发送的包:" + ZooKeeperServer.getPacketsSent());// 发送的包
      System.out.println(role + " 平均延迟(毫秒):" + ZooKeeperServer.getAvgRequestLatency());
      System.out.println(role + " 最大延迟(毫秒):" + ZooKeeperServer.getMaxRequestLatency());
      System.out.println(role + " 每个客户端IP允许的最大连接数:" + ZooKeeperServer.getMaxClientCnxnsPerHost());
      System.out.println(role + " 最大Session超时(毫秒):" + ZooKeeperServer.getMaxSessionTimeout());
      System.out.println(role + " 心跳时间(毫秒):" + ZooKeeperServer.getTickTime());
      System.out.println(role + " 版本:" + ZooKeeperServer.getVersion());// 版本
      // 三个重置操作
//      ZooKeeperServer.resetLatency(); //重置min/avg/max latency statistics
//      ZooKeeperServer.resetMaxLatency(); //重置最大延迟统计
//      ZooKeeperServer.resetStatistics(); // 重置包和延迟所有统计
      System.out.println("==============所有客户端的连接信息===========");
      ObjectName cOnnectionPattern= new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id?,name1=replica.?,name2=*,name3=Connections,*");
      Set cOnnectionSets= mbsc.queryNames(connectionPattern, null);
      List cOnnectionList= new ArrayList(connectionSets.size());
      connectionList.addAll(connectionSets);
      Collections.sort(connectionList);
      for (ObjectName connectionON : connectionList) {
        System.out.println("=========================");
        ConnectionMXBean cOnnectionBean= JMX.newMBeanProxy(mbsc, connectionON, ConnectionMXBean.class);
        System.out.println(" IP+Port:" + connectionBean.getSourceIP());//
        System.out.println(" SessionId:" + connectionBean.getSessionId());//
        System.out.println(" PacketsReceived:" + connectionBean.getPacketsReceived());// 收到的包
        System.out.println(" PacketsSent:" + connectionBean.getPacketsSent());// 发送的包
        System.out.println(" MinLatency:" + connectionBean.getMinLatency());//
        System.out.println(" AvgLatency:" + connectionBean.getAvgLatency());//
        System.out.println(" MaxLatency:" + connectionBean.getMaxLatency());//
        System.out.println(" StartedTime:" + connectionBean.getStartedTime());//
        System.out.println(" EphemeralNodes:" + connectionBean.getEphemeralNodes().length);//
        System.out.println(" EphemeralNodes:" + Arrays.asList(connectionBean.getEphemeralNodes()));//
        System.out.println(" OutstandingRequests:" + connectionBean.getOutstandingRequests());//
        //connectionBean.resetCounters();
        //connectionBean.terminateConnection();
        //connectionBean.terminateSession();
      }
    }
    // close connection
    if (connector != null) {
      connector.close();
    }
  }
  /**
   * 建立连接
   * @param ip
   * @param jmxport
   * @return
   */
  public static MBeanServerConnection createMBeanServer(String ip,
      String jmxport, String userName, String password) {
    try {
      String jmxURL = "service:jmx:rmi:///jndi/rmi://" + ip + ":"
          + jmxport + "/jmxrmi";
      // jmxurl
      JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
      Map map = new HashMap();
      String[] credentials = new String[] { userName, password };
      map.put("jmx.remote.credentials", credentials);
      cOnnector= JMXConnectorFactory.connect(serviceURL, map);
      MBeanServerConnection mbsc = connector.getMBeanServerConnection();
      return mbsc;
    } catch (IOException ioe) {
      ioe.printStackTrace();
      System.err.println(ip + ":" + jmxport + " 连接建立失败");
    }
    return null;
  }
  /**
   * 使用MBeanServer获取对象名为[objName]的MBean的[objAttr]属性值
   * 

* 静态代码: return MBeanServer.getAttribute(ObjectName name, String attribute) * @param mbeanServer * - MBeanServer实例 * @param objName * - MBean的对象名 * @param objAttr * - MBean的某个属性名 * @return 属性值 */ private static String getAttribute(MBeanServerConnection mbeanServer, ObjectName objName, String objAttr) { if (mbeanServer == null || objName == null || objAttr == null) throw new IllegalArgumentException(); try { return String.valueOf(mbeanServer.getAttribute(objName, objAttr)); } catch (Exception e) { return null; } } }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接


推荐阅读
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 在CentOS系统中部署与配置ZooKeeper详解 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • Spark中使用map或flatMap将DataSet[A]转换为DataSet[B]时Schema变为Binary的问题及解决方案
    本文探讨了在使用Spark的map或flatMap算子将一个数据集转换为另一个数据集时,遇到的Schema变为Binary的问题,并提供了详细的解决方案。 ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • 新年伊始,正是学习的最佳时机。本文全面解析了CK1957-Zookeeper的核心概念与实践技巧,旨在帮助初学者快速掌握这一深度学习工具。通过详细的理论讲解和实际操作示例,读者可以更好地理解Zookeeper的工作原理及其在分布式系统中的应用。无论是新手还是有一定基础的学习者,都能从中受益匪浅。 ... [详细]
author-avatar
别拿明天会好做借口
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有