简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,
ZooKeeper的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪分布模式。ZooKeeper 单机模式的安装相对比较简单,如果第一次接触ZooKeeper的话,建议安装ZooKeeper单机模式或者集群伪分布模式。
下载
Apache官方最新版本为:zookeeper-3.4.14
下载地址:https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
一.单机模式
在D:\zookeeper-3.4.14\conf中把zoo_sample.cfg修改为zoo.cfg文件
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=D:\\Tool\\zookeeper-3.4.14\\zookeeper\\data
dataLogDir=D:\\Tool\\zookeeper-3.4.14\\zookeeper\\log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
配置文件信息:
tickTime:基本事件单元,以毫秒为单位,用来控制心跳和超时,默认情况超时的时间为两倍的tickTime
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒,默认为10
dataDir:保存数据的目录.可以是任意目录.,
dataLogDir:log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
maxClientCnxns:限制连接到zookeeper的客户端数量,并且限制并发连接数量,它通过ip区分不同的客户端。
minSessionTimeout和maxSessionTimeout:最小会话超时时间和最大的会话超时时间,在默认情况下,最小的超时时间为2倍的tickTime时间,最大的会话超时时间为20倍的会话超时时间,系统启动时会显示相应的信息。默认为-1
syncLimit:参数设定了允许一个跟随者与一个领导者进行同步的时间,如果在设定的时间段内,跟随者未完成同步,它将会被集群丢弃。所有关联到这个跟随者的客户端将连接到另外一个跟随着。总的时间长度就是 5*2000=10秒
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个java进程
启动后jps可以看到QuorumPeerMain的进程

也可以启动客户端连接一下

OK,单机模式安装成功,很简单
二.安装集群伪分布模式
重命名 zoo_sample.cfg文件 为zoo1.cfg

修改配置文件zoo1.cfg,原配置文件里有的,修改成下面的值,没有的则加上

复制 zkServer.cmd文件 为zkServer1.cmd,zkServer2.cmd,zkServer2.cmd
添加如下配置

依次点开启动服务

在数据文件下创建myid 编号

三.Zookeeper使用
使用客户端命令操作zookeeper
检测是否成功启动,用zookeeper客户端连接下服务端
# bin/zkCli.sh
1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

2、创建一个新的 znode ,使用 create /zkPro myData

3、再次使用 ls 命令来查看现在 zookeeper 中所包含的内容:

4、下面我们运行 get 命令来确认第二步中所创建的 znode 是否包含我们所创建的字符串:

5、下面我们通过 set 命令来对 zk 所关联的字符串进行设置:

6、下面我们将刚才创建的 znode 删除

四使用Java API操作zookeeper
使用Java API操作zookeeper需要引用下面的包

package com.yxds.manager;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
public class Test {
public static void main(String[] args) throws Exception {
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183",30000,new TestWatcher());
String node = "/node2";
Stat stat = zk.exists(node,false);
if(null == stat){
//创建节点
String createResult = zk.create(node,"test".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(createResult);
}
byte [] b = zk.getData(node,false,stat);
System.out.println(new String(b));
zk.close();
}
}
class TestWatcher implements Watcher {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("--------------------");
System.out.println("path:"+watchedEvent.getPath());
System.out.println("type:"+watchedEvent.getType());
System.out.println("state:"+watchedEvent.getState());
System.out.println("--------------------");
}
}
package com.yxds.manager;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
/**
* 分布式配置中心demo
* @author
*
*/
public class ZooKeeperProSync {
public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static ZooKeeper zk = null;
public static Stat stat = new Stat();
public static void main(String[] args) throws Exception {
//zookeeper配置数据存放路径
String path = "/username";
//连接zookeeper并且注册一个默认的监听器
zk = new ZooKeeper("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 5000, //
new ZkTestWatcher());
//等待zk连接成功的通知
connectedSemaphore.await();
//获取path目录节点的配置数据,并注册默认的监听器
System.out.println(new String(zk.getData(path, true, stat)));
Thread.sleep(Integer.MAX_VALUE);
}
}
class ZkTestWatcher implements Watcher{
@Override
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) { //zk连接成功通知事件
if (EventType.None == event.getType() && null == event.getPath()) {
ZooKeeperProSync.connectedSemaphore.countDown();
} else if (event.getType() == EventType.NodeDataChanged) { //zk目录节点数据变化通知事件
try {
System.out.println("配置已修改,新值为:" + new String(ZooKeeperProSync.zk.getData(event.getPath(), true, ZooKeeperProSync.stat)));
} catch (Exception e) {
}
}
}
}
}
本文详细介绍ZooKeeper的安装过程,包括单机模式和集群伪分布模式,并演示如何使用客户端命令及Java API进行操作。ZooKeeper是分布式应用程序协调服务,提供一致性服务,如配置维护、域名服务、分布式同步等。
1118

被折叠的 条评论
为什么被折叠?



