我就是个封面

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. bzoj3513

    给定n个长度分别为$a_i$的木棒,问随机选择3个木棒能够拼成三角形的概率. $a_i$和$n$都在$10^5$以内 对于每一个i,我们统计比i短的边有多少组合能组成长度<=i的 用1减去这个概 ...

  2. 休假回来 更博-MySQL以月为单位的客户综合情况表_20161008

    十一休假老家事比较多 未来得及更新 今起依旧更博- 生成一个以用户ID为单位,各月下单天次,各月买了几个产品,各月订单额 ,天次,,天次,,天次,NULL)) AS 9月天次 FROM ( SELEC ...

  3. Poj_1068 Parencodings

    S     (((( )( )() ) ) ) P-sequence     4 5 6666,表示第i个右括号的左边有几个左括号. W-sequence    1 1 1456,表示第i个右括号和以 ...

  4. VijosP1595:学校网络(有向图变强连通图)

    描述 一些学校的校园网连接在一个计算机网络上.学校之间存在软件支援协议.每个学校都有它应支援的学校名单(学校a支援学校b,并不表示学校b一定支援学校a).当某校获得一个新软件时,无论是直接得到的还是从 ...

  5. Behave + Selenium(Python)一:

    Behave 介绍:(来自T先生) 最近一个项目用了behave来做测试,因为之前没有接触过,所以写下最近的心得总结. 做自动化的人估计对selenium已经不是很陌生了,但是对于Behave工具,估 ...

  6. Ternary Calculation

    Ternary Calculation Time Limit : /2000ms (Java/Other) Memory Limit : /65536K (Java/Other) Total Subm ...

  7. js能否实现截图,截图之后的图片数据再下载到本地?

    https://www.zhihu.com/question/20763177 http://www.cnblogs.com/yanweidie/p/5203943.html

  8. swfupload原理总结

    1.引入js(js内动态添加上传的文件并提交表单) 2.后台处理(将图片保存) 3.调用另一个js修改前台图片的地址(改为新的图片地址)

  9. HTML5学习笔记(四)语义元素

    语义元素能够清楚的描述其意义给浏览器和开发者. 无语义 元素实例: <div> 和 <span> - 无需考虑内容. 语义元素实例: <form>, <tab ...

  10. CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目

    原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...