Zookeeper - 开发篇(1)
2016-04-24 00:00
246 查看
本文用Java api开发一些基本的程序,从而搞清楚zk的一些基本用法。
zk客户端在连接 zk 服务器需要实例化一个org.apache.zookeeper.ZooKeeper对象,然后调用该类提供的接口与Zookeeper服务器进行交互。如果不指明,该类的所有方法均是线程安全的。一旦 zk客户端与服务器建立连接,客户端就会被分配一个会话ID(session ID),客户端会定期向服务器端发送心跳以保持该会话有效。只要客户端会话有效,应用程序可以调用zk客户端的接口与服务器端进行交互。
我们这里不用原生的Zookeeper开发包,而是用curator框架。Zookeeper原生的开发包语言繁琐,Curator开发简单高效。
首先,先来了解创建一个简单的Client类:
在这里我们创建了基类,里面依赖于一个ZK client(其实就是一个CuratorFramework )
在Cluster被启动后,会有如下线程被启动(除去java自带的main,finalizer,reference handler),熟悉zookeeper的人一看就明白:
![](http://static.oschina.net/uploads/img/201604/24114403_kO8y.jpg)
![](http://static.oschina.net/uploads/img/201604/24114403_J5sV.jpg)
Curator-Framework这个线程负责整体任务调度,
main-SendThread用于将命令发送到ZK服务器,
Curator-ConnectionStateManager用于连接状态改变时作出处理,
main-EventThread用于
zk客户端在连接 zk 服务器需要实例化一个org.apache.zookeeper.ZooKeeper对象,然后调用该类提供的接口与Zookeeper服务器进行交互。如果不指明,该类的所有方法均是线程安全的。一旦 zk客户端与服务器建立连接,客户端就会被分配一个会话ID(session ID),客户端会定期向服务器端发送心跳以保持该会话有效。只要客户端会话有效,应用程序可以调用zk客户端的接口与服务器端进行交互。
开发简单示例
创建Maven project,添加如下依赖:<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-test</artifactId> <version>2.9.1</version> </dependency>
我们这里不用原生的Zookeeper开发包,而是用curator框架。Zookeeper原生的开发包语言繁琐,Curator开发简单高效。
首先,先来了解创建一个简单的Client类:
public abstract class BaseClient implements Closeable{ //模拟Zookeeper集群 protected final static TestingCluster CLUSTER = new TestingCluster(3);; //连接串 protected final String SERVER = CLUSTER.getConnectString(); //测试Znode的namespace protected static final String PATH = "/test"; //保存究竟连接到了哪个ZK protected String Connected_Server = null; protected CuratorFramework client = null; //运用Curator的Timing类来处理时间 protected Timing timing = new Timing(); private static final Logger LOGGER = LoggerFactory.getLogger(BaseClient.class); /** * 构造器,在创建ZK client的同时就开始运行 */ public BaseClient(){ System.out.println(SERVER); //用默认Timing配置和测试集群创建client,重试策略为每隔一秒重试一次,一共三次 client = CuratorFrameworkFactory.newClient(SERVER,timing.session(),timing.connection(),new RetryNTimes(3,1000)); //一定要start,client才可以发送ZK命令 client.start(); try { //得到连接的ZK是集群中的哪一个 Connected_Server = CLUSTER.findConnectionInstance(client.getZookeeperClient().getZooKeeper()).getConnectString(); } catch (Exception e) { LOGGER.error("Error occurs! {}|{}", e.getMessage(), e.getCause()); } } /** * 优雅不处理异常地关闭zk client */ public void close(){ CloseableUtils.closeQuietly(client); } }
在这里我们创建了基类,里面依赖于一个ZK client(其实就是一个CuratorFramework )
在Cluster被启动后,会有如下线程被启动(除去java自带的main,finalizer,reference handler),熟悉zookeeper的人一看就明白:
![](http://static.oschina.net/uploads/img/201604/24114403_kO8y.jpg)
![](http://static.oschina.net/uploads/img/201604/24114403_J5sV.jpg)
Curator-Framework这个线程负责整体任务调度,
main-SendThread用于将命令发送到ZK服务器,
Curator-ConnectionStateManager用于连接状态改变时作出处理,
main-EventThread用于
1. Leader选举
Leader选举是我们常用的场景之一,为了保证集群一致性,集群一般选出一个leader负责工作调度以及负载均衡。这个leader需要满足在它因为网络异常或者自身原因挂掉时,集群需要自动选出另外一个Leader。并且在原leader回来时,能够自动加入集群,如果新的leader已经选出,则以follower的身份运行。如果还没选出,则参与竞选。相关文章推荐
- Zookeeper - 部署篇
- MyCat - 测试篇
- Java 7新特性总结 - Coin项目新语言特性
- MyCat - 背景篇(1)
- MyCat - 背景篇(2)
- fileUpload文件上传框架组件
- java线程中断处理
- C语言strtok()函数:字符串分割
- 利用Maven自动化部署到Tomcat
- 利用Maven进行多环境配置文件打包
- Linux安装JDK
- 漂泊者乐园插件B101#:BlMusic.dll 开发进行时
- 漂泊者乐园插件B102#:BlXAU.dll 开发进行时
- Java方法区和运行时常量池溢出问题分析
- spring+mybatis多数据源的配置
- MySQL查询优化
- 开始建立自己的应用模块
- 玩转迭代开发
- iOS 8和iOS 9新特性总结
- postgresql pg_trgm 对模糊查询的优化