Linux -- 基于zookeeper的java api(二)

写一个关于基于集群的zookeeper的自定义实现HA

基于客户端和监控器:使用监控的方法查看每个注册过的节点的状态来做出操作。

Watch:监控端

package com.huhu.zookeeper;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper; public class AUTIManager { // zk对象
static ZooKeeper zk;
// 线程类 用来组织程序运行
static CountDownLatch cdl = new CountDownLatch(1);
String connection = "hu-hadoop1:2181,hu-hadoop2:2181,hu-hadoop3:2181";
int TIMEOUT = 2000; // 监视器
Watcher connectionWatch = new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println("zk服務通知--------------------" + event.toString());
}
}; // 监视器
Watcher existsWath = new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
if (event.getType().toString().equals("None")) {
System.out.println("none");
} else if (event.getType().toString().equals("NodeCreated")) {
System.out.println(event.getPath() + "节点上线");
} else if (event.getType().toString().equals("NodeDeleted")) {
System.out.println(event.getPath() + "节点下线");
} else if (event.getType().toString().equals("NodeDataChanged")) {
System.out.println(event.getPath() + "节点数据已经被修改");
} else if (event.getType().toString().equals("NodeChildrenChanged")) {
System.out.println(event.getPath() + "节点的子节点数据已经被修改");
} else {
System.out.println(event.toString());
} // 重复注册 watch 事件是一次性消费
try {
zk.exists("/1708a1/node1", existsWath);
zk.exists("/1708a1/node2", existsWath);
zk.exists("/1708a1/node3", existsWath);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}; // 初始化
public void init() {
try {
zk = new ZooKeeper(connection, TIMEOUT, connectionWatch);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} // 将节点 /1708a1/node增加一个监听器
public void Lookexit() {
try {
zk.exists("/1708a1/node1", existsWath);
zk.exists("/1708a1/node2", existsWath);
zk.exists("/1708a1/node3", existsWath);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
AUTIManager m = new AUTIManager();
m.init();
m.Lookexit();
cdl.await(); }
}

client1:

package com.huhu.zookeeper;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat; public class Client1 { static CountDownLatch cdl = new CountDownLatch(1);
static String connection = "hu-hadoop1:2181,hu-hadoop2:2181,hu-hadoop3:2181";
static int TIMEOUT = 2000;
static ZooKeeper zk; static Watcher watcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println("接受到zk服務信息,会话连接完成");
System.out.println("zk为:" + zk);
try {
Stat s = zk.exists("/1708a1", true);
if (s == null) {
System.out.println("节点不存在,创建节点");
zk.create("/1708a1", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("/1708al/注册成并创建节点");
zk.create("/1708a1/node1", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("创建node1 OK!!");
} else {
zk.create("/1708a1/node1", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("創建node1 OK!!");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}; public static void main(String[] args) throws Exception {
System.out.println("客戶2");
zk = new ZooKeeper(connection, TIMEOUT, watcher);
System.out.println("zk对象:" + zk);
cdl.await();
}
}

client2:

package com.huhu.zookeeper;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat; public class Client2 { static CountDownLatch cdl = new CountDownLatch(1);
static String connection = "hu-hadoop1:2181,hu-hadoop2:2181,hu-hadoop3:2181";
static int TIMEOUT = 2000;
static ZooKeeper zk; static Watcher watcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println("接受到zk服務信息,会话连接完成");
System.out.println("zk为:" + zk);
try {
Stat s = zk.exists("/1708a1", true);
if (s == null) {
System.out.println("节点不存在,创建节点");
zk.create("/1708a1", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("/1708a1注册成并创建节点");
zk.create("/1708a1/node2", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("创建node2 OK!!");
} else {
zk.create("/1708a1/node2", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("創建node2 OK!!");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}; public static void main(String[] args) throws Exception {
System.out.println("客戶2");
zk = new ZooKeeper(connection, TIMEOUT, watcher);
System.out.println("zk对象:" + zk);
cdl.await();
}
}

client3:

package com.huhu.zookeeper;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat; public class Client3 { static CountDownLatch cdl = new CountDownLatch(1);
static String connection = "hu-hadoop1:2181,hu-hadoop2:2181,hu-hadoop3:2181";
static int TIMEOUT = 2000;
static ZooKeeper zk; static Watcher watcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println("接受到zk服務信息,会话连接完成");
System.out.println("zk为:" + zk);
try {
Stat s = zk.exists("/1708a1", true);
if (s == null) {
System.out.println("节点不存在,创建节点");
zk.create("/1708a1", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("/1708al/注册成并创建节点");
zk.create("/1708a1/node3", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("创建node3 OK!!");
} else {
zk.create("/1708a1/node3", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("創建node3 OK!!");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}; public static void main(String[] args) throws Exception {
System.out.println("客戶3");
zk = new ZooKeeper(connection, TIMEOUT, watcher);
System.out.println("zk对象:" + zk);
cdl.await();
}
}

启动监控端:

将集群中没有/1708a1

启动3个client:

然后分别让他们下线:(停掉服务)

效果很明显。

谈谈mysql和zookeeper:

我自己瞎扯扯淡。。。

mysql和zookeeper都是用来存在数据的,但是存储方式优点不同,那点是MySQL是用表来存储的,zookeeper是按照数的结构存储的,但是zookeeper解决了MySQL的一个从始至终都没有解决的方法。就是并发问题,这就是zookeeper的优势zookeeper使用搭建集群的方式来解决并发问题(这里说的有点绝对)。

MySQL中的主从机制,写只能写入主中,而zookeeper中不存在,你写哪里都可以,并且它实时的和主同步数据,使从和主之间的数据同步。

MySQL由于有并发问题,这里的并发主要表现在读和写之间的问题,从而引出了线程问题(原子性,可见性,有序性)(隔离级别),从而有了rabbitmq和solr,这些解决方案,减少数据库的读,让它可以更准确的写和读。而zookeeper则也可以当作一个监控者或者大黑板,降低业务间的耦合度,解决了并发问题

这里不一定是正确的,是我自己对它们之间的感觉

Linux -- 基于zookeeper的java api(二)的更多相关文章

  1. Linux -- 基于zookeeper的java api(一)

    Linux -- 基于zookeeper的java api 首先启动你所有的 zkService.sh 查看状态:检查是否启动正确 [root@hu-hadoop2 ~]# zkServer.sh s ...

  2. 【分布式】Zookeeper使用--Java API

    一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...

  3. zookeeper的java api操作

    zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...

  4. linux -- 基于zookeeper搭建yarn的HA高可用集群

    linux -- 基于zookeeper搭建yarn的HA高可用集群 实现方式:配置yarn-site.xml配置文件 <configuration> <property> & ...

  5. Zookeeper使用--Java API

    1  创建节点 创建节点有异步和同步两种方式.无论是异步或者同步,Zookeeper都不支持递归调用,即无法在父节点不存在的情况下创建一个子节点,如在/zk-ephemeral节点不存在的情况下创建/ ...

  6. 分布式服务管理zookeeper的java api

    zookeeper是一个分布式服务管理工具,本身具备高可用性,很多知名分布式系统入hadoop.Hbase等都采用zk管理. 常见的两个应用场景:1.服务的注册与发现 2.集群统一配置 下面看一下使用 ...

  7. zookeeper的JAVA API使用

    1.创建连接 2.创建节点 3.监听信息 Watcher.class 4.获取节点 Stat stat = new Stat(); zk.getData(Path,true,stat); 5.修改节点 ...

  8. zookeeper Java API 简单操作示例

    本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信. 首先搭建maven环境,并在pom文件中加入zookeeper引用包: <!-- https://mvnr ...

  9. Hbase多版本的读写(Shell&Java API版)

    Hbase是基于HDFS的NOsql数据库,它很多地方跟数据库差不多,也有很多不同的地方.这里就不一一列举了,不过Hbase有个版本控制的特性,这个特性在很多场景下都会发挥很大的作用.本篇就介绍下基于 ...

随机推荐

  1. 给 layui upload 带每个文件的进度条, .net 后台代码

    1.upload.js 扩展 功能利用ajax的xhr属性实现该功能修改过modules中的upload.js文件功能具体实现:在js文件中添加监听函数 //创建监听函数 var xhrOnProgr ...

  2. hiho #1196 : 高斯消元·二

    #1196 : 高斯消元·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其 ...

  3. python 传递多个参数

    def oper(a,*args): print(args) print(a) oper("q","s","d","z" ...

  4. scala函数式编程(一)

    scala函数编程特点: 1.Scala函数使用命名参数: 即函数参数传递的实参与函数名相对应,与函数位置不对应. object Test { def main(args: Array[String] ...

  5. Grunt、Gulp区别 webpack、 requirejs区别

    1. 书写方式 grunt 运用配置的思想来写打包脚本,一切皆配置,所以会出现比较多的配置项,诸如option,src,dest等等.而且不同的插件可能会有自己扩展字段,导致认知成本的提高,运用的时候 ...

  6. ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

    java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象. ArrayList list ...

  7. cmd中mvn命令,出现No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    在cmd里执行mvn命令,出错 查看mvn -v 发现mvn运行在jre上,更改高级设置.我的电脑-->属性-->高级系统设置-->环境变量 更改完之后,再次查看 mvn -v 搞定 ...

  8. HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK阅读笔记

    HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL  DEEP  CONVOLUTIONAL NEURAL NETWORK 论文地址:https:/ ...

  9. vue.js相关UI组件收集

    内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 ###UI组件 element ★9689 - 饿了么出品的Vue2的web UI工具套件 Vux ★6927 - 基于Vu ...

  10. Memcached遇到的问题及解决办法

    1. memcached make: *** No targets specified and no makefile found. Stop. 其实是因为在安装libevent时增加了版本号导致的, ...