zooinspector 使用zookeeper 查看谁是lead

让天下没有难学的技术
跟着实例学习ZooKeeper的用法: Leader选举
跟着实例学习ZooKeeper的用法: Leader选举
官方给出了使用zookeeper的几种。
Leader Election
Two-phased Commit
其它应用如Name Service, Configuration, Group Membership
在实际使用ZooKeeper开发中,我们最常用的是。 它由Netflix公司贡献给Apache,目前版本2.7.0。 相信你在使用ZK API开发时会遇到让人头疼的几个问题,ZK连接管理、SESSION失效等一些异常问题的处理,Curator替我们解决了这些问题,通过对ZK连接状态的监控来做出相应的重连等操作,并触发事件。 更好的地方是Curator对ZK的一些应用场景提供了非常好的实现,而且有很多扩充,这些都符合ZK使用规范。 它的主要组件为:
Recipes, ZooKeeper的系列recipe实现, 基于 Curator Framework.
Framework, 封装了大量ZooKeeper常用API操作,降低了使用难度, 基于Zookeeper增加了一些新特性,对ZooKeeper链接的管理,对链接丢失自动重新链接。
Utilities,一些ZooKeeper操作的工具类包括ZK的集群测试工具路径生成等非常有用,在Curator-Client包下org.apache.curator.utils。
Client,ZooKeeper的客户端API封装,替代官方 ZooKeeper class,解决了一些繁琐低级的处理,提供一些工具类。
Errors,异常处理, 连接异常等
Extensions,对curator-recipes的扩展实现,拆分为 curator-:stuck_out_tongue_closed_eyes:iscovery和 curator-:stuck_out_tongue_closed_eyes:iscovery-server提供基于RESTful的Recipes WEB服务.
Recipe 词典的意思是食谱,配方,美食菜谱,烹饪法, 延伸用法:某项计划或步骤来取得预先给定的结果。 在计算机领域没有合适的汉语对应,如果把ZooKeeper看成菜的话,recipe就相当于菜谱, 比如麻婆豆腐, 宫保鸡丁。
由于内容较多, 将会分成多篇文章进行介绍。
除了ZK 的”Two-phased Commit”的recipe外, Curator提供了全部的ZK的recipe, 而且分类更详细。 这篇文章将会以实例的方式介绍这些Recipe。 一旦你领会了这些Recipe,就可以在项目中很好的使用ZooKeeper的强大威力。
leader选举
在分布式计算中, leader election是很重要的一个功能, 这个选举过程是这样子的: 指派一个进程作为组织者,将任务分发给各节点。 在任务开始前, 哪个节点都不知道谁是leader或者coordinator. 当选举算法开始执行后, 每个节点最终会得到一个唯一的节点作为任务leader. 除此之外, 选举还经常会发生在leader意外宕机的情况下,新的leader要被选举出来。
Curator 有两种选举recipe, 你可以根据你的需求选择合适的。
Leader latch
首先我们看一个使用LeaderLatch类来选举的例子。 它的构造函数如下:
public LeaderLatch(CuratorFramework client, String latchPath)
public LeaderLatch(CuratorFramework client, String latchPath,
String id)
必须启动LeaderLatch: leaderLatch.start(); 一旦启动, LeaderLatch会和其它使用相同latch path的其它LeaderLatch交涉,然后随机的选择其中一个作为leader。 你可以随时查看一个给定的实例是否是leader:
public boolean hasLeadership()
类似JDK的CountDownLatch, LeaderLatch在请求成为leadership时有block方法:
public void await()
throws InterruptedException,
EOFException
Causes the current thread to wait until this instance acquires leadership
unless the thread is interrupted or closed.
public boolean await(long timeout,
TimeUnit unit)
throws InterruptedException
一旦不使用LeaderLatch了,必须调用close方法。 如果它是leader,会释放leadership, 其它的参与者将会选举一个leader。
异常处理 LeaderLatch实例可以增加ConnectionStateListener来监听网络连接问题。 当 SUSPENDED 或 LOST 时, leader不再认为自己还是leader.当LOST 连接重连后 RECONNECTED,LeaderLatch会删除先前的ZNode然后重新创建一个. LeaderLatch用户必须考虑导致leadershi丢失的连接问题。 强烈推荐你使用ConnectionStateListener。
下面看例子:
package com.colobu.zkrecipe.
import java.io.BufferedR
import java.io.IOE
import java.io.InputStreamR
import java.util.L
import java.util.concurrent.TimeU
import org.apache.curator.framework.CuratorF
import org.apache.curator.framework.CuratorFrameworkF
import org.apache.curator.framework.recipes.leader.LeaderL
import org.apache.curator.retry.ExponentialBackoffR
import org.apache.curator.test.TestingS
import org.apache.curator.utils.CloseableU
import mon.collect.L
public class LeaderLatchExample {
private static final int CLIENT_QTY = 10;
private static final String PATH = "/examples/leader";
public static void main(String[] args) throws Exception {
List&CuratorFramework& clients = Lists.newArrayList();
List&LeaderLatch& examples = Lists.newArrayList();
TestingServer server = new TestingServer();
for (int i = 0; i & CLIENT_QTY; ++i) {
CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000, 3));
clients.add(client);
LeaderLatch example = new LeaderLatch(client, PATH, "Client #" + i);
examples.add(example);
client.start();
example.start();
Thread.sleep(20000);
LeaderLatch currentLeader = null;
for (int i = 0; i & CLIENT_QTY; ++i) {
LeaderLatch example = examples.get(i);
if (example.hasLeadership())
currentLeader =
System.out.println("current leader is " + currentLeader.getId());
System.out.println("release the leader " + currentLeader.getId());
currentLeader.close();
examples.get(0).await(2, TimeUnit.SECONDS);
System.out.println("Client #0 maybe is elected as the leader or not although it want to be");
System.out.println("the new leader is " + examples.get(0).getLeader().getId());
System.out.println("Press enter/return to quit\n");
new BufferedReader(new InputStreamReader(System.in)).readLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("Shutting down...");
for (LeaderLatch exampleClient : examples) {
CloseableUtils.closeQuietly(exampleClient);
for (CuratorFramework client : clients) {
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
首先我们创建了10个LeaderLatch,启动后它们中的一个会被选举为leader。 因为选举会花费一些时间,start后并不能马上就得到leader。 通过hasLeadership查看自己是否是leader, 如果是的话返回true。 可以通过.getLeader().getId()可以得到当前的leader的ID。 只能通过close释放当前的领导权。 await是一个阻塞方法, 尝试获取leader地位,但是未必能上位。
Leader Election
Curator还提供了另外一种选举方法。 注意涉及以下四个类:
LeaderSelector
LeaderSelectorListener
LeaderSelectorListenerAdapter
CancelLeadershipException
重要的是LeaderSelector类,它的构造函数为:
public LeaderSelector(CuratorFramework client, String mutexPath,LeaderSelectorListener listener)
public LeaderSelector(CuratorFramework client, String mutexPath, ThreadFactory threadFactory, Executor executor, LeaderSelectorListener listener)
类似LeaderLatch,必须start: leaderSelector.start(); 一旦启动,当实例取得领导权时你的listener的takeLeadership()方法被调用. 而takeLeadership()方法只有领导权被释放时才返回。 当你不再使用LeaderSelector实例时,应该调用它的close方法。
异常处理 LeaderSelectorListener类继承ConnectionStateListener.LeaderSelector必须小心连接状态的 改变. 如果实例成为leader, 它应该相应SUSPENDED 或 LOST. 当 SUSPENDED 状态出现时, 实例必须假定在重新连接成功之前它可能不再是leader了。 如果LOST状态出现, 实例不再是leader, takeLeadership方法返回.
重要: 推荐处理方式是当收到SUSPENDED 或 LOST时抛出CancelLeadershipException异常. 这会导致LeaderSelector实例中断并取消执行takeLeadership方法的异常. 这非常重要, 你必须考虑扩展LeaderSelectorListenerAdapter. LeaderSelectorListenerAdapter提供了推荐的处理逻辑。
这个例子摘自。 首先创建一个ExampleClient类, 它继承LeaderSelectorListenerAdapter, 它实现了takeLeadership方法:
package com.colobu.zkrecipe.
import org.apache.curator.framework.CuratorF
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerA
import org.apache.curator.framework.recipes.leader.LeaderS
import java.io.C
import java.io.IOE
import java.util.concurrent.TimeU
import java.util.concurrent.atomic.AtomicI
public class ExampleClient extends LeaderSelectorListenerAdapter implements Closeable {
private final S
private final LeaderSelector leaderS
private final AtomicInteger leaderCount = new AtomicInteger();
public ExampleClient(CuratorFramework client, String path, String name) {
this.name =
leaderSelector = new LeaderSelector(client, path, this);
leaderSelector.autoRequeue();
public void start() throws IOException {
leaderSelector.start();
public void close() throws IOException {
leaderSelector.close();
public void takeLeadership(CuratorFramework client) throws Exception {
final int waitSeconds = (int) (5 * Math.random()) + 1;
System.out.println(name + " is now the leader. Waiting " + waitSeconds + " seconds...");
System.out.println(name + " has been leader " + leaderCount.getAndIncrement() + " time(s) before.");
Thread.sleep(TimeUnit.SECONDS.toMillis(waitSeconds));
} catch (InterruptedException e) {
System.err.println(name + " was interrupted.");
Thread.currentThread().interrupt();
} finally {
System.out.println(name + " relinquishing leadership.\n");
你可以在takeLeadership进行任务的分配等等,并且不要返回,如果你想要要此实例一直是leader的话可以加一个死循环。 leaderSelector.autoRequeue();保证在此实例释放领导权之后还可能获得领导权。 在这里我们使用AtomicInteger来记录此client获得领导权的次数, 它是”fair”, 每个client有平等的机会获得领导权。
package com.colobu.zkrecipe.
import java.io.BufferedR
import java.io.InputStreamR
import java.util.L
import org.apache.curator.framework.CuratorF
import org.apache.curator.framework.CuratorFrameworkF
import org.apache.curator.framework.recipes.leader.LeaderS
import org.apache.curator.retry.ExponentialBackoffR
import org.apache.curator.test.TestingS
import org.apache.curator.utils.CloseableU
import mon.collect.L
public class LeaderSelectorExample {
private static final int CLIENT_QTY = 10;
private static final String PATH = "/examples/leader";
public static void main(String[] args) throws Exception {
List&CuratorFramework& clients = Lists.newArrayList();
List&ExampleClient& examples = Lists.newArrayList();
TestingServer server = new TestingServer();
for (int i = 0; i & CLIENT_QTY; ++i) {
CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000, 3));
clients.add(client);
ExampleClient example = new ExampleClient(client, PATH, "Client #" + i);
examples.add(example);
client.start();
example.start();
System.out.println("Press enter/return to quit\n");
new BufferedReader(new InputStreamReader(System.in)).readLine();
} finally {
System.out.println("Shutting down...");
for (ExampleClient exampleClient : examples) {
CloseableUtils.closeQuietly(exampleClient);
for (CuratorFramework client : clients) {
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
与LeaderLatch, 通过LeaderSelectorListener可以对领导权进行控制, 在适当的时候释放领导权,这样每个节点都有可能获得领导权。 而LeaderLatch一根筋到死, 除非调用close方法,否则它不会释放领导权。
原创文章,转载请注明: 转载自本文链接地址:
Latest posts by colobu ()
Related posts:
(4 votes, average: 3.75 out of 5)
Loading...4960人阅读
hadoop(23)
公司很多产品会使用zookeeper,比如Meta消息中间件,在测试的过程中,我们经常需要查询zookeeper里面的信息来精确定位问题。目前项目中有开发团队自己写的浏览器node-zk-browser,是基于node.js的express.js框架和node-zookeeper客户端实现的,具体可参考.
但node-zk-browser对于不太熟悉node.js的同学部署起来会比较困难,因此跟大家分享一个使用起来非常简单的zk浏览器工具和Eclipse 插件. 该工具除了能展示树形结构外,也能展示每个path的属性和数据,而且如果数据是文本的也可以进行编辑.
1.zk浏览器客户端
&&&&&&&&&&&&&&&
&解压缩后点击ZooInspector\build\zookeeper-dev-ZooInspector.jar后会出现以下界面
&&&&点击左上角的绿色按钮,输入ZK Server的地址和端口&&
&&连接成功后就能看到ZK的节点数据信息.&
2.zk浏览器Eclipse插件
Step 1.&在 Eclipse& 菜单打开Help -& Install New Software...
Step 2.&添加 url&&.
Step 3. 选择插件并安装
Step 1.&在 Eclipse& 菜单打开Window-&Show View-&Other...-&ZooKeeper 3.2.2
Step 2.&连接ZK
输入正在运行的ZK server 地址和端口
连接成功后就就可以在Eclipse里查看ZK Server里的节点信息.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:460367次
积分:3784
积分:3784
排名:第5800名
原创:40篇
转载:232篇
评论:27条
(3)(16)(2)(3)(1)(3)(1)(5)(5)(1)(3)(2)(2)(1)(4)(4)(5)(4)(4)(8)(13)(2)(13)(8)(14)(5)(5)(5)(3)(10)(15)(17)(6)(5)(5)(10)(9)(5)(3)(2)(7)(6)(2)(7)(13)(3)(3)(4)(1)(6)(6)zookeeper - Running ZooInspector on Ubuntu 14.04 - Stack Overflow
to customize your list.
Announcing Stack Overflow Documentation
We started with Q&A. Technical documentation is next, and we need your help.
Whether you're a beginner or an experienced developer, you can contribute.
Freshly installed package of zookeeper also provides zooinspector program to view and edit nodes. Upon execution the latter silently crashes.
Edit /usr/bin/zooinspector shell script to include the following jars:
CLASSPATH=/usr/share/java/slf4j-simple.jar:/usr/share/java/log4j-1.2.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/zookeeper.jar:/usr/share/zookeeper/zooinspector/zookeeper-ZooInspector.jar
Remove comments from /usr/share/zookeeper/zooinspector/config/defaultNodeVeiwers.cfg
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled1078人阅读
NoSQL/云/大数据/hadoop(6)
zookeeper信息查看工具
下载地址:
解压,打开:
ZooInspector\build\zookeeper-dev-ZooInspector.jar
转载请标明出处:
本文出自:【】
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:88906次
积分:2112
积分:2112
排名:第12912名
原创:153篇
评论:16条
(2)(2)(3)(4)(6)(12)(9)(10)(23)(21)(7)(4)(55)(4)(1)如何使用zookeeper_百度知道
如何使用zookeeper
如何使用Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将会详细介绍 Zookeeper 能够解决的一些典型问题,这里先介绍一下,Zookeeper 的操作接口和简单使用示例。 常用接口列表客户端要连接 Zookeeper 服务器可以通过创建 org.apache.zookeeper. ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互。前面说了 ZooKeeper 主要是用来维护和监控一个目录节点树中存储的数据的状态,所有我们能够操作 ZooKeeper 的也和操作目录节点树大体一样,如创建一个目录节点,给某个目录节点设置数据,获取某个目录节点的所有子目录节点,给某个目录节点设置权限和监控这个目录节点的状态变化。
其他类似问题
为您推荐:
您可能关注的推广
zookeeper的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 zooinspector 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信