设为首页 收藏本站
查看: 1306|回复: 0

[经验分享] zookeeper配置同步zookeeper编程

[复制链接]

尚未签到

发表于 2015-9-6 13:34:53 | 显示全部楼层 |阅读模式
分布式助手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来监听数据变化,进而帮我们实现同步。一个简单的工作图如下所示:
DSC0000.jpg
总结流程如下:
序号实现1启动ZK集群2客户端在ZK创建一个znode,并写入数据3启动各个Server上的Watcher,无限休眠4客户端更新znode里数据5Watcher的read方法发现数据更新,下拉至本地,更新本地数据

代码如下:





DSC0001.gif
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-110178-1-1.html 上篇帖子: ZooKeeper 配置参数说明 下篇帖子: (转)Zookeeper 初体验之——伪分布式安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表