搭建Zookeeper单机运行环境

搭建Zookeeper单机运行环境

1.1 下载Zookeeper

Zookeeper官方网址:zookeeper.apache.org

点击download后选择版本下载即可。

1.2 创建zoo.cfg配置文件

在conf文件夹中自带一个名称为zoo_sample.cfg的配置文件,该配置文件是zookeeper的核心配置文件,与zookeeper有关的几乎所有配置都要在此文件中进行定义。

但zookeeper默认使用名称为zoo.cfg的配置文件,所以还要将zoo_sample.cfg改名为zoo.cfg

配置zoo.cfg中的内容如下:

在大部分情况下,使用默认配置即可,但这里需要配置的选项是dataDir,它的主要作用是在某个路径中存储内存中的快照数据,将内存中的数据持久化到该路径中,以便在宕机时可以将数据进行还原。

bash 复制代码
 dataDir=/usr/local/apache-zookeeper-3.8.4-bin/dataDir

该路径不要包含中文

1.3 核心配置选项tickTime、dataDir、clientPort

  • tickTime:作为主从复制关系的zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔tickTime时间就发送一个心跳嗅探数据包给对方,探测一下对方的计算机是否正常工作。tickTime时间单位为毫秒。
  • dataDir:保存zookeeper内存数据的文件夹。
  • clientPort:这是提供给客户端连接zookeeper服务器的端口,

1.4 启动zookeeper服务

使用如下命令启动zookeeper

bash 复制代码
 ./zkServer.sh start

查看zookeeper服务进程信息。ps -ef|grep zookeeper

zookeeper进程id是19038,现在执行如下命令:

端口2181被zookeeper所占用。

1.5 连接zookeeper服务

在终端中使用如下命令连接zookeeper服务。

bash 复制代码
 ./zkCli.sh -server 127.0.0.1:2181

1.6 停止zookeeper服务

arduino 复制代码
 ./zkServer.sh stop

1.7 查看状态

bash 复制代码
  ./zkServer.sh status

查看zookeeper所有命令:

在连接到zookeeper服务后,再执行help命令查看zookeeper提供的命令列表,效果如下:

1.8 使用create命令创建znode

使用create命令创建znode。

本文使用Curator来操作ZooKeeper服务器,Curator是Zookeeper的Java Client。

添加依赖:

xml 复制代码
      <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
             <version>5.6.0</version>
      </dependency>

创建常量类:

arduino 复制代码
 public class ClientConstant {
     public static final String IP="192.168.159.112";
     public static final String port="2181";
 }

测试代码如下:

ini 复制代码
 //create命令创建znode
 @Test
 void contextLoads() throws Exception {
     String connectionString= ClientConstant.IP+":"+ClientConstant.port;
     RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,3);
     CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
     client.start();
     client.create().forPath("/a","avalue".getBytes(StandardCharsets.UTF_8));
     client.close();
 }

如果重复创建相同的path,则出现异常。可以使用checkExists()方法判断path是否存在,代码如下:

ini 复制代码
//checkExists()判断path是否存在
@Test
public void checkPath() throws Exception {
    String connectionString= ClientConstant.IP+":"+ClientConstant.port;
    RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
    client.start();
    Stat stat = client.checkExists().forPath("/a");
    if(stat==null){
        client.create().forPath("/a","avalue".getBytes(StandardCharsets.UTF_8));
    }else{
        System.out.println("已经存在路径/a,不能重复创建");
    }
}

1.9 使用ls命令查看所有子节点

刚刚创建的xttroot和a节点是在/根节点下:

bash 复制代码
ls /

测试代码如下:

ini 复制代码
@Test
public void testLS() throws Exception{
    String connectionString= ClientConstant.IP+":"+ClientConstant.port;
    RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
    client.start();
    List<String> childrenPath = client.getChildren().forPath("/");
    childrenPath.forEach(System.out::println);
    client.close();
}

1.10 使用get命令查看节点对应的值

从运行结果来看,节点/zookeeper没有对应的值。

测试代码如下:

ini 复制代码
//get命令查看节点对应的值
@Test
public void testGet() throws Exception {
    String connectionString= ClientConstant.IP+":"+ClientConstant.port;
    RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
    client.start();

    System.out.println(new String(client.getData().forPath("/xttroot")));
    System.out.println(new String(client.getData().forPath("/a")));
    client.close();
}

1.11 使用set命令对节点设置新的值

less 复制代码
//set命令对节点设置新值
@Test
public void testSet() throws Exception {
    String connectionString= ClientConstant.IP+":"+ClientConstant.port;
    RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
    client.start();

    if(client.checkExists().forPath("/newNode")!=null){
        client.delete().forPath("/newNode");
    }
    client.create().forPath("/newNode","oldNodeValue".getBytes(StandardCharsets.UTF_8));
    System.out.println(new String(client.getData().forPath("/newNode")));

    client.setData().forPath("/newNode","newNodeValue".getBytes(StandardCharsets.UTF_8));
    System.out.println(new String(client.getData().forPath("/newNode")));

    client.close();
}

1.12 使用delete命令删除节点

测试代码如下:

csharp 复制代码
//delete命令删除节点
@Test
public void testDelete() throws  Exception{
    String connectionString= ClientConstant.IP+":"+ClientConstant.port;
    RetryPolicy retryPolicy=new ExponentialBackoffRetry(1000,3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
    client.start();
    if(client.checkExists().forPath("/newNode")!=null){
        client.delete().forPath("/newNode");
    }
    client.create().forPath("/newNode","oldNodeValue".getBytes(StandardCharsets.UTF_8));
    System.out.println(new String(client.getData().forPath("/newNode")));

    client.delete().forPath("/newNode");
    System.out.println(new String(client.getData().forPath("/newNode")));

    client.close();
}

节点不存在时会报异常。
这些步骤成功搭建了一个单机环境下的Zookeeper服务,并实现对节点进行CRUD操作。生产中肯定是集群了,所以写这个只是方便复习命令。

相关推荐
devlei7 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
努力的小郑8 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
Victor3569 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3569 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁9 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp9 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
宁瑶琴11 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友11 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
IT_陈寒12 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
Soofjan13 小时前
Go 内存回收-GC 源码1-触发与阶段
后端