分布式助手Zookeeper(四) kissyoudyb 2013-12-05 17:41 阅读:33 评论:0  
 
分布式助手Zookeeper(三) kissyoudyb 2013-12-05 17:37 阅读:48 评论:0  
 
分布式助手Zookeeper(二) kissyoudyb 2013-12-05 17:25 阅读:31 评论:0  
 
分布式助手Zookeeper(一) kissyoudyb 2013-12-05 17:21 阅读:46 评论:0  
 
Zookeeper是分布式环境下一个重要的组件,因为它能在分布式环境下,给我带来很多便利,大大简化了分布式编程的复杂性,本篇散仙将给出一个模拟例子,来演示下如何使用Zookeeper的API编程,来完成分布式环境下配置的同步。大家都知道在一个中大型的规模的集群中,配置文件通常是必不可少的的东西,很多时候,我都需要将在Master上配置好的配置文件,给分发到各个Slave上,以确保整体配置的一致性,在集群规模小的时候我们可能简单的使用远程拷贝或复制即可完成,但是,当集群规模越来越大的时候,我们发现这种方式不仅繁琐,而且容易出错,最要命的是,以后如果改动配置文件的很少一部分的东西,都得需要把所有的配置文件,给重新远程拷贝覆盖一次,那么,怎样才能避免这种牵一发而动全身的事情呢? 
事实上,利用Zookeeper,就能够很容易的,高可靠的帮我们完成这件事,我们只需要把配置文件保存在Zookeeper的znode里,然后通过Watch来监听数据变化,进而帮我们实现同步。一个简单的工作图如下所示:

总结流程如下:

序号 实现 1 启动ZK集群 2 客户端在ZK创建一个znode,并写入数据 3 启动各个Server上的Watcher,无限休眠 4 客户端更新znode里数据 5 Watcher的read方法发现数据更新,下拉至本地,更新本地数据

代码如下:

package com.sanjiesanxian;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat; /***
* Zookeeper实现分布式配置同步
*
* @author 秦东亮
*
* ***/
public class SyscConfig implements Watcher{ //Zookeeper实例
private ZooKeeper zk;
private CountDownLatch countDown=new CountDownLatch(1);//同步工具
private static final int TIMIOUT=5000;//超时时间
private static final String PATH="/sanxian";
public SyscConfig(String hosts) { try{
zk=new ZooKeeper(hosts, TIMIOUT, new Watcher() { @Override
public void process(WatchedEvent event) { if(event.getState().SyncConnected==Event.KeeperState.SyncConnected){
//防止在未连接Zookeeper服务器前,执行相关的CURD操作
countDown.countDown();//连接初始化,完成,清空计数器
} }
}); }catch(Exception e){
e.printStackTrace();
}
} /***
* 写入或更新
* 数据
* @param path 写入路径
* @param value 写入的值
* **/
public void addOrUpdateData(String path,String data)throws Exception { Stat stat=zk.exists(path, false);
if(stat==null){
//没有就创建,并写入
zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("新建,并写入数据成功.. ");
}else{
//存在,就更新
zk.setData(path, data.getBytes(), -1);
System.out.println("更新成功!");
}
} /**
* 读取数据
* @param path 读取的路径
* @return 读取数据的内容
*
* **/
public String readData()throws Exception{ String s=new String(zk.getData(PATH, this, null)); return s;
} /**
* 关闭zookeeper连接
* 释放资源
*
* **/
public void close(){ try{ zk.close();
}catch(Exception e){
e.printStackTrace();
} } public static void main(String[] args)throws Exception { SyscConfig conf=new SyscConfig("10.2.143.5:2181"); conf.addOrUpdateData(PATH, "修真天劫,九死一生。");
conf.addOrUpdateData(PATH, "圣人之下,皆为蝼蚁,就算再大的蝼蚁,还是蝼蚁.");
conf.addOrUpdateData(PATH, "努力奋斗,实力才是王道! "); //System.out.println("监听器开始监听........");
// conf.readData();
// Thread.sleep(Long.MAX_VALUE);
//conf.readData();
conf.close(); } @Override
public void process(WatchedEvent event){
try{
if(event.getType()==Event.EventType.NodeDataChanged){
System.out.println("变化数据: "+readData());
}
}catch(Exception e){
e.printStackTrace();
} }
}

模拟客户端输出如下:

//客户端监听代码
SyscConfig conf=new SyscConfig("10.2.143.5:2181"); conf.addOrUpdateData(PATH, "修真天劫,九死一生。");
conf.addOrUpdateData(PATH, "圣人之下,皆为蝼蚁,就算再大的蝼蚁,还是蝼蚁.");
conf.addOrUpdateData(PATH, "努力奋斗,实力才是王道! "); //System.out.println("监听器开始监听........");
// conf.readData();
// Thread.sleep(Long.MAX_VALUE);
//conf.readData();
conf.close(); 更新成功!
更新成功!
更新成功!

模拟服务端输出如下:

public static void main(String[] args)throws Exception {
//服务端监听代码
SyscConfig conf=new SyscConfig("10.2.143.36:2181");
//conf.addOrUpdateData(PATH, "");
System.out.println("模拟服务监听器开始监听........");
conf.readData();
Thread.sleep(Long.MAX_VALUE);
conf.close(); }
模拟服务监听器开始监听........
数据更新了: 修真天劫,九死一生。
数据更新了: 圣人之下,皆为蝼蚁,就算再大的蝼蚁,还是蝼蚁.
数据更新了: 努力奋斗,实力才是王道!

至此,使用zookeeper来完成配置同步的服务就完成了,我们可以发现,使用zookeeper来编写分布式程序是非常简单可靠的。

 
 
标签: Zookeeper

zookeeper配置同步zookeeper编程的更多相关文章

  1. 【转】最新版zookeeper配置看这一篇就够了

    [From]https://blog.csdn.net/yydriver/article/details/81107954 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  2. Zookeeper 配置和原理探究

    一 Zookeeper是什么? 服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,那么这些信息如何推送到各个节点?并且保证信息的一致性和可靠性?我们知道分布式协调服务很难正确 ...

  3. 【Zookeeper系列】ZooKeeper安装配置(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...

  4. Mac OS Storm+Kafka+Zookeeper配置

    先补充一个前两天mac配置的文档. 首先确定由jdk scala环境 JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/Cu ...

  5. ZooKeeper系列4:ZooKeeper API简介及编程

    问题导读: 1.ZooKeeper API 共包含几个包? 2.如何使用ZooKeeper API 创建zookeeper应用程序? 1)ZooKeeper API 简介   ZooKeeper AP ...

  6. solrCloud+tomcat+zookeeper配置

    一.环境准备: Solr版本:4.7.0 下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/4.7.0 Tomcat版本:6.0.39 下载地 ...

  7. Java开发机器上的配置及zookeeper配置

    Java开发机器上的配置及zookeeper配置 /etc/profile 文件的后面加入下面的内容: # jdk, zookeeper, kafka, ant, maven export APACH ...

  8. Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群

    ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...

  9. zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析

    程序的发展,需要引入集中配置: 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境.分集群管理配 ...

随机推荐

  1. javascript 一些需要知道的东西

    这里我直接贴出代码,注释已经补全,欢迎指正: <script type="text/javascript"> /** 1,js中一切皆是对象,函数也是, 2,当定义变量 ...

  2. UVa 201 Squares

    题意: 给出这样一个图,求一共有多少个大小不同或位置不同的正方形. 分析: 这种题一看就有思路,最开始的想法就是枚举正方形的位置,需要二重循环,枚举边长一重循环,判断是否为正方形又需要一重循环,复杂度 ...

  3. [swustoj 1094] 中位数

    中位数(1094) 问题描述 中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本.种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分.对于有限的数集,可以通过把所有 ...

  4. Zepto picLazyLoad Plugin,图片懒加载的Zepto插件

    嗯,学着国外人起名字Zepto picLazyLoad Plugin确实看起来高大上,其实js代码没几句,而且我每次写js都捉襟见肘,泪奔--- 图片懒加载有很多js插件,非常著名的属jQuery的L ...

  5. FZU 2214 Knapsack dp (转化背包)

    就是一个背包裸题,由于物品的重量太大,开不了这么大的数组 所以转化一下,由于价值总和不大于5000,所以把价值看作重量,重量看作价值,那么就是同样的价值下,求一个最轻的重量 #include<c ...

  6. Zabbix探索:Proxy没有回传任何数据

    因为Zabbix使用Puppet搭建的,实际上是通过脚本安装的,为了偷懒,将脚本都写一块去了,后来发现Proxy的配置和Zabbix的配置不同,又偷懒一次,复制了一下,但是为了调整脚本使用的便捷性,将 ...

  7. 将UIWebView显示的内容转为图片和PDF

    今天开发MarkEditor时要用到将 UIWebView 中显示的内容转为图片,方便转发到各个社交网络(Twiiter,Facebook,Weibo),这样内容就不受长度限制,类似于长微博. 之前关 ...

  8. 为zend studio增加Extjs代码提示功能

    http://blog.163.com/liuhaijun_83/blog/static/61175622201223114216786/ 需要将其中的http://www.spket.com/upd ...

  9. 基于Ubuntu14.10的Hadoop+HBase环境搭建

    本篇博文中谈及的Hadoop和HBase都是单机版,简单了解. 首先在Ubuntu上搭建Hadoop开发环境,主要参考另外一篇博客,仔细照做并解决出现的问题即可. 地址:http://www.powe ...

  10. eclipse配置struts.xml自动提示

    a)window – preferences – xml - xml catalog –> add  b)选择key type为URI c)key: http://struts.apache.o ...