`
qindongliang1922
  • 浏览: 2181061 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117401
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125817
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59813
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71227
社区版块
存档分类
最新评论

分布式助手Zookeeper(四)

阅读更多
Zookeeper是分布式环境下一个重要的组件,因为它能在分布式环境下,给我带来很多便利,大大简化了分布式编程的复杂性,本篇散仙将给出一个模拟例子,来演示下如何使用Zookeeper的API编程,来完成分布式环境下配置的同步。大家都知道在一个中大型的规模的集群中,配置文件通常是必不可少的的东西,很多时候,我都需要将在Master上配置好的配置文件,给分发到各个Slave上,以确保整体配置的一致性,在集群规模小的时候我们可能简单的使用远程拷贝或复制即可完成,但是,当集群规模越来越大的时候,我们发现这种方式不仅繁琐,而且容易出错,最要命的是,以后如果改动配置文件的很少一部分的东西,都得需要把所有的配置文件,给重新远程拷贝覆盖一次,那么,怎样才能避免这种牵一发而动全身的事情呢?


事实上,利用Zookeeper,就能够很容易的,高可靠的帮我们完成这件事,我们只需要把配置文件保存在Zookeeper的znode里,然后通过Watch来监听数据变化,进而帮我们实现同步。一个简单的工作图如下所示:



总结流程如下:
序号实现
1启动ZK集群
2客户端在ZK创建一个znode,并写入数据
3启动各个Server上的Watcher,无限休眠
4客户端更新znode里数据
5Watcher的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来编写分布式程序是非常简单可靠的。


  • 大小: 48.8 KB
4
1
分享到:
评论
2 楼 qindongliang1922 2013-12-10  
panpan_xin 写道
程序的注释写的很清楚
//防止在未连接Zookeeper服务器前,执行相关的CURD操作  
countDown.countDown();//连接初始化,完成,清空计数器  

但实际没有应用起来
要在读写前加入
conf.countDown.await();

这样才能确保链接上了Zookeeper


嗯,谢谢指正!
1 楼 panpan_xin 2013-12-10  
程序的注释写的很清楚
//防止在未连接Zookeeper服务器前,执行相关的CURD操作  
countDown.countDown();//连接初始化,完成,清空计数器  

但实际没有应用起来
要在读写前加入
conf.countDown.await();

这样才能确保链接上了Zookeeper

相关推荐

    zookeeper连接工具zktools

    在实际使用中,ZkTools不仅适用于开发和运维人员日常的Zookeeper管理,也是进行系统故障排查和性能优化的有力助手。通过压缩包中的ZkTools,用户可以快速上手,提升工作效率,更好地驾驭Zookeeper这个强大的分布式...

    zookeeper可视化工具

    **Zookeeper可视化工具详解** Apache ZooKeeper 是一个分布式...总之,Zookeeper可视化工具是管理和维护Zookeeper集群不可或缺的助手,通过它们,我们可以更高效、更安全地操作Zookeeper,实现分布式系统的稳定运行。

    zookeeper-3.4.9.zip

    《Zookeeper:分布式服务治理的重要角色》 Zookeeper,作为Apache的一个开源项目,是分布式应用程序协调服务...它不仅提供了丰富的功能,而且有着成熟的社区支持和广泛的应用实践,是构建大规模分布式应用的得力助手。

    zookeeper客户端.zip

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈...它的跨平台性和易用性使得在各种环境下都能灵活应用,是Zookeeper使用者的有力助手。

    zookeeper的myeclipse插件

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下...如果你经常处理ZooKeeper相关的工作,这款插件无疑是你不可或缺的得力助手。

    超级好用的zookeeper查看器

    而“Zookeeper查看器”则成为了开发者和运维人员进行故障排查、监控与管理Zookeeper的得力助手。 首先,我们需要理解Zookeeper的核心功能。在分布式系统中,Zookeeper提供了一种名为“ZNode”的数据结构,类似于...

    Ant编译后的zookeeper源码

    Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给...

    zookeeper eclipse plugin

    5. **代码助手**:提供ZooKeeper相关的代码提示和自动完成,加速编码过程。 6. **配置向导**:简化ZooKeeper连接设置,只需几步即可连接到本地或远程的ZooKeeper服务器。 7. **版本兼容性**:虽然描述中提到的是...

    zookeeper-web-master.zip

    总的来说,"zookeeper-web"是Zookeeper管理的得力助手,它通过Web界面极大地提升了Zookeeper的易用性,是分布式系统管理员的必备工具之一。掌握"zookeeper-web"的使用,不仅可以提升工作效率,也有助于更好地理解和...

    ZooInspector-for-zookeeper数据查看

    总结起来,ZooInspector是Zookeeper管理员的得力助手,通过其强大的图形界面,用户可以更直观、便捷地管理和监控Zookeeper的数据。了解并熟练使用ZooInspector,对于提升Zookeeper的管理和故障排查能力至关重要。

    zookeepers分布式

    总结来说,ZooKeeper作为分布式系统的协调者,通过提供强一致性、高可用性的服务,极大地简化了分布式环境下的复杂问题,成为大数据和云计算领域的得力助手。理解和掌握ZooKeeper,对于开发和运维分布式系统具有重要...

    zookeeper可视化JAVA工具ZooInspector

    在IT行业中,Zookeeper是Apache软件基金会的一个开源项目,常用于分布式协调服务,确保数据的一致性和高可用性。而ZooInspector则为这个复杂的分布式系统提供了友好的图形用户界面(GUI),极大地简化了开发者和管理...

    ZooInspector:一款ZooKeeper的可视化工具

    ZooKeeper是Apache软件基金会的一个项目,它提供了一个分布式协调服务,广泛应用于分布式系统中,如配置管理、命名服务、分布式同步、组服务等。ZooInspector作为ZooKeeper的可视化界面,极大地简化了用户与...

    开源监控管理zookeeper工具:exhibitor-1.6

    总的来说,Exhibitor是Zookeeper管理员的得力助手,通过它,你可以更高效地管理和维护Zookeeper集群,确保分布式系统的稳定运行。正确配置和使用Exhibitor对于提升Zookeeper的运维效率和系统可靠性具有重要意义。

    zookeeper查看器

    **Zookeeper查看器:ZooInspector详解** ...总结来说,ZooInspector作为Zookeeper的辅助工具,提供了一个图形化的接口,方便用户理解和管理Zookeeper集群,对于开发者和运维人员来说,它是不可或缺的调试和管理助手。

    zookeeper-3.4.6

    《Zookeeper 3.4.6:探索分布式一致性解决...它的设计思路、实现机制以及丰富的API,使其成为分布式系统中的得力助手。通过深入学习和使用,开发者可以有效地构建稳定、高效的分布式应用,应对复杂的分布式环境挑战。

    zookeeper可视化工具安装包

    总之,Zookeeper 可视化工具是管理和维护 Zookeeper 集群的强大助手,能够简化操作流程,提高运维效率,是 IT 专业人士不可或缺的工具之一。通过熟练掌握和使用这些工具,可以更好地管理和优化基于 Zookeeper 的...

    多线程入门,分布式锁,等相关资料

    总结来说,本资源包提供的"多线程入门资料"涵盖了多线程的基本概念、实现方式、线程同步与通信、并发问题及其解决方案,以及分布式锁的原理与实现,是学习Java多线程和分布式系统的好助手。通过深入学习和实践,...

    zookeeper之节点基本操作(一).zip

    在分布式系统领域,ZooKeeper 是一个至关重要的组件,它为分布式应用程序提供了高效且可靠...在实际项目中,ZooKeeper 被广泛应用于配置管理、命名服务、分布式锁、队列等多个场景,是构建高可用分布式系统的得力助手。

Global site tag (gtag.js) - Google Analytics