Zookeeepr实现分布式集群监控

Zookeeper中节点有两种:临时节点和永久节点

从类型上看节点又可以分为四种节点类型:PERSIST,PERSIST_SEQUENTIAL,EPHEMERAL,EPHEMERAL_SEQUENTIAL

临时节点有一个特点:当创建临时节点的程序停掉之后,这个临时节点就会消失。

监视器的特点:可以给zk中的节点注册监视器,见识这个节点的变化情况。

监视器注册一次,只能使用一次,多次使用就要多次注册。

我们利用这个Zookeeper的临时节点特性+监视器(Watch)来实现分布式集群监控

我们在/monitor(永久节点)下创建临时节点。

实际上,zookeeper的sdk不是特别好用,很多边界情况需要用户自己处理。curator是对Zookeeper的sdk进行了封装,所以说使用curator操作Zookeeper更加方便

在maven官网找到curator的依赖

<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework,支持zookeeper3.4.6-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.10.</version>
</dependency>

我们通过curator来使用zookeeper,那么我们就必须知道如何使用curator来连上zookeeper,下面代码是官方文档所给出

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3)CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy);
client.start();

开始我们的代码

TestCurator.java ,实现功能:创建Zookeeper临时节点

 package zkdemo;

 import java.net.InetAddress;

 import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test; public class TestCurator { @Test
public void test1() throws Exception{
//1000:表示curator链接zk的时候超时时间是多少 3:表示链接zk的最大重试次数
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
String connectString = "djt1:2181,djt2:2181,djt3:2181,djt4:2181,djt5:2181";
int sessionTimeoutMs = 5000;//这个值只能在4000-40000ms之间表示链接断开后多长时间临时节点会小时
int connectionTimeoutMs = 3000;//获取链接的超时时间
//创建一个zk连接
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, sessionTimeoutMs
,connectionTimeoutMs,retryPolicy); client.start(); InetAddress localHost = InetAddress.getLocalHost();
String ip = localHost.getHostAddress(); client.create().creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)//指定节点类型
.withACL(Ids.OPEN_ACL_UNSAFE)//指定设置节点权限信息
.forPath("/monitor/"+ip);//指定节点名称 while(true)
{
;
}
}
}

ZkNodeWatcher.java 实现功能:注册watcher,监视节点的变化

 package zk;

 import java.util.List;
import java.util.ArrayList; import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher; public class ZkNodeWatcher implements Watcher{
CuratorFramework client;
List<String> childrenList = new ArrayList<String>();
List<String> newChildrenList = new ArrayList<String>(); public ZkNodeWatcher(){
//1000:表示curator链接zk的时候超时时间是多少 3:表示链接zk的最大重试次数
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
String connectString = "djt1:2181,djt2:2181,djt3:2181,djt4:2181,djt5:2181";
int sessionTimeoutMs = 5000;//这个值只能在4000-40000ms之间表示链接断开后多长时间临时节点会消失
int connectionTimeoutMs = 3000;//获取链接的超时时间
//创建一个zk连接
client = CuratorFrameworkFactory.newClient(connectString, sessionTimeoutMs
,connectionTimeoutMs,retryPolicy);
client.start(); //监视monitor节点,获取下面的所有子节点的变化情况
try {
childrenList = client.getChildren().usingWatcher(this).forPath("/monitor");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 实现一个zk监视器,监视某个节点的变化情况
*
* 这个监视程序需要一直运行
* @CPH
*/ public void process(WatchedEvent event) {
System.out.println("我被调用了");
try {
newChildrenList = client.getChildren().usingWatcher(this).forPath("/monitor");
for(String ip : childrenList)
{
if(!newChildrenList.contains(ip)){
System.out.println("节点消失了"+ip);
//TODO 给管理员发送短信什么的 }
} for(String ip : newChildrenList){
if(!childrenList.contains(ip)){
System.out.println("节点新增"+ip);
}
}
//重要
childrenList = newChildrenList;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public void start(){
while (true){;}
} public static void main(String[] args) {
ZkNodeWatcher watcher = new ZkNodeWatcher();
watcher.start();
}
}

我们先开启Zookeeper集群,启动/bin/zkCli.sh,然后启动这2个集群,我们可以看到由对应的ip目录,这个ip不是虚拟机的ip,而是本地的ip,同时我们console下看到

然后暂停TestCurator.java,不一会儿,就会看到

这样,通过Zookeeper实现分布式集群监控的功能就完成了!

Zookeeper实现分布式集群监控的更多相关文章

  1. (转)ZooKeeper伪分布式集群安装及使用

    转自:http://blog.fens.me/hadoop-zookeeper-intro/ 前言 ZooKeeper是Hadoop家族的一款高性能的分布式协作的产品.在单机中,系统协作大都是进程级的 ...

  2. ZooKeeper伪分布式集群安装及使用

    ZooKeeper伪分布式集群安装及使用 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越 ...

  3. ZooKeeper 完全分布式集群环境搭建

    1. 搭建前准备 示例共三台主机,主机IP映射信息如下: 192.168.32.101 s1 192.168.32.102 s2 192.168.32.103 s3 2.下载ZooKeeper, 以  ...

  4. 搭建zookeeper伪分布式集群

    伪分布式集群的意思就是在同一台机子上部署多个zookeeoer,但是他们的端口不一样. 1.安装zookeeper 到/usr/local 2.cd /usr/local/zookeeper 3.cd ...

  5. 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...

  6. zookeeper伪分布式集群搭建

    zookeeper集群搭建注意点:         配置数据文件myid1/2/3对应server.1/2/3         通过zkCli.sh -server [ip]:[port]检测集群是否 ...

  7. zookeeper伪分布式集群环境搭建

    step1.下载 下载地址:http://zookeeper.apache.org/releases.html 将下载的压缩包放到用户家目录下(其他目录也可以) step2.解压 $tar –zxvf ...

  8. zookeeper伪分布式集群安装

    1.安装3个zookeeper 1.1创建集群安装的目录 1.2配置一个完整的服务 这里不做详细说明,参考我之前写的 zookeeper单节点安装 进行配置即可,此处直接复制之前单节点到集群目录 创建 ...

  9. [zookeeper] Zookeeper伪分布式集群配置

    参考配置:http://blog.csdn.net/clementad/article/details/48057059 注意要点: 启动时注意分别启动 bin/zkServer.sh start c ...

随机推荐

  1. 《TCP/IP详解 卷1:协议》第3章 IP:网际协议

    3.1 引言 IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输(见图1-4).许多刚开始接触TCP/IP的人对IP提供不可靠.无连接的数据报 ...

  2. golang 协程嵌套,会产生依赖关系(父子关系)么?

    编码时冒出一个问题:在一个协程内部,再创建一个或多个协程,是否会产生依赖关系? 做了一个小实验,这里随笔记录一下经过,备注后续深入研究. test代码: package main import ( & ...

  3. 深入理解@RequestBody注解

    我写文章历来追求通俗易懂,今天来深入探讨一下@RequestBody注解.提起这个,所有做过mvc开发的同学应该都不陌生,使用上面肯定也是信手拈来. 所以我这里就简单的提一下这个注解的使用: 1.当客 ...

  4. jquery.validate验证,jquery.Form插件提交,主要可以异步提交文件

    <script type="text/javascript"> $(function () { $form = $("#manuForm"); $b ...

  5. linux (rm指令) 及误删除解决

    今天在群里看见这一幕: 看到这儿,我们学习一下 这个RM指令 rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件 ...

  6. PyYAML学习第一篇

    1. YAML是一种交互式和可读性强的脚本语言.脚本语言都是解释性语言. PyYAML是YAML语言的编辑器和解释器.在python语言里面有PyYAML的安装包. 相关学习文档:http://pyy ...

  7. 基于Redis+Kafka的首页曝光过滤方案

    本文来自网易云社区 作者:李勇 背景 网易美学首页除了banner和四个固定位,大部分都是通过算法推荐获取的内容,其中的内容包括心得.合辑.视频及问答等.现在需要实现的是当推荐内容在用户屏幕曝光后(即 ...

  8. 『Python Kivy』API说明:kivy.app.App

    App类是创建Kivy应用的基础.我们可以将其看成是Kivy运行循环当中的主入口.在绝大多数的例子中,你创建这个类的子类,然后构建你自己的应用.当你已经准备好开始应用的整个生命周期时,你可以实例化你定 ...

  9. CentOS 7.2-编译安装zabbix 3.4

    起因: 前面已经使用yum安装了zabbix 3.4了,准备去交差了,交差时老大明确要求必须使用编译安装,统一放在/usr/local目录下.... 重来吧!! 一.环境说明 本次安装使用CentOS ...

  10. js写的数码时钟,在“最小化”浏览器 或者 “切换网页”是动画效果好像不对

    一.问题 在“最小化”浏览器 或者 “切换网页”是动画效果不对,不知道哪里出了问题???是不是”最小化“时网页定时器关掉了,还是其他什么原因啊 ???? 二.HTML代码如下 <div id=& ...