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();
- }
- }
- }
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();
//客户端监听代码 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();
- }
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是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、...
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,它提供了一个分布式环境中的高可用性、高性能、有序访问的数据存储,可以让...
Raft是分布式环境下的一致性算法,它通过少数服从多数的选举来维持集群内数据的一致性。它与RBFT算法名称有点像,然而Raft算法里不能存在拜占庭节点,而RBFT则能容忍BFT节点的存在。Raft非常类似于paxos协议(参见我...
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件 prometheus监控zookeeper 在之前搭建好的环境上继续部署 ZooKeeper 提供了四字命令(The...
ZooKeeper本质上是一个分布式...原本是Apache Hadoop的一个组件,现在被拆分为一个Hadoop的独立子项目,在Hbase(Hadoop的另外一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也用到了ZooKeeper集群。
Zookeeper是一个高可用的分布式数据管理和协调框架,并且能够很好的保证分布式环境中数据的一致性。在越来越多的分布式系统(Hadoop、HBase、Kafka)中,Zookeeper都作为核心组件使用。 Zookeeper的应用场景主要有...
hadooop环境所用的的工具包,是大数据生态圈的组件;另外:Zookeeper是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务,环境所运用到
Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理...虽然Storm是无状态的,它通过Apache ZooKeeper管理分布式环境和集群状态。它很简单,您可以并行地对实时数据执行各种操作。”
ZooKeeper本质上是一个分布式...原本是Apache Hadoop的一个组件,现在被拆分为一个Hadoop的独立子项目,在Hbase(Hadoop的另外一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也用到了ZooKeeper集群。
各⼤数据组件介绍 ⼀、zookeeper ZooKeeper是⼀个的,开放源码的协调服务,是的Chubby⼀个的实现,是Hadoop和Hbase的重要组件。它是⼀个为分布式应⽤提供⼀致 性服务的软件,提供的功能包括:配置维护、域名服务、...
文章目录搭建简单的Hadoop完全分布式模式分析首先设置集群规划虚拟机准备设置静态ip与主机名,设置用户为超级用户配置java环境hadoop安装配置集群配置core-site.xmlHDFS 配置文件YARN 配置文件MapReduce 配置文件这...
文章目录一、认识Codis1、什么是codisCodis 基本框架由以下组件组成2、Codis重要性3、Codis 代理4、Codis 分片原理5、不同的 Codis 实例之间槽位关系如何同步?zookeeper6、扩容7、自动均衡8、Codis 的代价9、Codis ...
一种为弹性分布式系统提供环境配置的方法 - 一些简单的重用组件 - 有助于多线程和更复杂的网络测试 - 高性能多线程 API、接口和实现 命名和版本控制 通常,包含抽象定义(又名接口)的库以.api结尾。 它们采用dempsy...
10_分布式集群搭建:集群环境说明及基本配置 11_分布式集群搭建:集群安装配置 12_分布式集群搭建:安装配置部署Zookeeper 集群 13_分布式集群搭建:规划设计集群服务分布 14_分布式集群搭建:HADOOP分布式集群...
分布式应用程序协调服务:ZooKeeper 3.3.1 分布式服务框架:Dubbo 2.5.3 接口测试框架:Swagger2 2.6.1 工具类:Apache Commons、Jackson 2.2、fastjson 1.2.20 2、前端 JS框架:Jquery 表格插件:Bootstrap Table ...
1.ZooKeeper-分布式过程协同组件 2.Hadoop3-大数据基础组件3.Tez-Yarn底层计算引擎4.Hive3-大数据仓库5.Spark2实时大数据处理6.Oozie5-大数据流程引擎 课程特点: 1.最新API: Hadoop3/Spark2/Hive3/Oozie52.手工...
lock4j是一个分布式锁组件,其提供了多种不同的支持以满足不同性能和环境的需求。立志打造一个简单但富有内涵的分布式锁组件。简单易用,功能强大,扩展性强。支持redission,redisTemplate,zookeeper。可混用,支持...
ares5k-generator java-web代码生成器二进制地址GitHub: : 编码云: : ares5k-zookeeper-distribute-lock是基于curator实现的zookeeper分布式锁Aop注解组件GitHub: : 编码云: : ares5k延迟的承诺消息是兔子MQ...
33、尚硅谷-SpringBoot高级-分布式-SpringBoot、Dubbo、Zookeeper整合 34、尚硅谷-SpringBoot高级-分布式-SpringCloud-Eureka注册中心 35、尚硅谷-SpringBoot高级-分布式-服务注册 36、尚硅谷-SpringBoot高级-分布式...