目录

  1. 什么是 ZooKeeper
  2. 安装 ZooKeeper
  3. 基本操作
  4. 使用 ZooKeeper 的 Java 示例
  5. 参考资料

什么是 ZooKeeper

Apache ZooKeeper 是一个开源的分布式协调服务,用于管理分布式系统中的配置信息、命名服务、分布式同步和组服务。它通过一个层次化的命名空间(类似于文件系统)存储数据,称为 ZNode,提供高可靠性和一致性。ZooKeeper 广泛应用于 Hadoop、Kafka 等分布式系统中,用于领导者选举、配置管理和状态同步等场景。


安装 ZooKeeper

以下是在单机上安装 ZooKeeper 的步骤(以 Ubuntu 为例):

步骤

  1. 安装 Java
    ZooKeeper 需要 Java 运行环境 (JVM)。安装 OpenJDK:
   sudo apt update
   sudo apt install openjdk-11-jdk
   java -version  # 验证安装
  1. 下载 ZooKeeper
    从 Apache 官网下载最新稳定版(例如 3.8.4):
   wget https://downloads.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
   tar -xzf apache-zookeeper-3.8.4-bin.tar.gz
   cd apache-zookeeper-3.8.4-bin
  1. 配置 ZooKeeper
    复制并编辑配置文件:
   cp conf/zoo_sample.cfg conf/zoo.cfg
   nano conf/zoo.cfg

默认配置如下:

   tickTime=2000
   dataDir=/var/lib/zookeeper
   clientPort=2181
  • tickTime:基本时间单位(毫秒)。
  • dataDir:数据存储目录(需手动创建,例如 sudo mkdir /var/lib/zookeeper)。
  • clientPort:客户端连接端口。
  1. 启动 ZooKeeper
   bin/zkServer.sh start

检查是否运行:

   bin/zkCli.sh -server 127.0.0.1:2181

看到 ZooKeeper 提示符表示成功。


基本操作

使用 ZooKeeper 的命令行客户端(zkCli.sh)可以执行基本操作。

示例

  1. 连接客户端
   bin/zkCli.sh -server 127.0.0.1:2181
  1. 创建 ZNode
   create /myNode "Hello ZooKeeper"

创建一个路径为 /myNode 的节点,数据为 “Hello ZooKeeper”。

  1. 获取数据
   get /myNode

输出:

   Hello ZooKeeper
   [元数据信息]
  1. 修改数据
   set /myNode "Updated Data"
  1. 删除节点
   delete /myNode
  1. 列出节点
   ls /
  • 注意:ZooKeeper 支持持久节点(默认)和临时节点(-e 参数),临时节点在客户端断开时自动删除。

使用 ZooKeeper 的 Java 示例

以下是一个使用 Java API 操作 ZooKeeper 的简单示例。

示例代码

  1. 添加依赖
    在 Maven 项目中添加 ZooKeeper 依赖:
   <dependency>
       <groupId>org.apache.zookeeper</groupId>
       <artifactId>zookeeper</artifactId>
       <version>3.8.4</version>
   </dependency>
  1. Java 代码
import org.apache.zookeeper.*;
import java.io.IOException;

public class ZooKeeperExample {
    private static ZooKeeper zk;
    private static final String CONNECT_STRING = "localhost:2181";
    private static final int SESSION_TIMEOUT = 30000;

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        // 连接 ZooKeeper
        zk = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> {
            System.out.println("收到事件: " + event.getType());
        });

        // 创建节点
        String path = "/testNode";
        zk.create(path, "Test Data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建节点: " + path);

        // 获取数据
        byte[] data = zk.getData(path, false, null);
        System.out.println("获取数据: " + new String(data));

        // 修改数据
        zk.setData(path, "Updated Test Data".getBytes(), -1);
        System.out.println("更新数据: " + new String(zk.getData(path, false, null)));

        // 删除节点
        zk.delete(path, -1);
        System.out.println("节点已删除");

        // 关闭连接
        zk.close();
    }
}
  • 解释
  • ZooKeeper 对象:连接到 ZooKeeper 服务。
  • create:创建持久节点。
  • getDatasetData:读写数据。
  • delete:删除节点。

运行此代码需要确保 ZooKeeper 服务已在 localhost:2181 运行。


参考资料


这是 ZooKeeper 的入门教程,涵盖了安装、基本操作和编程示例。如果您需要更深入的内容(例如集群配置或生产环境部署),请告诉我!