zookeeper配置同步zookeeper编程

分布式助手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

时间: 2024-10-27 07:43:46

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

zookeeper配置文件共享中心

最近频繁的系统上线,每次打包都要把配置文件替换为正式环境的配置文件,虽然说就是复制粘贴的事,架不住文件杂乱,而且多. 期初的想法是有没有办法将配置文件与系统隔离开来,这样在更新时候,就只需要更新代码部分,配置文件不用去管了.查了不少资料,没找到什么好的实现方式,别人比较好的发布框架都是自己写的,也用了,干脆自己研究研究能不能使用zk做一个配置文件的管理中心,顺带实现动态加载配置文件而不需要重启系统(正式环境这种情况使用的应该很少,不过本地倒是用起来顺手很多). 1,在虚拟机上安装zk(需先安装j

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

问题导读: 1.ZooKeeper API 共包含几个包? 2.如何使用ZooKeeper API 创建zookeeper应用程序? 1)ZooKeeper API 简介 ZooKeeper API 共包含 5 个包,分别为: org.apache.zookeeper , org.apache.zookeeper.data ,org.apache.zookeeper.server , org.apache.zookeeper.server.quorum 和org.apache.zookeeper

zookeeper配置kerberos认证的坑

zookeeper配置了kerberos之后,zkCli.sh 连接认证死活不通过 连接命令: zkCli.sh 报错如下: WatchedEvent state:SyncConnected type:None path:null 2017-08-21 10:11:42,054 [myid:] - ERROR [main-SendThread(localhost:2181):[email protected]] - An error: (java.security.PrivilegedActio

基于CentOS6.5的Dubbo及Zookeeper配置

基于CentOS的Dubbo及Zookeeper配置 需要提前准备好的资料: 1.首先配置java环境 步骤: 将jdk的包上传至centos服务器的/opt目录下,并且解压 tar -zxvf jdk-8u152-linux-x64.tar.gz 配置环境变量,修改/etc/profile 文件内容,文件的末尾添加如下内容: export JAVA_HOME=/opt/jdk-8u152 export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ export P

zookeeper系列之六—zookeeper之应用

http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3113923.html Zookeeper是hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的应用越来越多.今天我想谈谈zookeeper,本文不谈如何使用zookeeper,而是zookeeper到底有哪些实际的应用,那些类型的应用能发挥zookeeper的优势,最后谈谈zookeeper对分布式网站架构能产生怎样的作用.

Zookeeper - 什么是Zookeeper,以及zookeeper的安装(1)

Zookeeper 什么是Zookeeper? 官网传送门 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. 从设计模式来说基于观察者模式设计的分布式服务管理框架,存储大家都关心的数据,然后接受观察者的注册.一旦这些数据状态发生变化,zookeeper就将负责通知已经注册的观察者做出反应. Zoo

zookeeper和PHP zookeeper和kafka 扩展安装

http://blog.csdn.net/fenglailea/article/details/52458737#t3 目录(?)[-] 安装zookeeper 1直接安装zookeeper无须编译 2源码编译安装zookeeper 安装php zookeeper扩展 注意最新版kafka请使用73和4PASS 安装librdkafka 安装php-kafka扩展 配置扩展 查看是否安装完成 PHP-kafka扩展3和4安装完成后无法使用时 风来了.fox 安装zookeeper 推荐1.1 直

1 week110的zookeeper的安装 + zookeeper提供少量数据的存储

下面是在weekend110上的zookeeper的安装 在此之前,先进行快照备份. 在这里,为了后续的zookeeper配置需要,在/home/hadoop/下,新建data目录,再新建zookeeper-3.4.6目录,再新建zkdata目录. 默认情况下,事务日志和数据目录是存放在一起,我们这里,要将它们分开. dataDir=/home/hadoop/data/zookeeper-3.4.6/zkdata dataLogDir=/home/hadoop/data/zookeeper-3.

DNS2之bind安装、主从配置同步、子域创建、view配置

主DNS配置从服务器: 我们知道,DNS服务器在网络服务中可能出现故障当机等状况,会导致DNS服务瘫痪,显然在实际的网络应用中我们不希望出现这种状况,所有我们就要配置从服务器来在主DNS服务器出现故障时代替他来工作,然而作为价格昂贵的服务器本身你又不希望出现这种极大的浪费,所有从服务器在实际工作中是和主服务器共同分担DNS解析任务的,这样既解决了服务器故障导致的问题,还可以缓解DNS服务器的压力. 那么要配置一个从服务器我们又该怎么做呢? 前提:我们要为本地配置一个从服务器aolens2.从服务