赞
踩
Apache ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步,和提供组服务。这种服务在分布式应用程序中非常常见。
wget http://apache.mirrors.tds.net/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -xvf zookeeper-3.4.6.tar.gz
解压后,需要在conf目录下创建一个zoo.cfg的配置文件:
cd zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
tickTime
: Zookeeper的基本时间单位,毫秒为单位。这个值用于心跳和超时,比如,最小的session超时将会是两倍的tickTimedataDir
: Zookeeper保存数据的目录clientPort
: 客户端连接的端口initLimit
: Follower初始化连接到Leader的超时时间,如果Zookeeper管理的数据量很大,这个值需要增加syncLimit
: Follower和Leader之间发送消息,请求和应答的时间长度server.X=A:B:C
: 其中X是服务器编号,A是服务器的地址,B是Leader和Follower之间通信的端口,C是选举Leader的端口。如果你有三台机器,你需要增加三行,如下:server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
在每台机器的dataDir
目录下,需要创建一个myid
文件,文件中只包含这个机器的服务器编号。例如,第一台机器的myid
文件将包含数字1,第二台机器的myid
文件将包含数字2,以此类推。
在每台机器上,你可以使用Zookeeper的脚本来启动和停止服务:
cd zookeeper-3.4.6/bin
./zkServer.sh start
./zkServer.sh stop
启动后,你可以使用status命令来验证Zookeeper是否运行:
./zkServer.sh status
Zookeeper的设计目标是提供一个简单的模型来实现更复杂的同步原语。它的核心是一个高性能的协调服务,为分布式应用程序提供的主要功能包括: 维护配置信息,命名,分布式同步,和组服务。
Zookeeper遵循一个简单的客户端-服务器模型,客户端通过会话与Zookeeper进行连接和交互。在分布式环境中,Zookeeper集群(或称为一个“ensemble”)由多台机器组成。每个Zookeeper服务器都知道其它服务器的状态信息,如果一个服务器失效,其它的服务器可以自动选择一个新的Leader。
Zookeeper的数据模型是一个层次性的命名空间,非常类似于文件系统。每个节点称为一个Znode,每个Znode在创建时都会被赋予一个状态,该状态包含了版本信息,时间戳,和数据长度等元数据。Znode可以有两种类型,持久性的和临时性的。
Zookeeper提供了一组API,允许用户创建和删除Znode,读取和修改Znode的数据,以及获取子节点的信息。除了这些基本的操作,Zookeeper还提供了一些高级的功能,比如:顺序Znode,监视器,和多操作。
Zookeeper保证了它的所有操作都是原子的,并且在全局范围内有序。这些操作包括读操作,写操作,和会话事件。Zookeeper通过复制所有的事务日志和内存快照到所有的机器来实现高可用和容错。当一个Zookeeper服务器失效时,客户端可以自动连接到另一个服务器。
import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper.States; public class SimpleZkClient { private static final int SESSION_TIMEOUT = 5000; private ZooKeeper zk; public void connect(String hosts) throws Exception { zk = new ZooKeeper(hosts, SESSION_TIMEOUT, null); while (zk.getState() != States.CONNECTED) { Thread.sleep(1000); } } public void createNode(String path, String data) throws Exception { zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } public static void main(String[] args) throws Exception { SimpleZkClient client = new SimpleZkClient(); client.connect("zk1:2181,zk2:2181,zk3:2181"); client.createNode("/test", "data"); } } |
这段代码首先创建一个Zookeeper客户端,并连接到服务器。然后,它创建了一个持久性的Znode,并设置了Znode的数据。注意,我们需要等待客户端的状态变为CONNECTED,然后才能进行Znode操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。