返回

Apache ZooKeeper (二):搭建、操作、使用

后端

  1. 搭建 Apache ZooKeeper 集群

1.1 准备环境

  • 多台服务器(至少 3 台)
  • Java 8 或更高版本
  • ZooKeeper 3.8 或更高版本
  • SSH 访问权限

1.2 安装 ZooKeeper

  1. 在每台服务器上安装 ZooKeeper。
  2. 创建一个 ZooKeeper 配置文件。
  3. 启动 ZooKeeper 服务。

1.3 验证集群

使用以下命令检查集群是否正常运行:

zkServer.sh status

输出应类似于以下内容:

Mode: leader
Node count: 3
MyID: 1
State: running

2. ZooKeeper 常用命令

2.1 创建节点

使用以下命令创建节点:

create /my_node "Hello, ZooKeeper!"

2.2 读取节点

使用以下命令读取节点:

get /my_node

输出应类似于以下内容:

Hello, ZooKeeper!

2.3 更新节点

使用以下命令更新节点:

set /my_node "Hello, World!"

2.4 删除节点

使用以下命令删除节点:

delete /my_node

2.5 列出子节点

使用以下命令列出子节点:

ls /

输出应类似于以下内容:

my_node

2.6 监视节点

使用以下命令监视节点:

watch /my_node

输出应类似于以下内容:

WATCHER:: /my_node: Hello, World!

3. ZooKeeper API 实践

3.1 Java API

3.1.1 连接 ZooKeeper

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;

public class JavaZooKeeperExample {

    public static void main(String[] args) throws KeeperException, InterruptedException {
        ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);

        // 创建节点
        zk.create("/my_node", "Hello, ZooKeeper!".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        // 读取节点
        byte[] data = zk.getData("/my_node", false, null);
        System.out.println(new String(data));

        // 更新节点
        zk.setData("/my_node", "Hello, World!".getBytes(), -1);

        // 删除节点
        zk.delete("/my_node", -1);

        // 关闭连接
        zk.close();
    }
}

3.1.2 使用 Apache Curator

Apache Curator 是一个用于 ZooKeeper 的客户端库,它提供了一套更高级别的 API,使用起来更加方便。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;

public class JavaCuratorExample {

    public static void main(String[] args) {
        CuratorFramework zk = CuratorFrameworkFactory.newClient("localhost:2181", new RetryNTimes(3, 1000));
        zk.start();

        // 创建节点
        zk.create().forPath("/my_node", "Hello, ZooKeeper!".getBytes());

        // 读取节点
        byte[] data = zk.getData().forPath("/my_node");
        System.out.println(new String(data));

        // 更新节点
        zk.setData().forPath("/my_node", "Hello, World!".getBytes());

        // 删除节点
        zk.delete().forPath("/my_node");

        // 关闭连接
        zk.close();
    }
}

3.2 Scala API

3.2.1 连接 ZooKeeper

import org.apache.zookeeper.KeeperException
import org.apache.zookeeper.ZooKeeper

object ScalaZooKeeperExample {

  def main(args: Array[String]): Unit = {
    val zk = new ZooKeeper("localhost:2181", 3000, null)

    // 创建节点
    zk.create("/my_node", "Hello, ZooKeeper!".getBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT)

    // 读取节点
    val data = zk.getData("/my_node", false, null)
    println(new String(data))

    // 更新节点
    zk.setData("/my_node", "Hello, World!".getBytes, -1)

    // 删除节点
    zk.delete("/my_node", -1)

    // 关闭连接
    zk.close()
  }
}

3.2.2 使用 Apache Curator

import org.apache.curator.framework.CuratorFramework
import org.apache.curator.framework.CuratorFrameworkFactory
import org.apache.curator.retry.RetryNTimes

object ScalaCuratorExample {

  def main(args: Array[String]): Unit = {
    val zk = CuratorFrameworkFactory.newClient("localhost:2181", new RetryNTimes(3, 1000))
    zk.start()

    // 创建节点
    zk.create().forPath("/my_node", "Hello, ZooKeeper!".getBytes)

    // 读取节点
    val data = zk.getData.forPath("/my_node")
    println(new String(data))

    // 更新节点
    zk.setData.forPath("/my_node", "Hello, World!".getBytes)

    // 删除节点
    zk.delete.forPath("/my_node")

    // 关闭连接
    zk.close()
  }
}

结语

Apache ZooKeeper 是一款强大的分布式协调服务,它可以用于构建各种分布式系统。本文介绍了如何搭建 ZooKeeper 集群,使用 ZooKeeper 的常用命令以及在 Java 和 Scala 中使用 ZooKeeper API。