如何关闭zoonetkepperr服务

ZooKeeper的运行 -
- ITeye技术网站
博客分类:
1)单机模式
用户可以通过下面的命令来启动 ZooKeeper 服务:
zkServer.sh start
这个命令默认情况下执行 ZooKeeper 的 conf 文件夹下的 zoo.cfg 配置文件。当运行成功用户会看到类似如下的提示界面:
root@ubuntu:~# zkServer.sh start
JMX enabled by default
Using config: /root/hadoop-0.20.2/zookeeper-3.3.1/bin/../conf/zoo.cfg
Starting zookeeper ...
10:04:42,300 - WARN
[main:QuorumPeerMain@105] - Either no config or no quorum defined in config, running
in standalone mode
10:04:42,419 - INFO
[main:ZooKeeperServer@660] - tickTime set to 2000
10:04:42,419 - INFO
[main:ZooKeeperServer@669] - minSessionTimeout set to -1
10:04:42,419 - INFO
[main:ZooKeeperServer@678] - maxSessionTimeout set to -1
10:04:42,560 - INFO
[main:NIOServerCnxn$Factory@143] - binding to port 0.0.0.0/0.0.0.0:2181
10:04:42,806 - INFO
[main:FileSnap@82] - Reading snapshot /root/hadoop-0.20.2/zookeeper-3.3.1/data/version-2/snapshot.
10:04:42,927 - INFO
[main:FileSnap@82] - Reading snapshot /root/hadoop-0.20.2/zookeeper-3.3.1/data/version-2/snapshot.
10:04:42,950 - INFO
[main:FileTxnSnapLog@208] - Snapshotting:
从上面可以看出,运行成功后,系统会列出 ZooKeeper 运行的相关环境配置信息。
2)集群模式
集群模式下需要用户在每台 ZooKeeper 机器上运行第一部分的命令,这里不再赘述。
3)集群伪分布模式
在集群伪分布模式下,我们只有一台机器,但是要运行三个 ZooKeeper 服务实例。此时,如果再使用上述命令式肯定行不通的。这里,我们通过下面三条命能够令来运行
中 我们配置的 ZooKeeper 服务。如下所示:
zkServer.sh start zoo1.cfg
zkServer.sh start zoo2.cfg
zkServer.sh start zoo3.cfg
在运行完第一条命令之后,读者将会发现一些系统错误提示(我在安装之后没有发现这条错误信息,可能是安装linux系统的问题,具体出在哪方面,不是太清楚),如下图 1 所示:
图 1 :集群伪分布异常提示
产生如上图所示的异常信息是由于 ZooKeeper 服务的每个实例都拥有全局的配置信息,它们在启动的时候需要随时地进行 Leader 选举操作(此部分内容下面将会详细讲述)。此时第一个启动的 Zookeeper 需要和另外两个 ZooKeeper 实例进行通信。但是,另外两个 ZooKeeper 实例还没有启动起来,因此将会产生上述所示的异常信息。
我们直接将其忽略即可,因为当把图示中的“ 2 号”和“ 3 号” ZooKeeper 实例启动起来之后,相应的异常信息就回自然而然地消失。
浏览 10418
浏览: 98424 次
来自: 西安
很有用,谢谢分享啦!zookeeper 入门讲解实例
- ITeye技术网站
博客分类:
http://www.blogjava.net/BucketLi/archive//341268.html
zookeeper使用和原理探究(一)
zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的&The Chubby lock service for loosely-coupled distributed systems&论文来实现的,接下来我们首先来安装使用下这个软件,然后再来探索下其中比较重要一致性算法。
zookeeper安装和使用zookeeper的安装基本上可以按照 http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html 这个页面上的步骤完成安装,这里主要介绍下部署一个集群的步骤,因为这个官方页面似乎讲得并不是非常详细(Running Replicated Zookeeper)。由于手头机器不足,所以在一台机器上部署了3个server,如果你手头也比较紧,也可以这么做。那么我建了3个文件夹,如下server1
server3然后每个文件夹里面解压一个zookeeper的下载包,并且还建了几个文件夹,总体结构如下,最后那个是下载过来压缩包的解压文件data dataLog logs zookeeper-3.3.2那么首先进入data目录,创建一个myid的文件,里面写入一个数字,比如我这个是server1,那么就写一个1,server2对应myid文件就写入2,server3对应myid文件就写个3然后进入zookeeper-3.3.2/conf目录,那么如果是刚下过来,会有3个文件,configuration.xml, log4j.properties,zoo_sample.cfg,这3个文件我们首先要做的就是在这个目录创建一个zoo.cfg的配置文件,当然你可以把zoo_sample.cfg文件改成zoo.cfg,配置的内容如下所示: tickTime=2000initLimit=5syncLimit=2dataDir=xxxx/zookeeper/server1/datadataLogDir=xxx/zookeeper/server1/dataLogclientPort=2181server.1=127.0.0.1:server.2=127.0.0.1:server.3=127.0.0.1:标红的几个配置应该官网讲得很清楚了,只是需要注意的是clientPort这个端口如果你是在1台机器上部署多个server,那么每台机器都要不同的clientPort,比如我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也需要区分下。 最后几行唯一需要注意的地方就是 server.X 这个数字就是对应 data/myid中的数字。你在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配server.1,server.2,server.3就OK了。因为在同一台机器上,后面连着的2个端口3个server都不要一样,否则端口冲突,其中第一个端口用来集群成员的信息交换,第二个端口是在leader挂掉时专门用来进行选举leader所用。进入zookeeper-3.3.2/bin 目录中,./zkServer.sh start启动一个server,这时会报大量错误?其实没什么关系,因为现在集群只起了1台server,zookeeper服务器端起来会根据zoo.cfg的服务器列表发起选举leader的请求,因为连不上其他机器而报错,那么当我们起第二个zookeeper实例后,leader将会被选出,从而一致性服务开始可以使用,这是因为3台机器只要有2台可用就可以选出leader并且对外提供服务(2n+1台机器,可以容n台机器挂掉)。接下来就可以使用了,我们可以先通过 zookeeper自带的客户端交互程序来简单感受下zookeeper到底做一些什么事情。进入zookeeper-3.3.2/bin(3个server中任意一个)下,./zkCli.sh –server 127.0.0.1:2182,我连的是开着2182端口的机器。那么,首先我们随便打个命令,因为zookeeper不认识,他会给出命令的help,如下图
ls(查看当前节点数据),ls2(查看当前节点数据并能看到更新次数等数据) ,create(创建一个节点) ,get(得到一个节点,包含数据和更新次数等数据),set(修改节点)delete(删除一个节点)通过上述命令实践,我们可以发现,zookeeper使用了一个类似文件系统的树结构,数据可以挂在某个节点上,可以对这个节点进行删改。另外我们还发现,当改动一个节点的时候,集群中活着的机器都会更新到一致的数据。 zookeeper的数据模型在简单使用了zookeeper之后,我们发现其数据模型有些像操作系统的文件结构,结构如下图所示(1)每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识,如/SERVER2节点的标识就为/APP3/SERVER2(2)Znode可以有子znode,并且znode里可以存数据,但是EPHEMERAL类型的节点不能有子节点(3)Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本。(4)znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和
服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了(5)znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2 (6)znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。
通过java代码使用zookeeper Zookeeper的使用主要是通过创建其jar包下的Zookeeper实例,并且调用其接口方法进行的,主要的操作就是对znode的增删改操作,监听znode的变化以及处理。 以下为主要的API使用和解释
//创建一个Zookeeper实例,第一个参数为目标服务器地址和端口,第二个参数为Session超时时间,第三个为节点变化时的回调方法ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 500000,new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
//dosomething
});//创建一个节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即客户端shutdown了也不会消失)zk.create("/root", "mydata".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//在root下面创建一个childone znode,数据为childone,不进行ACL权限控制,节点为永久性的zk.create("/root/childone","childone".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);//取得/root节点下的子节点名称,返回List&String&zk.getChildren("/root",true);//取得/root/childone节点下的数据,返回byte[]zk.getData("/root/childone", true, null);//修改节点/root/childone下的数据,第三个参数为版本,如果是-1,那会无视被修改的数据版本,直接改掉zk.setData("/root/childone","childonemodify".getBytes(), -1);//删除/root/childone这个节点,第二个参数为版本,-1的话直接删除,无视版本zk.delete("/root/childone", -1);
//关闭sessionzk.close();
Zookeeper的主流应用场景实现思路(除去官方示例) (1)配置管理集中式的配置管理在应用集群中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。Zookeeper很容易实现这种集中式的配置管理,比如将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1这个节点进行监控(zk.exist("/APP1",true)),并且实现回调方法Watcher,那么在zookeeper上/APP1 znode节点下数据发生变化的时候,每个机器都会收到通知,Watcher方法将会被执行,那么应用再取下数据即可(zk.getData("/APP1",false,null));以上这个例子只是简单的粗颗粒度配置监控,细颗粒度的数据可以进行分层级监控,这一切都是可以设计和控制的。
(2)集群管理 应用集群中,我们常常需要让每一个机器知道集群中(或依赖的其他某一个集群)哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工介入的情况下迅速通知到每一个机器。Zookeeper同样很容易实现这个功能,比如我在zookeeper服务器端有一个znode叫/APP1SERVERS,那么集群中每一个机器启动的时候都去这个节点下创建一个EPHEMERAL类型的节点,比如server1创建/APP1SERVERS/SERVER1(可以使用ip,保证不重复),server2创建/APP1SERVERS/SERVER2,然后SERVER1和SERVER2都watch /APP1SERVERS这个父节点,那么也就是这个父节点下数据或者子节点变化都会通知对该节点进行watch的客户端。因为EPHEMERAL类型节点有一个很重要的特性,就是客户端和服务器端连接断掉或者session过期就会使节点消失,那么在某一个机器挂掉或者断链的时候,其对应的节点就会消失,然后集群中所有对/APP1SERVERS进行watch的客户端都会收到通知,然后取得最新列表即可。另外有一个应用场景就是集群选master,一旦master挂掉能够马上能从slave中选出一个master,实现步骤和前者一样,只是机器在启动的时候在APP1SERVERS创建的节点类型变为EPHEMERAL_SEQUENTIAL类型,这样每个节点会自动被编号,例如
zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
zk.create("/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
zk.create("/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
// 创建一个子目录节点zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(zk.getChildren("/testRootPath", false));
打印结果:[testChildPath, testChildPath, testChildPath, testChildPath]
zk.create("/testRootPath", "testRootData".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);// 创建一个子目录节点zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
zk.create("/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
zk.create("/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
// 创建一个子目录节点zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);System.out.println(zk.getChildren("/testRootPath", false));
打印结果:[testChildPath2, testChildPath1, testChildPath4, testChildPath3]我们默认规定编号最小的为master,所以当我们对/APP1SERVERS节点做监控的时候,得到服务器列表,只要所有集群机器逻辑认为最小编号节点为master,那么master就被选出,而这个master宕机的时候,相应的znode会消失,然后新的服务器列表就被推送到客户端,然后每个节点逻辑认为最小编号节点为master,这样就做到动态master选举。总结
我们初步使用了一下zookeeper并且尝试着描述了几种应用场景的具体实现思路,接下来的文章,我们会尝试着去探究一下zookeeper的高可用性与leaderElection算法。
浏览 127283
blackproof
浏览: 639887 次
来自: 北京
Good job !!
为啥EPHEMERAL_SEQUENTIAL类型的节点并没有自 ...
写道新手讨厌不贴整个工程代码的大侠需要 ...
新手讨厌不贴整个工程代码的大侠dubbo注册zookepper神奇IP - 推酷
dubbo注册zookepper神奇IP
使用dubbo在zookepper上注册服务,使用dubbo的服务器IP为192.168.70.105
而在zookepper上显示服务提供者为
dubbo://202.102.110.203:8083/com.paycenter.api.IPayService?anyhost=true&application=pay-center-service?=false&codec=dubbo&default.cluster=failover&default.executes=40&default.loadbalance=leastactive&default.retries=2&default.timeout=65000&dubbo=2.6.9&generic=false&group=ebus_dev&heartbeat=60000&interface=com.easyway.ebus.paycenter.api.IPayService&methods=getPayUrl,refund,royalty,getBankList,getAllPayAccountBySite&organization=EasyWayDev&owner=Gengyichao&pid=5564&revision=1.0.2&side=consumer&timeout=6000&tamp=3&version=0.6.0 出现一个202.102.110.203的IP
不管怎么重启zookepper,tomcat,服务器,网卡都改变不了。因为202.102.110.203这个IP不存在,服务消费者是找不到注册服务的
偶尔间发现自己笔记本192.168.45.155注册到zookepper上的ip是169.254.125.122,就开始研究自己笔记本怎么冒出来的这个IP,后来发现是本机虚拟网卡的IP,而不是在用的IP,所以估计注册zookepper可能是采用机器上第一个网卡(包括虚拟网卡)的IP。
又回到192.168.70.105,是第二块网卡,然后把IP改到了第一个网卡,把网线也换过去,正常了(后来发现不是这得原因)
过几天发现除了105机器,其他机器注册服务全部都是202.102.110.203,下定决心要找出真正原因
因为之前笔记上的事件以为是双网卡,不工作网卡可能自动IP的原因,将服务器两个网卡都插上网线,故障依旧,两个IP都注册不上。
偶尔间发现ping 一个不存在的url的时候,自动解析202.102.110.203
估计是DNS的事
果然vi /etc/resolv.conf
里面nameserver有一个DNS地址,但是服务器在内网不需要访问外网的,将nameserver改为网关192.168.70.1,一切正常,其他几台服务器都改好,启动,欧了
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致zookeeper学习记录 - agapple - ITeye技术网站
博客分类:
前段时间看了S4流计算引擎,里面使用到了zookeeper进行集群管理,所以也就花了点时间研究了下zookeeper,不求看懂所有源码,但求了解其实现机制和原理,清楚其基本使用。这也是为后续hadoop,gridgain的分布式计算的产品。
首先就是收集一些前人的一些学习资料和总结内容,方便自己快速入门。
这里罗列了几篇不错的文章:
(介绍了zookeeper能用来干嘛)
(官方文档,大致介绍zookeeper)
看了这两篇文章,基本可以对zookeeper有了一个感性的认识,它是一个什么?
zookeeper功能点:
统一命名空间(Name Service)
配置推送 (Watch)
集群管理(Group membership)
统一命名空间
在zookeeper中实现了一个类似file system系统的数据结构,比如/zookeeper/status。 每个节点都对应于一个znode节点。
znode节点的数据结构模型:
znode的数据结构内容:
The zxid of the change that caused this znode to be created.
The zxid of the change that last modified this znode.
The time in milliseconds from epoch when this znode was created.
The time in milliseconds from epoch when this znode was last modified.
The number of changes to the data of this znode.
The number of changes to the children of this znode.
The number of changes to the ACL of this znode.
ephemeralOwner
The session id of the owner of this znode if the znode is an ephemeral node. If it is not an ephemeral node, it will be zero.
dataLength
The length of the data field of this znode.
numChildren
The number of children of this znode.
说明: zxid (ZooKeeper Transaction Id,每次请求对应一个唯一的zxid,如果zxid a & zxid b ,则可以保证a一定发生在b之前)。
针对树状结构的处理,来看一下客户端使用的api :
String create(String path, byte data[], List&ACL& acl, CreateMode createMode)
create(String path, byte data[], List&ACL& acl, CreateMode createMode, StringCallback cb, Object ctx)
void delete(String path, int version)
void delete(String path, int version, VoidCallback cb, Object ctx)
Stat setData(String path, byte data[], int version)
void setData(String path, byte data[], int version, StatCallback cb, Object ctx)
Stat setACL(String path, List&ACL& acl, int version)
void setACL(String path, List&ACL& acl, int version, StatCallback cb, Object ctx)
Stat exists(String path, Watcher watcher)
Stat exists(String path, boolean watch)
void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
void exists(String path, boolean watch
, StatCallback cb, Object ctx)
byte[] getData(String path, Watcher watcher, Stat stat)
byte[] getData(String path, boolean watch
, Stat stat)
getData(String path, Watcher watcher, DataCallback cb, Object ctx)
getData(String path, boolean watch
, DataCallback cb, Object ctx)
List&String& getChildren(String path, Watcher watcher)
List&String& getChildren(String path, boolean watch
getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
getChildren(String path, boolean watch
, ChildrenCallback cb, Object ctx)
List&String& getChildren(String path, Watcher watcher, Stat stat)
List&String& getChildren(String path, boolean watch
, Stat stat)
void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)
void getChildren(String path, boolean watch
, Children2Callback cb, Object ctx)
说明:每一种按同步还是异步,添加指定watcher还是默认watcher又分为4种。默认watcher可以在ZooKeeper zk = new ZooKeeper(serverList, sessionTimeout, watcher)中进行指定。如果包含boolean watch的读方法传入true则将默认watcher注册为所关注事件的watch。如果传入false则不注册任何watch
CreateMode主要有几种:
PERSISTENT (持续的,相比于EPHEMERAL,不会随着client session的close/expire而消失)
PERSISTENT_SEQUENTIAL
EPHEMERAL (短暂的,生命周期依赖于client session,对应session close/expire后其znode也会消失)
EPHEMERAL_SEQUENTIAL
(SEQUENTIAL意为顺序的)
AsyncCallback异步callback,根据操作类型的不同,也分几类:
StringCallback
VoidCallback
StatCallback
DataCallback
(getData请求)
ChildrenCallback
Children2Callback
对应的ACL这里有篇不错的文章介绍,
配置推送(Watcher)
zookeeper为解决数据的一致性,使用了Watcher的异步回调接口,将服务端znode的变化以事件的形式通知给客户端,主要是一种反向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。
这里有篇文章介绍Watcher/Callback比较详细,可以参考下:
如果想更好的理解Watcher的使用场景,可以了解下使用Watcher机制实现分布式的Barrier , Queue , Lock同步。
Barrier例子:
public class Barrier implements Watcher {
private static final String addr = "10.20.156.49:2181";
private ZooKeeper
private Integ
private int
private Stri
public Barrier(String root, int size){
this.root =
this.size =
zk = new ZooKeeper(addr, 10 * 1000, this);
mutex = new Integer(-1);
Stat s = zk.exists(root, false);
if (s == null) {
zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} catch (Exception e) {
e.printStackTrace();
public synchronized void process(WatchedEvent event) {
synchronized (mutex) {
mutex.notify();
public boolean enter(String name) throws Exception {
zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
while (true) {
synchronized (mutex) {
List&String& list = zk.getChildren(root, true);
if (list.size() & size) {
mutex.wait();
public boolean leave(String name) throws KeeperException, InterruptedException {
zk.delete(root + "/" + name, 0);
while (true) {
synchronized (mutex) {
List&String& list = zk.getChildren(root, true);
if (list.size() & 0) {
mutex.wait();
测试代码:
public class BarrierTest {
public static void main(String args[]) throws Exception {
for (int i = 0; i & 3; i++) {
Process p = new Process("Thread-" + i, new Barrier("/test/barrier", 3));
p.start();
class Process extends Thread {
public Process(String name, Barrier barrier){
this.name =
this.barrier =
public void run() {
barrier.enter(name);
System.out.println(name + " enter");
Thread.sleep(1000 + new Random().nextInt(2000));
barrier.leave(name);
System.out.println(name + " leave");
} catch (Exception e) {
e.printStackTrace();
通过该Barrier,可以协调不同任务之间的同步处理,这里主要还是利用了Watcher机制的反向推送,避免客户端的循环polling动作,只要针对有事件的变化做一次响应。
我不罗嗦,taobao有几篇文章已经介绍的很详细。
(paxos 实现)
(paxos算法介绍续)
(zookeeper代码解析)
zookeeper集群对server进行了归类,可分为:
1. Leader/Follower会通过选举算法进行选择,可以看一下 里的Leader Election章节。
2. Observer主要是为提升zookeeper的性能,observer和follower的主要区别就是observer不参与Leader agreement vote处理。只提供读节点的处理,类似于master/slave的读请求。 ()server.1:localhost::observer
3. 可通过命令行,查看当前server所处的状态
[ljh@ccbu-156-49 bin]$ echo stat | nc localhost 2181
Zookeeper version: 3.3.3--1, built on 06/24/ GMT
/10.16.4.30:34760[1](queued=0,recved=632,sent=632)
/127.0.0.1:43626[0](queued=0,recved=1,sent=0)
/10.16.4.30:34797[1](queued=0,recved=2917,sent=2917)
Latency min/avg/max: 0/0/33
Received: 3552
Sent: 3551
Outstanding: 0
Mode: follower
##当前模式
Node count: 8
使用zookeeper,我们能干些什么?
官方文档中,有举了几个应用场景,就是使用zookeeper提供分布式锁机制,从而实现分布式的一致性处理。
典型的几个场景:
可以参看一下:
zookeeper基本是基于API和console进行znode的操作,并没有一个比较方便的操作界面,这里也发现了taobao 伯岩写的一个工具,可以比较方便的查询zookeeper信息。
工具的开发语言主要是node.js(最近比较火),其标榜的是无阻塞的api使用。其原理主要是基于google的V8(chrome的javascript的解析器,C语言编写),node.js本身是基于js语法进行开发,通过V8解析为C语言的执行代码
其标榜的无阻塞I/O实现,那可想而知就是linux系统下的select/poll的I/O模型。有兴趣的可以看下node.js的官网,下载一个玩玩。
文档地址:
代码地址:
通过git下载源码后,需要安装下node.js的几个模块express, express-namespace, zookeeper。 node.js下有个比较方便的模块管理器npm,类似于redhat的rpm,ubuntu的apt-get。
安装模块:
npm install -g express
几个界面:
浏览 91688
LZ,你好,请问Barrier实现中,Barrier类的process方法为什么要加上synchronized呢?里面已经对mutex加锁了,所以这个方法肯定同步了,即使异步事件触发了,也是不会同步执行process,process被修饰为synchronized是不是没有必要呢?我看ZooKeeper的官方文档里面也加了这个synchronized,但是我觉得好像是没有必要的。you are right. 这个例子我是参照官方文档实现的,不过Watch.process()回调基本也是串行操作,也不会有并发的问题
LZ,你的分布式Barrier有点问题吧!你enter方法里面的synchronized (mutex)在分布式的情况下等于摆设。。 分布式锁操作一定会有单机jvm的lock机制配合。这里为啥用sync原语,可以看下object的wait方法的使用
浏览: 987976 次
来自: 杭州
我转载了下,想做个记录。如果不可以转载请告知,谢谢
请教一下,怎么配置group 模式呢?没找到group模式的d ...
dxqrr 写道想问下LZ杭州机房
&=3台 (构建l ...
如果按这个方案,明显,写的时候还是有性能的问题,楼主对吗,因为 ...
引用使用EPHEMERAL会引出一个风险:在非正常情况下,网络 ...

我要回帖

更多关于 zootoday关闭了 的文章

 

随机推荐