搭建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操作。生产中肯定是集群了,所以写这个只是方便复习命令。

相关推荐
LunarCod13 分钟前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。43 分钟前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s1 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王2 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_857589362 小时前
SpringBoot框架:作业管理技术新解
java·spring boot·后端