一、动态监控服务器节点变动——脚本编写
1、定义一个监控标记类
public class ListenerParam { public static int flag=0;//标记作用,用于判断线程执行情况 public static long start =0;//记录开始时间 public static Vector<Long> vector=new Vector<Long>();//存储各个线程获取节点变动的时间 }
2、编写监控线程
public class ListenerThread extends Thread{ public ZkClient zk; public String nodeName; public ListenerThread(String nodeName, ZkClient zk) { this.zk=zk; this.nodeName=nodeName; } public void run(){ //监控指定节点变动 zk.subscribeDataChanges(nodeName, new IZkDataListener() { //节点change public void handleDataChange(String s, Object o) throws Exception { // //计算时间间隔 // long time = System.currentTimeMillis() - ListenerParam.start; // ListenerParam.vector.addElement(time); } //节点删除 public void handleDataDeleted(String s) throws Exception { //计算时间间隔 long time = System.currentTimeMillis() - ListenerParam.start; ListenerParam.vector.addElement(time); } }); //监控指定节点下的子节点变动,仅能监控儿子节点 if(zk.exists(nodeName)){//判断节点是否存在 if (!zk.getChildren(nodeName).equals(null)){//节点存在 zk.subscribeChildChanges(nodeName, new IZkChildListener() { //子节点变动 public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { //计算时间间隔 // long time = System.currentTimeMillis() - ListenerParam.start; // ListenerParam.vector.addElement(time); } }); } }else { System.out.println("节点:"+nodeName+"不存在"); } System.out.println("listener start"+ListenerParam.flag); ListenerParam.flag++;//标记作用 //保持持续监控 while (true) { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
3、调用线程,实时监控
public class ZK_Main { private ZkClient zk; private String nodeName = "/server3";//指定节点 添加需要在下面在设置子节点 public void initTest() { zk = new ZkClient("172.31.7.170:2181"); System.out.println("connection successful"); } public void UpdateNode() throws InterruptedException { initTest();//启动连接 //String path =nodeName+"/add3";//设置添加的节点 for (int i=0;i<1000;i++){//启动一千个监控线程 ListenerThread listenerThread =new ListenerThread(nodeName,zk);//调用线程 启动监控 listenerThread.start(); } while (true){//等待线程启动完成 Thread.sleep(10);//避免堵塞 if (ListenerParam.flag==1000){//一千个监控完全启动后 // ListenerParam.start=System.currentTimeMillis();//记录开始时间 // zk.createPersistent(nodeName);//执行添加二级节点 // zk.writeData(nodeName,"update0");//修改节点 // zk.delete(nodeName); // ListenerParam.start=System.currentTimeMillis();//记录开始时间 break; }}}
public static void main(String[] args) throws InterruptedException { ZK_Main Main=new ZK_Main(); try { Main.UpdateNode();//调用添加方法 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } while (true){//等待所有监控完成 捕捉 节点变动 if (ListenerParam.vector.size()==1000){ System.out.println(ListenerParam.vector); //处理 获取max、min、avg,三个值 long max=ListenerParam.vector.get(0); long min=ListenerParam.vector.get(0); long sum=ListenerParam.vector.get(0); for (int i=1;i<1000;i++){ if (ListenerParam.vector.get(i)>max){max=ListenerParam.vector.get(i);} if (ListenerParam.vector.get(i)<min){ min=ListenerParam.vector.get(i);} sum=sum+ListenerParam.vector.get(i); } System.out.println("time_max:"+max); System.out.println("time_min:"+min); System.out.println("time_vag:"+sum/1000); break; }}}}
二、服务器环境部署
1、zookeeper部署
http://blog.csdn.net/lihao21/article/details/51778255
2、zkUI部署
下载zkUI工具程序,修改配置文件 服务器zk地址
本地可以用开发软件直接运行,服务器需要打jar包,在运行
(打包jar 执行nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &)
更具自己配置的地址打开监控页面 例如172.31.7.170:9090(默认端口)
3、执行脚本 ,查看控制台及ZKUI监控页面情况