开始搭建第一个zookeeper
首先需要下载zookeeper的tar包,地址为http://zookeeper.apache.org,然后再linux中解压并编译tar包。# tar-xvzf zookeeper-3.4.5.tar.gz如果你是使用的是window操作系统的话,需要找解压缩工具来解压上述jar包,并且需要配置JDK的java开发环境,要求JDK在1.6以上在解压完的目录中,bin目录包含了一些命令的脚本,例如
首先需要下载zookeeper的tar包,地址为http://zookeeper.apache.org,然后再linux中解压并编译tar包。
# tar-xvzf zookeeper-3.4.5.tar.gz
如果你是使用的是window操作系统的话,需要找解压缩工具来解压上述jar包,并且需要配置JDK的java开发环境,要求JDK在1.6以上
在解压完的目录中,bin目录包含了一些命令的脚本,例如.sh结尾的是在linux中执行的脚本命令,.cmd结尾的是在window中执行的命令的脚本的信息。Lib目录中包含了java中需要的jar操作的类库文件
第一个zookeeper会话
下面在单机模式中创建zookeeper的回话,我们会利用zkServer和zkCli的命令工具来完成我们的操作。有经验的管理员也常用他们来调试和管理zookeeper。
进入到conf目录,重新命名zoo_sample.cfg文件
# mvconf/zoo_sample.cfg conf/zoo.cfg
下面的操作是可选的,把zookeeper的数据存储目录与zookeeper安装目录隔离开来
dataDir=/users/me/zookeeper
最后来启动zookeeper服务
# bin/zkServer.sh start
JMX enabled by default
Using config: ../conf/zoo.cfg
Starting zookeeper ... STARTED
#
上面的命令最终会是zookeeper服务运行在后台,下面的命令会使zookeeper运行在前台程序中,并且从输出中我们也可以看到一些重要输出的信息。
# bin/zkServer.shstart-foreground
上述命令能够让我们看到更多的输出信息
下面让我们来开启一个客户端
#bin/zkCli.sh
<some omitted output>
2012-12-06 12:07:23,545 [myid:] - INFO [main:ZooKeeper@438] -
Initiating client connection, connectString=localhost:2181
sessionTimeout=30000 watcher=org.apache.zookeeper.
ZooKeeperMain$MyWatcher@2c641e9a
Welcome to ZooKeeper!
2012-12-06 12:07:23,702 [myid:] - INFO [main-SendThread
Getting Started with ZooKeeper | 27(localhost:2181):ClientCnxn$SendThread@966] - Opening
socket connection to server localhost/127.0.0.1:2181.
Will not attempt to authenticate using SASL (Unable to
locate a login configuration)
JLine support is enabled
2012-12-06 12:07:23,717 [myid:] - INFO [main-SendThread
(localhost:2181):ClientCnxn$SendThread@849] - Socket
connection established to localhost/127.0.0.1:2181, initiating
session [zk: localhost:2181(CONNECTING) 0]
2012-12-06 12:07:23,987 [myid:] - INFO [main-SendThread
(localhost:2181):ClientCnxn$SendThread@1207] - Session
establishment complete on server localhost/127.0.0.1:2181,
sessionid = 0x13b6fe376cd0000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
上面的执行过程为
1. 客户端开始建立一个回话
2. 客户端尝试连接127.0.0.1:2181
3. 客户端连接成功,服务端开始初始化回话状态
4. 回话状态初始化成功
5. 服务端发功一个同步的事件给客户端
下面来让我们执行一些命令操作,来玩一下zookeeper
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create/workers ""
Created /workers
[zk: localhost:2181(CONNECTED) 2] ls /
[workers, zookeeper]
[zk: localhost:2181(CONNECTED) 3]
[zk: localhost:2181(CONNECTED) 3] delete/workers
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 5] quit
Quitting...
2012-12-06 12:28:18,200 [myid:] - INFO [main-EventThread:ClientCnxn$
EventThread@509] - EventThread shut down
2012-12-06 12:28:18,200 [myid:] - INFO [main:ZooKeeper@684] - Session:
0x13b6fe376cd0000 closed
# bin/zkServer.sh stop
JMX enabled by default
Using config: ../conf/zoo.cfg
Stopping zookeeper ... STOPPED
#
会话的声明周期
回话的声明周期贯穿它的起始与结束,整个声明周期状态,如下图所示
Zookeeper集群模式
上面只是一个独立的模式,下面来搭建一个集群的模式。还是一个一个主机为例,在一个主机上搭建三个不同的zookeeper服务。为了实现集群模式操作。
参考一下文章:http://www.tuicool.com/articles/iMjMvm
Zookeeper中的锁
在zookeeper中有多种不同类型的锁,比如读写锁,全局锁等。并且有很多方式去实现zookeeper中的锁,下面我们将讨论一种最简单的,去说明应用中是如何来利用zookeeper的。
试想,我们有一个应用,并且该应用中有n个进程都在尽力的争取锁,考虑到zookeeper不是直接的暴漏它的语法,因此我们需要用zookeeper的接口去操作节点和实现锁的机制。为了获取锁,每个进程都尽力的去创建节点,如果获得了锁,就会创建成功。这种情况下,一种潜在的问题是,p进程如果死掉了,但是并没有释放锁的话,那么其他进程将没有机会获得到锁,此时系统将处于一种死锁的状态,为了避免这种情况,因此我们需要创建临时节点。
只要该节点存在,那么其他的进程将会创建失败。那么其他进程将会监视该节点,一点该节点删除掉,那么他们就有机会获取到锁。
更多推荐
所有评论(0)