分享

Zookeeper分布式技术详解 (一)zookeeper 集群的 监控图形化页面

 WindySky 2018-03-13

监控管理平台的意义

  为什么大公司都在花大的人力物力来搞完善的监控以及维护平台,这么难道让开发人员自己维护岂不是省下很多钱?
  我觉得有这么几个原因:
  从公司角度来讲我感觉产品在功能、性能方面的以后能正常运行才是对公司最关心的事情,至于产品研发阶段只是盖房子阶段。
  有了管理系统可以提高开发以及解决问题的效率,比如zookeeper需要增减节点或者增减机器只需要在页面上面配置一下就好了,传统方式还得亲自去敲很多代码,很多命令才能搞定,假如命令需要半天,那页面只需几十秒甚至几秒钟可以搞定。
  一个好的监控平台也可以代表公司系统以及业务发展水平,公司如果就一个系统就没必要开发监控,相反如果有几百个业务,上百台应用系统监控就必须要要有了,下面我们先来自己写一个监控zookeeper集群数据的工具类。

客户端脚本zkCli.sh建立节点

  使用zkcli.sh建立节点比较简单,为方便测试先建立 /animal 、/animal/pig、/animal/elephant 三个节点。
这里写图片描述

自定义ZkAdminUtils工具类

  先让我们通过zookeeer java api自己手动来编写一个操作服务器的工具类,该工具类可以维护zookeeper节点以及数据,我们先些简单一些。如下包含了如果子节点数据一节指定节点数据。

package com.tgb.bigrice.time.zk.test.client;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created by lilongsheng on 2017/3/11 0011.
 */
public class ZkAdminUtils implements Watcher {
    private static final Logger LOGGER = LoggerFactory.getLogger(ZkAdminUtils.class);

    ZooKeeper zk;
    private String hostPort;

    public ZkAdminUtils(String hostPort) {
        this.hostPort = hostPort;
    }

    public void startZK() throws Exception {
        long zk_start = System.currentTimeMillis();
        zk = new ZooKeeper(hostPort, 15000, this);
        System.out.println("zk 初始化耗时=" + (System.currentTimeMillis() - zk_start) + "毫秒");
        System.out.println("zk 状态=" + zk.getState());
    }

    @Override
    public void process(WatchedEvent event) {
        if (Event.KeeperState.SyncConnected == event.getState()) {
            System.out.println("zk 初始化成功,状态=" + event.getState());
        }
    }

    /**
     * 获取制定目录下的子节点列表
     * @param path
     * @return
     * @throws KeeperException
     */
    List<String> getChildrenZnodeData(String path) throws KeeperException {
        List<String> znodes = new ArrayList<String>();
        try {

            System.out.println(zk.getChildren(path, false));
            for (String w : zk.getChildren(path, false)) {
                byte data[] = zk.getData(path + w, false, null);
                String state = new String(data);
                znodes.add(state);
            }
            return znodes;
        } catch (KeeperException.NoNodeException e) {
            System.out.println("no znode");
        } catch (InterruptedException ee) {
            ee.printStackTrace();
        }
        return znodes;
    }

    /**
     * 获取指定节点数据
     * @param path
     * @return
     * @throws KeeperException
     */
    String getZnodeData(String path) throws KeeperException {
        try {
            Stat stat = new Stat();
            byte masterData[] = zk.getData(path, false, stat);
            Date startDate = new Date(stat.getCtime());
            return new String(masterData);
        } catch (KeeperException.NoNodeException e) {
            System.out.println("no more znode");
        } catch (InterruptedException ee) {
            ee.printStackTrace();
        }
        return "";
    }

    public static void main(String[] args) throws Exception {
        ZkAdminUtils c = new ZkAdminUtils("180.76.176.91:2181");
        c.startZK();

        List<String> znodes = c.getChildrenZnodeData("/animal");

        System.out.println(znodes.toString());
    }
}  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

  上面是我简单些了一下读取节点数据的例子,还可以通过setData更新节点并设置watcher监视点,保证我们读取的是最新数据。即使再丰富的工具类也没有点点界面来的快,运行效果如下:
这里写图片描述

可视化界面工具

  这个web页面是别人自己写的,看了一下源码到时不难,利用的java web项目springmvc、freework等。
  zookeeper在分布式项目中起着非常重要的角色,它可以解决数据发布订阅、负载均衡、命名服务、分布式服务协调通知、集群管理、分布式锁等各种分布式下复杂的问题,因为得到了很多中小企业的青睐,如果没有界面那么每次查看服务器数据或者状态我们需要通过连接服务器或者java api getData获取数据,感觉会比较麻烦,很不好维护,如前面博客中我们已经搭建好了zookeeper集群,这里我们重点介绍zookeeper可视化工具。
  各种服务系统都需要有监控来确保我们对各种服务器的运行情况了如指掌,假如我们我搭建监控当出现问题的时候,需要手动连接到服务器上面然后一个一个敲命令执行,给后期的维护带来了很高的成本,而且不容易维护。
  zookeeper的可视化工具也是很多,每个的公司都有自己的维护工具,我们来分别介绍一下。

配置监控

淘宝的taobaozookeeper

网上的安装教程很详细,就不再这里叙述。
安装教程地址:http://blog.csdn.net/zhu_tianwei/article/details/42808577

zookeeper-web网页管理页面

源码地址:https://git.oschina.net/crystony/zookeeper-web 
这个页面监控感觉图形界面挺好看的,所以我安装的这个监控,整体感觉不错,可以看到zookeeper中有几个节点,以及每个节点的数据。
运行该页面几乎不需要配置,把它编译打包成war然后放到自己的tomcat里面即可云心起来,如果想查看自己机器的zookeeper只需要把IP:PORT 字符串复制出来进行查询即可。
安装效果图:

这里写图片描述
查看效果图:
这里写图片描述

我的实例地址:http://180.76.176.91:8099/zookeeper-web/

参考文档:
http://blog.csdn.net/zhu_tianwei/article/details/42808577
http://blog.csdn.net/zhu_tianwei/article/details/40685251

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多