zoukankan      html  css  js  c++  java
  • zookeeper

    一、zookeeper监控方式

    根据官网介绍主要有两种监控方式,
    1:使用ssh建立远程连接,然后使用"echo stat | nc ip port"命令返回结果。开源项目代表taokeeper。
    2:使用JMX监控,文档[http://zookeeper.apache.org/doc/r3.4.6/zookeeperJMX.html]
    我们考虑使用JMX监控是因为运维不希望在服务器之间配置ssh连接,或者openSSH,服务器太多难以管理用户密码和公钥,容易混乱。

    二、zookeeper服务开启JMX监控

    修改zookeeper的启动脚本vim zkServer.sh。找到启动参数ZOOMAIN,修改为下面值。
    其中local.only=false,设为false才能在远程建立连接。

    [java] view plain copy
     
    1. ZOOMAIN="-Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.local.only=false  
    2.  -Djava.rmi.server.hostname=127.0.0.1  
    3.  -Dcom.sun.management.jmxremote.port=9991  
    4.  -Dcom.sun.management.jmxremote.ssl=true  
    5.  -Dcom.sun.management.jmxremote.authenticate=true  
    6.  -Dcom.sun.management.jmxremote.access.file=/data/zookeeper/conf/jmxremote.access  
    7.  -Dcom.sun.management.jmxremote.password.file=/data/zookeeper/conf/jmxremote.password  
    8.  -Dzookeeper.jmx.log4j.disable=true  
    9.  org.apache.zookeeper.server.quorum.QuorumPeerMain"  

    在/data/zookeeper/conf目录下建立2个访问授权文件, 修改文件权限chmod 600 jmxremote.*

    [java] view plain copy
     
    1. -rw-------  1 deploy deploy  149 Aug  13:44 jmxremote.access  
    2. -rw-------  1 deploy deploy   40 Aug  13:46 jmxremote.password  
    3. [deploy@liutp conf]$ pwd  
    4. /data/zookeeper/conf  
    5. [deploy@liutp conf]$ cat jmxremote.access  
    6. monitorRole   readonly  
    7. controlRole   readwrite   
    8.               create javax.management.monitor.*,javax.management.timer.*   
    9.               unregister  
    10. [deploy@liutp conf]$ cat jmxremote.password  
    11. monitorRole  1234567  
    12. controlRole  1234567  
    13. [deploy@liutp conf]$  

    关于权限文件内容的设置可以参考jdk里的文件:C:Javajdk1.7.0_79jrelibmanagementjmxremote.password.template
    重启zk服务 :zkServer.sh restart /data/zookeeper/conf/zk1.cfg

    三、使用Java自带的JConsole

    在命令行输入JConsole,再回车。
    在弹出的界面选择“远程进程”,输入“服务器IP:9991”(zookeeper服务器的IP和端口)
    用户名:controlRole密码:1234567就能查看节点数,连接数,watch数

    一、背景

    上一篇通过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都能获取到。
    具体代码如下:

    [java] view plain copy
     
      1. import java.io.IOException;  
      2. import java.lang.management.ClassLoadingMXBean;  
      3. import java.lang.management.CompilationMXBean;  
      4. import java.lang.management.ManagementFactory;  
      5. import java.lang.management.OperatingSystemMXBean;  
      6. import java.lang.management.ThreadMXBean;  
      7. import java.util.ArrayList;  
      8. import java.util.Arrays;  
      9. import java.util.Collections;  
      10. import java.util.HashMap;  
      11. import java.util.Iterator;  
      12. import java.util.List;  
      13. import java.util.Map;  
      14. import java.util.Set;  
      15.   
      16. import javax.management.InstanceNotFoundException;  
      17. import javax.management.IntrospectionException;  
      18. import javax.management.JMX;  
      19. import javax.management.MBeanServerConnection;  
      20. import javax.management.MalformedObjectNameException;  
      21. import javax.management.ObjectName;  
      22. import javax.management.ReflectionException;  
      23. import javax.management.remote.JMXConnector;  
      24. import javax.management.remote.JMXConnectorFactory;  
      25. import javax.management.remote.JMXServiceURL;  
      26.   
      27. import org.apache.zookeeper.server.ConnectionMXBean;  
      28. import org.apache.zookeeper.server.DataTreeMXBean;  
      29. import org.apache.zookeeper.server.ZooKeeperServerMXBean;  
      30.   
      31. public class ZkJMXTest {  
      32.     static JMXConnector connector;  
      33.   
      34.     /** 
      35.      * @param args 
      36.      * @throws IOException 
      37.      * @throws MalformedObjectNameException 
      38.      * @throws InstanceNotFoundException 
      39.      * @throws ReflectionException 
      40.      * @throws IntrospectionException 
      41.      */  
      42.     public static void main(String[] args) throws IOException, MalformedObjectNameException,  
      43.         InstanceNotFoundException, IntrospectionException, ReflectionException {  
      44.   
      45.         OperatingSystemMXBean osbean = ManagementFactory.getOperatingSystemMXBean();  
      46.         System.out.println("体系结构:" + osbean.getArch());//操作系统体系结构  
      47.         System.out.println("处理器核数:" + osbean.getAvailableProcessors());///核数  
      48.         System.out.println("名字:" + osbean.getName());//名字  
      49.   
      50.         System.out.println(osbean.getVersion());//操作系统版本  
      51.         ThreadMXBean threadBean=ManagementFactory.getThreadMXBean();  
      52.         System.out.println("活动线程:" + threadBean.getThreadCount());//总线程数  
      53.   
      54.         ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();  
      55.         CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();  
      56.         System.out.println("===========");  
      57.   
      58.         // 通过 MBeanServer间接地访问 MXBean 接口  
      59.         MBeanServerConnection mbsc = createMBeanServer("192.168.1.100", "9991", "controlRole", "123456");  
      60.   
      61.         // 操作系统  
      62.         ObjectName os = new ObjectName("java.lang:type=OperatingSystem");  
      63.         System.out.println("体系结构:" + getAttribute(mbsc, os, "Arch"));//体系结构  
      64.         System.out.println("处理器核数:" + getAttribute(mbsc, os, "AvailableProcessors"));//核数  
      65.         System.out.println("总物理内存:" + getAttribute(mbsc, os, "TotalPhysicalMemorySize"));//总物理内存  
      66.         System.out.println("空闲物理内存:" + getAttribute(mbsc, os, "FreePhysicalMemorySize"));//空闲物理内存  
      67.         System.out.println("总交换空间:" + getAttribute(mbsc, os, "TotalSwapSpaceSize"));//总交换空间  
      68.         System.out.println("空闲交换空间:" + getAttribute(mbsc, os, "FreeSwapSpaceSize"));//空闲交换空间  
      69.   
      70.         System.out.println("操作系统:" + getAttribute(mbsc, os, "Name")+ getAttribute(mbsc, os, "Version"));//操作系统  
      71.         System.out.println("提交的虚拟内存:" + getAttribute(mbsc, os, "CommittedVirtualMemorySize"));//提交的虚拟内存  
      72.         System.out.println("系统cpu使用率:" + getAttribute(mbsc, os, "SystemCpuLoad"));//系统cpu使用率  
      73.         System.out.println("进程cpu使用率:" + getAttribute(mbsc, os, "ProcessCpuLoad"));//进程cpu使用率  
      74.   
      75.         System.out.println("============");//  
      76.         // 线程  
      77.         ObjectName Threading = new ObjectName("java.lang:type=Threading");  
      78.         System.out.println("活动线程:" + getAttribute(mbsc, Threading, "ThreadCount"));// 活动线程  
      79.         System.out.println("守护程序线程:" + getAttribute(mbsc, Threading, "DaemonThreadCount"));// 守护程序线程  
      80.         System.out.println("峰值:" + getAttribute(mbsc, Threading, "PeakThreadCount"));// 峰值  
      81.         System.out.println("启动的线程总数:" + getAttribute(mbsc, Threading, "TotalStartedThreadCount"));// 启动的线程总数  
      82.         ThreadMXBean threadBean2 = ManagementFactory.newPlatformMXBeanProxy  
      83.                 (mbsc, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);  
      84.         System.out.println("活动线程:" + threadBean2.getThreadCount());// 活动线程  
      85.         ThreadMXBean threadBean3 = ManagementFactory.getThreadMXBean();  
      86.         System.out.println("本地活动线程:" + threadBean3.getThreadCount());// 本地活动线程  
      87.   
      88.         System.out.println("============");//  
      89.         ObjectName Compilation = new ObjectName("java.lang:type=Compilation");  
      90.         System.out.println("总编译时间 毫秒:" + getAttribute(mbsc, Compilation, "TotalCompilationTime"));// 总编译时间 毫秒  
      91.   
      92.         System.out.println("============");//  
      93.         ObjectName ClassLoading = new ObjectName("java.lang:type=ClassLoading");  
      94.         System.out.println("已加载类总数:" + getAttribute(mbsc, ClassLoading, "TotalLoadedClassCount"));// 已加载类总数  
      95.         System.out.println("已加装当前类:" + getAttribute(mbsc, ClassLoading, "LoadedClassCount"));// 已加装当前类  
      96.         System.out.println("已卸载类总数:" + getAttribute(mbsc, ClassLoading, "UnloadedClassCount"));// 已卸载类总数  
      97.   
      98.   
      99.         System.out.println("==========================================================");//  
      100.         // http://zookeeper.apache.org/doc/r3.4.6/zookeeperJMX.html  
      101.         // org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1,name2=Follower  
      102.         ObjectName replica = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1");  
      103.         System.out.println("replica.1运行状态:" + getAttribute(mbsc, replica, "State"));// 运行状态  
      104.   
      105.         mbsc = createMBeanServer("192.168.1.100", "9992", "controlRole", "123456");  
      106.         System.out.println("==============节点树对象===========");  
      107.         ObjectName dataTreePattern = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id?,name1=replica.?,name2=*,name3=InMemoryDataTree");  
      108.         Set<ObjectName> dataTreeSets = mbsc.queryNames(dataTreePattern, null);  
      109.         Iterator<ObjectName> dataTreeIterator = dataTreeSets.iterator();  
      110.         // 只有一个  
      111.         while (dataTreeIterator.hasNext()) {  
      112.             ObjectName dataTreeObjectName = dataTreeIterator.next();  
      113.             DataTreeMXBean dataTree = JMX.newMBeanProxy(mbsc, dataTreeObjectName, DataTreeMXBean.class);  
      114.             System.out.println("节点总数:" + dataTree.getNodeCount());// 节点总数  
      115.             System.out.println("Watch总数:" + dataTree.getWatchCount());// Watch总数  
      116.             System.out.println("临时节点总数:" + dataTree.countEphemerals());// Watch总数  
      117.             System.out.println("节点名及字符总数:" + dataTree.approximateDataSize());// 节点全路径和值的总字符数  
      118.   
      119.             Map<String, String> dataTreeMap = dataTreeObjectName.getKeyPropertyList();  
      120.             String replicaId = dataTreeMap.get("name1").replace("replica.", "");  
      121.             String role = dataTreeMap.get("name2");// Follower,Leader,Observer,Standalone  
      122.             String canonicalName = dataTreeObjectName.getCanonicalName();  
      123.             int roleEndIndex = canonicalName.indexOf(",name3");  
      124.   
      125.             ObjectName roleObjectName = new ObjectName(canonicalName.substring(0, roleEndIndex));  
      126.             System.out.println("==============zk服务状态===========");  
      127.             ZooKeeperServerMXBean ZooKeeperServer = JMX.newMBeanProxy(mbsc, roleObjectName, ZooKeeperServerMXBean.class);  
      128.             System.out.println(role + " 的IP和端口:" + ZooKeeperServer.getClientPort());// IP和端口  
      129.             System.out.println(role + " 活着的连接数:" + ZooKeeperServer.getNumAliveConnections());// 连接数  
      130.             System.out.println(role + " 未完成请求数:" + ZooKeeperServer.getOutstandingRequests());// 未完成的请求数  
      131.             System.out.println(role + " 接收的包:" + ZooKeeperServer.getPacketsReceived());// 收到的包  
      132.             System.out.println(role + " 发送的包:" + ZooKeeperServer.getPacketsSent());// 发送的包  
      133.             System.out.println(role + " 平均延迟(毫秒):" + ZooKeeperServer.getAvgRequestLatency());  
      134.             System.out.println(role + " 最大延迟(毫秒):" + ZooKeeperServer.getMaxRequestLatency());  
      135.   
      136.             System.out.println(role + " 每个客户端IP允许的最大连接数:" + ZooKeeperServer.getMaxClientCnxnsPerHost());  
      137.             System.out.println(role + " 最大Session超时(毫秒):" + ZooKeeperServer.getMaxSessionTimeout());  
      138.             System.out.println(role + " 心跳时间(毫秒):" + ZooKeeperServer.getTickTime());  
      139.             System.out.println(role + " 版本:" + ZooKeeperServer.getVersion());// 版本  
      140.             // 三个重置操作  
      141. //            ZooKeeperServer.resetLatency(); //重置min/avg/max latency statistics  
      142. //            ZooKeeperServer.resetMaxLatency(); //重置最大延迟统计  
      143. //            ZooKeeperServer.resetStatistics(); // 重置包和延迟所有统计  
      144.   
      145.   
      146.             System.out.println("==============所有客户端的连接信息===========");  
      147.             ObjectName connectionPattern = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id?,name1=replica.?,name2=*,name3=Connections,*");  
      148.             Set<ObjectName> connectionSets = mbsc.queryNames(connectionPattern, null);  
      149.             List<ObjectName> connectionList = new ArrayList<ObjectName>(connectionSets.size());  
      150.             connectionList.addAll(connectionSets);  
      151.             Collections.sort(connectionList);  
      152.             for (ObjectName connectionON : connectionList) {  
      153.                 System.out.println("=========================");  
      154.                 ConnectionMXBean connectionBean = JMX.newMBeanProxy(mbsc, connectionON, ConnectionMXBean.class);  
      155.                 System.out.println(" IP+Port:" + connectionBean.getSourceIP());//  
      156.                 System.out.println(" SessionId:" + connectionBean.getSessionId());//  
      157.                 System.out.println(" PacketsReceived:" + connectionBean.getPacketsReceived());// 收到的包  
      158.                 System.out.println(" PacketsSent:" + connectionBean.getPacketsSent());// 发送的包  
      159.                 System.out.println(" MinLatency:" + connectionBean.getMinLatency());//  
      160.                 System.out.println(" AvgLatency:" + connectionBean.getAvgLatency());//  
      161.                 System.out.println(" MaxLatency:" + connectionBean.getMaxLatency());//  
      162.                 System.out.println(" StartedTime:" + connectionBean.getStartedTime());//  
      163.                 System.out.println(" EphemeralNodes:" + connectionBean.getEphemeralNodes().length);//  
      164.                 System.out.println(" EphemeralNodes:" + Arrays.asList(connectionBean.getEphemeralNodes()));//  
      165.                 System.out.println(" OutstandingRequests:" + connectionBean.getOutstandingRequests());//  
      166.                   
      167.                 //connectionBean.resetCounters();  
      168.                 //connectionBean.terminateConnection();  
      169.                 //connectionBean.terminateSession();  
      170.             }  
      171.         }  
      172.         // close connection  
      173.         if (connector != null) {  
      174.             connector.close();  
      175.         }  
      176.     }  
      177.   
      178.     /** 
      179.      * 建立连接 
      180.      * 
      181.      * @param ip 
      182.      * @param jmxport 
      183.      * @return 
      184.      */  
      185.     public static MBeanServerConnection createMBeanServer(String ip,  
      186.             String jmxport, String userName, String password) {  
      187.         try {  
      188.             String jmxURL = "service:jmx:rmi:///jndi/rmi://" + ip + ":"  
      189.                     + jmxport + "/jmxrmi";  
      190.             // jmxurl  
      191.             JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);  
      192.   
      193.             Map<String, String[]> map = new HashMap<String, String[]>();  
      194.             String[] credentials = new String[] { userName, password };  
      195.             map.put("jmx.remote.credentials", credentials);  
      196.             connector = JMXConnectorFactory.connect(serviceURL, map);  
      197.             MBeanServerConnection mbsc = connector.getMBeanServerConnection();  
      198.             return mbsc;  
      199.   
      200.         } catch (IOException ioe) {  
      201.             ioe.printStackTrace();  
      202.             System.err.println(ip + ":" + jmxport + " 连接建立失败");  
      203.         }  
      204.         return null;  
      205.     }  
      206.   
      207.     /** 
      208.      * 使用MBeanServer获取对象名为[objName]的MBean的[objAttr]属性值 
      209.      * <p> 
      210.      * 静态代码: return MBeanServer.getAttribute(ObjectName name, String attribute) 
      211.      * 
      212.      * @param mbeanServer 
      213.      *            - MBeanServer实例 
      214.      * @param objName 
      215.      *            - MBean的对象名 
      216.      * @param objAttr 
      217.      *            - MBean的某个属性名 
      218.      * @return 属性值 
      219.      */  
      220.     private static String getAttribute(MBeanServerConnection mbeanServer,  
      221.             ObjectName objName, String objAttr) {  
      222.         if (mbeanServer == null || objName == null || objAttr == null)  
      223.             throw new IllegalArgumentException();  
      224.         try {  
      225.             return String.valueOf(mbeanServer.getAttribute(objName, objAttr));  
      226.         } catch (Exception e) {  
      227.             return null;  
      228.         }  
      229.     }  
      230. }  
  • 相关阅读:
    css常用格式
    css选择器
    D1-mini esp8266的资料备份
    总结esp8266刷Python的完整的步骤(终极总结)
    用Python利用pyFirmata控制Arduino实现Blink
    microPython 的逗比报错的问题
    python+opencv+Face++实现人脸识别比对
    TypeError: slice indices must be integers or None or have an __index__ method
    opencv识别验证码的教程和资料
    校园网一键登录后台
  • 原文地址:https://www.cnblogs.com/felixzh/p/5868626.html
Copyright © 2011-2022 走看看