我就是个封面

Zookeeper简介

Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统。

简单来说就是一个Zookeeper注册同步中心,内部结构为一个树形目录,每个节点上可以存放一定量(默认的数据量上限是1M,但是可以通过调整参数修改)的数据,客户端(一段通过Zookeeperapi编写的程序或者一个cmd和shell窗口)连接Zookeeper后,可以在任何节点上注册监听(watcher),当节点被删除或者节点上的数据有变化时,Zookeeper会主动触发注册在当前节点上的监听程序。

同时Zookeeper类似于文件系统,各个节点都可以配置不同的读写访问权限。

zookeeper本身是支持多个zookeeper组成集群,利用选举机制选出负责不同职责的角色,本文暂不涉及。

案例

备注:由于全文粘贴代码实在不好排版,本文代码相关部分,只介绍了相关片段,完整的请下载后查看。

界面示例(动效):

本文利用Zookeeper节点可存放数据以及节点可监听的机制,借助WebSocket实现对多个服务器的实时监控。具体web端效果如下(由于是模拟,界面略显粗糙):

可以同时打开多个浏览器,接收WebSocket推送的实时监控数据。

实现逻辑

实现过程

本文用到maven以及websocket,这两部分内容本文只做配置介绍,相关知识需自己提前掌握。同时zookeeper的详细命令和api也不做详细解释,可自己试验。

环境:

eclispe Oxygen Release (4.7.0);

maven 3.2.2

Zookeeper3.4.13

win10环境(一般线上都是linux环境,这里为了省事所有都在自己的笔记本上折腾的,所以用了win环境)

1、Zookeeper的安装

安装比较简单,这里略过,下载后解压,配置zoo.cfg里面的目录参数,完后就可以启动了。

2、启动Zookeeper

打开cmd窗口运行Zookeeper安装目录bin下的zkServer.cmd,即可。

也可写个bat文件,方便每次使用,内容(保存即可,其中d:\zookeeper-3.4.13\bin是我的zookeeper的bin目录)如下:

cd d:\zookeeper-3.4.13\bin

d:

zkServer.cmd

@pause

3、创建根目录

通过cmd连接到Zookeeper创建更目录/servers,也可通过java代码来创建。

client的bat启动内容参考如下:

cd d:\zookeeper-3.4.13\bin

d:

zkCli.cmd -server 127.0.0.1:2181

@pause

回车之后,通过命令create /server  serverlist 完成根节点的创建, 后面所有待监控的服务器都在此节点下创建子节点(临时节点)。

关于zookeeper节点的类型,也请自行脑补。

这里根节点为持久化节点,服务器数据节点为临时节点,是因为服务器程序在于zookeeper断开后,需要删除节点,这样才监控程序才能知道服务器下线了。当然实际线上应该都会采用持久化节点,然后通过状态数据来判断,这里就偷懒了。

3、代码编写

maven配置

整个示例有2个项目组成:一个是模拟服务器的程序(定时采集监控指标,把指标数据更新到node上),一个是监控程序(用于监控zookeeper节点变化,并获取节点数据计算阈值,并通过Websocket推送数据到浏览器)。

business-server(服务器指标采集程序)的maven配置

只依赖zookeeper的jar:

business-server-monitor(监控程序)的maven配置:

由于有web界面,所以需依赖Servlet、JavaEE相关包,同时容器采用了maven的jetty插件,关于maven配置jetty以及如何启动可以参考上一篇文章中的相关介绍:模块化编程及Maven配置最佳实践之一

当然实现Websocket的方式有很多,比如SpringMvc,SpringBoot等等,这里为了防止太多干扰就用了原生写法。具体maven配置如下:

1、business-server(服务器指标采集程序) 代码片段:

代码逻辑为:启动后(main方法)连接zookeeper并建立临时节点,同时初始化数据,之后启动模拟指标采集的线程,间隔一段时间生成随机指标数据。

创建临时节点代码片段:

其中ACL是zookeeper的节点访问权限配置,也需要自行脑补。

模拟指标变化并将数据更新到节点上

其中ServerData是我自己创建的bean对象,用于存放服务器指标,如下:

主要包含3个模拟指标,cpu,内存,磁盘,可自己添加。指标和zookeeper无关。

至此采集程序代码就结束了。

2、business-server-monitor(监控程序)实时监控zookeeper节点变化并推送数据的代码片段

项目启动采用了JavaEE的ServletContextListener监听启动的方式来启动和Zookeeper的连接,需要在web.xml配置这个Listener。

继承ServletContextListener

当jetty容器初始化后,触发建立和zookeeper的连接并注册监听:

然后通过Zookeeper api中的的getChildren获取节点数据并启动监听,

List<String> servers = zk.getChildren(ServerData.serverRootNode, true);

当节点发生数据变化时触发监听的process方法,process方法获取根节点下的所有子节点的数据并封装成ServerData对象列表,用于websocket推送。

之后通过Websocket推送到浏览器:

Websocket配置很简单,只需要注释上先关annotation(@ServerEndpoint)即可,无需其他配置,容器启动时会自行扫描到此类。

推送数据这里就简单了拼接成了html,界面上就直接放在div就行了。

3、monitor.jsp获取实时监控数据

以上便是这个例子的完成介绍过程。

源码下载

为防止地址失效,所有下载链接都在公众号维护,请关注公众号后,回复“R002” 获取完整源码。

Zookeeper+websocket实现对分布式服务器的实时监控(附源码下载)的更多相关文章

  1. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  2. 用Darwin开发RTSP级联服务器(拉模式转发)(附源码)

    源码下载地址:https://github.com/EasyDarwin orwww.easydarwin.org 在博客 在Darwin进行实时视频转发的两种模式 中,我们描述了流媒体服务器对源端音 ...

  3. IM即时通讯设计 高并发聊天服务:服务器 + qt客户端(附源码)

    来源:微信公众号「编程学习基地」 目录 IM即时通信程序设计 IM即时通讯 设计一款高并发聊天服务需要注意什么 如何设计可靠的消息处理服务 什么是粘包 什么是半包 解决粘包和半包 IM通信协议 应用层 ...

  4. 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)

    在介绍之前,先简单说一说ASP.NET服务端GZIP压缩模块的作用及工作原理,很多人编写网页的时候页面因为使用了大量的JS特效又或者放置很多大型动态广告导致了页面或脚本体积庞大,通常都会使用一些压缩工 ...

  5. 实时滚动图表绘制方法: LightningChart教程 + 源码下载

    LightningChart图形控件彻底发挥了GPU加速和性能优化的最大效应,能够实时呈现超过10亿数据点的庞大数据,为大家提供先进与快速的图表库.这里的实时图实现的比较简单,大家先试一下这个效果,熟 ...

  6. 为SRS流媒体服务器添加HLS加密功能(附源码)

    为SRS流媒体服务器添加HLS加密功能(附源码) 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的叫做 ...

  7. (3.10)mysql基础深入——mysqld 服务器与客户端连接过程 源码分析【待写】

    (3.10)mysql基础深入——mysqld 服务器与客户端连接过程 源码分析[待写]

  8. DirectShow音频采集pcm,实时编码AAC,附源码

    定期送福利,今天给大家送上Windows中利用DirectShow采集microphone音频,并将采集到的pcm数据,利用FAAC库编码成AAC,进行本地存储或者网络传输. 直接贴代码,解析看注释: ...

  9. 用live555将内网摄像机视频推送到外网服务器,附源码

    最近很多人问,如何将内网的摄像机流媒体数据发布到公网,如果用公网与局域网间的端口映射方式太过麻烦,一个摄像机要做一组映射,而且不是每一个局域网都是有固定ip地址,即使外网主机配置好了每一个摄像机的映射 ...

随机推荐

  1. 如何理解 Spring 注入

    先看一段代码 假设你编写了两个类,一个是人(Person),一个是手机(Mobile). 人有时候需要用手机打电话,需要用到手机的dialUp方法. 传统的写法是这样: Java code publi ...

  2. 「CF779B」「LOJ#10201.」「一本通 6.2 练习 4」Sherlock and His Girlfriend(埃氏筛

    题目描述 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 nnn 件珠宝.第 iii ...

  3. Node.js集成支付宝接口注意事项

    目录 签名 发送请求表单 验签 总结 签名 使用node.js自带的加密模块crypto和字符编码模块iconv-lite 根据支付宝接口文档参数格式得到签名之前的字符串beforeSignStr,然 ...

  4. AtCoder Grand Contest 009 E:Eternal Average

    题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...

  5. BZOJ3648:寝室管理

    浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...

  6. poj1742硬币——多重背包可行性

    题目:http://poj.org/problem?id=1742 贪心地想,1.如果一种面值已经可以被组成,则不再对它更新: 2.对于同一种面值的硬币,尽量用较少硬币(一个)更新,使后面可以用更多此 ...

  7. 用nexus搭建自己的maven私有仓库

    用nexus搭建自己的maven私有仓库  刚安装nexus时,nexus启动失败,启动不到1分钟,自动停止.后来查找到了原因: Java 6 Support EOLOracle's support ...

  8. The specified named connection is either not found in the configuration, not intended to be used

    今天用EF遇到一个问题, The specified named connection is either not found in the configuration, not intended t ...

  9. VIJOS:P1082丛林探险

    描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险.在出发之前,他搜集了 ...

  10. 七 vue学习 async/await

    1:  javaScript async/await: 调用async函数的时候,是异步的,函数后面的代码继续执行.! async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解 ...