zookeeper安装和使用 windows环境

本文详细介绍ZooKeeper的安装过程,包括单机模式和集群伪分布模式,并演示如何使用客户端命令及Java API进行操作。ZooKeeper是分布式应用程序协调服务,提供一致性服务,如配置维护、域名服务、分布式同步等。

简介
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) {
                }
            }
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值