ZooKeeper 入门

0 介绍

官网:http://zookeeper.apache.org/

ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-x.x.x\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

ZooKeeper是可以集群复制的,集群间通过Zab(ZooKeeper Atomic Broadcast)协议来保持数据的一致性。

原理:http://cailin.iteye.com/blog/2014486/


1 安装

1.1 前提

需配置Java运行环境

1.2 下载

http://mirrors.cnnic.cn/apache/zookeeper

https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

1.3 解压

解压到自己想要的目录即可

1.4 配置

可通过复制conf/zoo_sample.cfg文件,命名为zoo.cfg,然后进行修改。

示例

# ZooKeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
tickTime=2000

# 投票选举新leader的初始化时间
initLimit=10

# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5

# 保存数据的目录
dataDir=D:\\zookeeper\\data
#保存日志文件的目录
dataLogDir=D:\\zookeeper\\log

# 客户端启动端口
clientPort=2181

1.5 运行

双击bin/zkServer.cmd启动ZooKeeper启动服务端。

bin\zkCli.cmd -server 127.0.0.1:2181启动客户端操作。


2 结构

ZooKeeper的核心类似一个精简的文件系统,提供一些简单的操作和一些附件的抽象(例如,znode的排序与watch)。

有4种节点类型

类型说明
持久节点(PERSISTENT)节点创建后,就一直存在,直到有删除操作来主动清除这个节点
持久顺序节点(PERSISTENT_SEQUENTIAL)持久化节点,每个父节点会为他的第一级子节点维护一个单调增数
临时节点(EPHEMERAL)临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。
临时顺序节点(EPHEMERAL_SEQUENTIAL)临时节点,每个父节点会为他的第一级子节点维护一个单调增数,可用于实现分布式锁

3 常用命令

  • help:查看可执行的命令
  • quit:退出客户端
  • ls:查看某个节点下的数据
  • create:在某个节点下创建子节点
  • delete:删除子节点
  • rmr:删除路径
  • get:获取节点数据
  • set:设置节点数据

4 在Java中进行使用

导入相应的jar包,这里使用Maven进行jar包的管理,如下配置

<zookeeper.version>3.4.10</zookeeper.version>
<zkclient.version>0.10</zkclient.version>

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper.version}</version>
</dependency>
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>${zkclient.version}</version>
</dependency>

org.apache.zookeeper.ZooKeeper的使用

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

public class ZooKeeperTest {
    private static final String ZK_CONNECT_URL = "127.0.0.1:2181";
    private static final int SESSION_TIMEOUT = 3000;
    
    // 这里直接抛出Exception,实际项目中需要自行捕获异常
    public static void main(String[] args) throws Exception {
        ZooKeeper zooKeeper = new ZooKeeper(ZK_CONNECT_URL, SESSION_TIMEOUT, null);
        // 设置监听器
        zooKeeper.register(new ZkWatcher(zooKeeper, "/root"));
        
        // 创建root节点,其包含的数据为“root data”,设置访问权限为所有人均可访问,创建模式为持久化节点
        zooKeeper.create("/root", "root data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        
        // 设置节点内容,-1无视版本,如果版本与服务器上版本不一致则抛出异常
        zooKeeper.setData("/root", "new data".getBytes(), -1);
        
        // 获取节点内容
        Stat stat = new Stat();
        System.out.println(new String(zooKeeper.getData("/root", false, stat)));

        // 创建子节点
        zooKeeper.create("/root/child", "child".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        
        // 删除节点,必须先删除子节点才能删除根节点,不然会报错
        zooKeeper.delete("/root/child", -1);
        zooKeeper.delete("/root", -1);
    }
    
    // 节点监听器
    private static class ZkWatcher implements Watcher {
        private ZooKeeper zooKeeper;
        private String path;
        
        public ZkWatcher(ZooKeeper zooKeeper, String path) {
            this.zooKeeper = zooKeeper;
            this.path = path;
        }
        
        @Override
        public void process(WatchedEvent event) {
            System.out.println("watcher:" + event.getType());
            // 由于Watcher的监听只能是一次性,所以需要这样处理,或者改用ZkClient进行实现
            try {
                zooKeeper.exists(path, true);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

org.I0Itec.zkclient.ZkClient的使用

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;

public class ZkClientTest {
    private static final String ZK_CONNECT_URL = "127.0.0.1:2181";
    private static final String PATH = "/zkclient";
    
    public static void main(String[] args) {
        ZkClient zkClient = new ZkClient(ZK_CONNECT_URL);
        
        zkClient.subscribeDataChanges(PATH, new IZkDataListener() {
            
            @Override
            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println("handleDataDeleted dataPath:" + dataPath);
            }
            
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println("handleDataChange dataPath:" + dataPath + " data:" + data);
                
            }
        });
        
        // 创建节点
        zkClient.create(PATH, "Hello", CreateMode.PERSISTENT);
        
        // 设置节点数据
        zkClient.writeData(PATH, "new");
        
        // 获取数据
        System.out.println(zkClient.readData(PATH));
        
        // 创建子节点
        zkClient.create(PATH + "/child", "child", CreateMode.PERSISTENT);
        
        // 获取子节点信息
        System.out.println(zkClient.getChildren(PATH));
        
        // 删除节点
        zkClient.delete(PATH + "/child");
        zkClient.delete(PATH);
    }

}

参考资料

  • http://zookeeper.apache.org/
  • http://zookeeper.apache.org/doc/r3.4.10/api/index.html
  • http://zookeeper.apache.org/doc/r3.4.10/zookeeperStarted.html
  • 陈康贤的《大型分布式网站架构设计与实践》

转载于:https://www.cnblogs.com/powercto/p/6844798.html

Zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理数据,并且能够通知已注册的观察者响应数据状态的变化。如果你想了解如何入门使用Zookeeper,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Zookeeper并正确配置了环境变量。 2. 接下来,你可以查看Zookeeper的日志文件,它默认保存在启动zkServer命令所在的目录中的zookeeper.out文件中。你也可以通过修改bin/zkEnv.sh文件中的ZOO_LOG_DIR变量来指定日志文件保存的位置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Zookeeper入门](https://blog.csdn.net/weixin_44079636/article/details/118580234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Zookeeper 入门](https://blog.csdn.net/weixin_45417821/article/details/118383129)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Zookeeper入门学习](https://blog.csdn.net/weixin_44261754/article/details/130118788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值