`
QING____
  • 浏览: 2253466 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Zookeeper开发小结

 
阅读更多

一.实例化zookeeper与自动重连代码样例

public class ZkClient {

    private ZooKeeper zooKeeper;

    private String connectString;
    private Integer sessionTimeout;

    private Object waiter = new Object();//simple object-lock
    //"zk-client.properties";//classpath下
    public ZkClient(String configLocation) throws  Exception{
        Properties config = new Properties();
        config.load(ClassLoader.getSystemResourceAsStream(configLocation));
        connectString = config.getProperty("zk.connectString");
        if(connectString == null){
            throw new NullPointerException("'zk.connectString' cant be empty.. ");
        }
        sessionTimeout = Integer.parseInt(config.getProperty("zk.sessionTimeout","-1"));
        connectZK();
    }

    /**
     * core method,启动zk服务 本实例基于自动重连策略,如果zk连接没有建立成功或者在运行时断开,将会自动重连.
     */
    private void connectZK() {
        synchronized (waiter) {
            try {
                SessionWatcher watcher = new SessionWatcher();
                // session的构建是异步的
                this.zooKeeper = new ZooKeeper(connectString, sessionTimeout, watcher, false);
            } catch (Exception e) {
                e.printStackTrace();
            }
            waiter.notifyAll();
        }
    }


    class SessionWatcher implements Watcher {

        public void process(WatchedEvent event) {
            // 如果是“数据变更”事件
            if (event.getType() != Event.EventType.None) {
                return;
            }

            // 如果是链接状态迁移
            // 参见keeperState
            synchronized (waiter) {
                switch (event.getState()) {
                    // zk连接建立成功,或者重连成功
                    case SyncConnected:
                        System.out.println("Connected...");
                        waiter.notifyAll();
                        break;
                    // session过期,这是个非常严重的问题,有可能client端出现了问题,也有可能zk环境故障
                    // 此处仅仅是重新实例化zk client
                    case Expired:
                        System.out.println("Expired...");
                        // 重连
                        connectZK();
                        break;
                    // session过期
                    case Disconnected:
                        // 链接断开,或session迁移
                        System.out.println("Connecting....");
                        break;
                    case AuthFailed:
                        close();
                        throw new RuntimeException("ZK Connection auth failed...");
                    default:
                        break;
                }
            }
        }
    }

    private void close(){
        try {
            synchronized (waiter) {
                if (this.zooKeeper != null) {
                    zooKeeper.close();
                }
                waiter.notifyAll();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

二.授权与验证

String auth = "admin:admin";
//anywhere,but before znode operation
//can addauth more than once
zooKeeper.addAuthInfo("digest", auth.getBytes("UTF-8"));

 

Id id = new Id("digest", DigestAuthenticationProvider.generateDigest(auth));
ACL acl = new ACL(ZooDefs.Perms.ALL, id);
List<ACL> acls = Collections.singletonList(acl);
//如果不需要访问控制,可以使用acls = ZooDefs.Ids.OPEN_ACL_UNSAFE
zooKeeper.create("/singleWorker", null, acls, CreateMode.PERSISTENT);

三.创建znode节点

try{
	Id id = new Id("digest", DigestAuthenticationProvider.generateDigest(auth));
	ACL acl = new ACL(ZooDefs.Perms.ALL, id);
	List<ACL> acls = Collections.singletonList(acl);
	zooKeeper.create("/workers", null, acls, CreateMode.PERSISTENT);
}catch(KeeperException.NodeExistsException e){
	//在并发环境中,节点创建有可能已经被创建,即使使用exist方法检测也不能确保.
} catch (Exception e){
	e.printStackTrace();
}

四.删除节点

//zookeeper不允许直接删除含有子节点的节点;
//如果你需要删除当前节点以及其所有子节点,需要递归来做
private void deletePath(String path,ZooKeeper zooKeeper) throws Exception{
	List<String> children = zooKeeper.getChildren(path,false);
	for(String child : children){
		String childPath = path + "/" + child;
		deletePath(childPath,zooKeeper);
	}
	try{
	 zooKeeper.delete(path,-1);
	}catch(KeeperException.NoNodeException e){
		//ignore
	}
}
//删除节点,删除时比较version,避免删除时被其他client修改
public boolean delete(String path){
	try{
		Stat stat = zooKeeper.exists(path,false);
		//如果节点已经存在
		if(stat != null){
			zooKeeper.delete(path,stat.getVersion());
		}
	}catch(KeeperException.NoNodeException e){
		//igore
	}catch (Exception e){
		e.printStackTrace();
                return false;
	}
	return true;
}

五.修改数据

public boolean update(String path,byte[] data){
	  try{
		  Stat stat = zooKeeper.exists(path,false);
		  //如果节点已经存在
		  if(stat != null){
			  zooKeeper.setData(path,data,stat.getVersion());
			  return true;
		  }
	  }catch (KeeperException.NoNodeException e){
		   //ignore
	  }catch (Exception e){
		  e.printStackTrace();
	  }
	return false;
}

五.事务

public boolean create(String name){
	try{
		Transaction tx = zooKeeper.transaction();
		tx.create("/workers/servers/" + name,null, ZooDefs.Ids.OPEN_ACL_UNSAFE,null);
		tx.create("/workers/schedule/" + name,null, ZooDefs.Ids.OPEN_ACL_UNSAFE,null);
		tx.commit();
		return true;
	} catch (Exception e){
		e.printStackTrace();
	}
	return false;
}

    备注:zookeeper中的watcher机制非常好,但是重要的数据变更,不能完全依赖watcher通知,因为对于zkClient而言,网络异常都将会导致watcher有丢失的潜在风险,而且watcher是"即发即失",当你接收到watcher通知之后,在处理过程中,数据仍然有变更的可能,因此在时间线上,不可能做到完全准确.       

 

分享到:
评论

相关推荐

    Zookeeper中文开发指南

    **Zookeeper中文开发指南** ...总结来说,“Zookeeper中文开发指南”是一本全面介绍Zookeeper的参考资料,它将帮助开发者深入理解Zookeeper的原理、使用方法和最佳实践,对于构建和管理分布式系统具有很高的参考价值。

    zookeeper安装及开发笔记

    ZooKeeper是一个重要的分布式应用程序协调服务,源自Apache项目,它为分布式系统提供了高可用和一致性的解决方案。...因此,理解和掌握ZooKeeper的安装和配置对于从事分布式系统开发的工程师来说至关重要。

    zookeeper使用总结

    ### Zookeeper 使用总结 #### ZOOKEEPER 概述 - **Zookeeper 介绍** Zookeeper 是一个分布式协调服务框架,旨在简化分布式应用程序的开发。它提供了一个高性能的协同工作系统,使得开发者能够专注于应用程序的...

    ZooKeeper3.4.9 windos和linux

    ZooKeeper,一个由Apache基金会开发的分布式协调服务,是许多大型分布式系统中的关键组件。3.4.9版本是ZooKeeper的一个稳定版本,提供了一系列增强功能和性能优化。在本文中,我们将深入探讨如何在Windows和Linux...

    【Zookeeper管理工具】

    总结来说,Zookeeper管理工具是管理和维护Zookeeper集群的重要辅助工具,它简化了操作流程,提高了运维效率。通过源码学习,开发者可以更深入地理解Zookeeper的工作原理,从而更好地应用到实际的分布式系统中。

    zookeeper限制ip版

    总结,本文详细介绍了如何在Zookeeper 3.4.14版本中实现IP黑白名单功能,从需求分析到源码改造,再到功能测试,覆盖了整个开发流程,旨在帮助读者理解和实践Zookeeper的安全管理。通过这样的定制化改造,我们可以更...

    linux中zookeeper安装包zookeeper-3.4.8.tar

    在IT领域,Zookeeper是一个非常重要的分布式协调服务,由Apache Hadoop项目开发并维护。它在大规模分布式系统中被广泛用于数据管理、配置共享、命名服务、群组服务以及分布式同步。Zookeeper-3.4.8是其一个稳定版本...

    zookeeper-3.4.14.zip

    Zookeeper是Apache软件基金会开发的一个分布式协调服务,常被用作大数据生态系统中的关键组件,如在Kafka中扮演着至关重要的角色。标题“zookeeper-3.4.14.zip”暗示了我们正在探讨的是Zookeeper的一个具体版本,即...

    zookeeper-3.4.6.tar

    总结来说,Zookeeper 3.4.6是分布式环境中的重要基石,它的强大功能和易用性使其成为许多大型分布式系统的首选协调服务。深入理解和掌握Zookeeper的原理和使用,对于提升分布式应用的稳定性和效率具有重大意义。

    apache-zookeeper-3.5.6-bin.tar

    总结来说,Apache ZooKeeper 是一个强大的分布式协调工具,通过 `apache-zookeeper-3.5.6-bin.tar` 压缩包,我们可以获取到部署和运行 ZooKeeper 3.5.6 版本所需的所有文件。理解其核心概念、部署步骤以及在分布式...

    zookeeper客户端 图形化界面

    总结,Zookeeper客户端图形化界面为Zookeeper的管理和维护提供了便利,通过直观的图形展示和便捷的操作,使得Zookeeper的管理变得更加高效和人性化。无论是开发人员还是运维人员,都能从中受益,提升工作效率。在...

    大数据之Zookeeper视频

    ### 大数据之Zookeeper知识点详解 ...无论是对于开发人员还是运维人员来说,掌握Zookeeper都是非常有价值的。希望通过对上述知识点的了解,能够帮助大家更深入地理解Zookeeper的核心概念及其应用场景。

    zookeeper-windows-3.4.6

    总结,Zookeeper在Windows 3.4.6版本下为Dubbo开发提供了强大的支持,它的易用性和稳定性使得开发者能更专注于业务逻辑,而不是底层的协调问题。然而,深入了解Zookeeper的工作原理和配置细节,对于优化分布式系统...

    dubbo2.6.0 + Zookeeper3.4.9 + Zookeeper3.8.0 + Zookeeper3.7.1

    总结来说,Dubbo 2.6.0和不同版本的Zookeeper的组合为开发者提供了强大的工具来构建分布式系统。Dubbo的优秀服务治理功能和Zookeeper的协调能力共同确保了系统的高效运行和故障恢复。在使用过程中,根据项目需求和...

    zookeeper 单机集群配置

    总结一下,ZooKeeper单机集群配置主要包括下载与解压、环境变量配置、ZooKeeper配置文件修改、初始化数据目录、启动ZooKeeper服务以及测试服务。在Java Dubbo项目中,ZooKeeper发挥着关键的协调作用,使得服务之间的...

    Zookeeper-3.4.10和Zookeeper-3.5.7.zip

    Zookeeper是Apache软件基金会开发的一个分布式协调服务,它在分布式系统中扮演着至关重要的角色。Zookeeper提供了一种中心化的服务,用于命名、配置管理、分布式同步和组服务。这两个版本,Zookeeper-3.4.10和...

    zookeeper-3.4.12--.rar

    《Zookeeper 3.4.12:分布式协调服务的核心解析》 Apache ZooKeeper 是一个开源的分布式协调服务,它为分布式应用提供了一个简单而...通过深入学习和实践,我们可以更好地利用 ZooKeeper 解决实际开发中的诸多挑战。

    zookeeper eclipse版本

    这对于深入理解和使用Zookeeper,以及基于Zookeeper开发分布式应用都是非常有益的。通过这种方式,开发者可以更高效地参与到Zookeeper的开发和维护工作中,提升自身在分布式系统领域的专业技能。

    zookeeper可视化管理工具

    总结来说,Zookeeper 可视化管理工具是提升运维效率的关键工具,它们使我们能够更加便捷地管理 Zookeeper 集群,降低运维难度,提高系统的稳定性和可靠性。在实际应用中,选择合适的工具并充分利用其功能,将极大...

Global site tag (gtag.js) - Google Analytics