Docker 安装 Zookeeper(图文教程)

更新时间 2024-08-13 08:51:21

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观

上小节 中,我们已经测试了美团 Leaf-segment 号段模式(依赖数据库)来获取分布式 ID , 除了该模式外,还有 Leaf-snowflake (基于雪花算法)模式,它依赖于 Zookeeper , 所以,本小节的内容是,在本地通过 Docker 将单机版的 Zookeeper 环境搭建好。

Zookeeper 介绍

Apache ZooKeeper 是一个开源的分布式协调服务,用于大型分布式系统的开发和管理。它提供了一种简单而统一的方法来解决分布式应用中常见的协调问题,如命名服务、配置管理、集群管理、组服务、分布式锁、队列管理等。ZooKeeper 通过提供一种类似文件系统的结构来存储数据,并允许客户端通过简单的 API 进行读写操作,从而简化了分布式系统的复杂度。

Zookeeper 的核心特性如下:

  1. 一致性:对于任何更新,所有客户端都将看到相同的数据视图。这是通过 ZooKeeper 的原子性保证的,意味着所有更新要么完全成功,要么完全失败。
  2. 可靠性:一旦数据被提交,它将被持久化存储,即使在某些服务器出现故障的情况下,数据也不会丢失。
  3. 实时性:ZooKeeper 支持事件通知机制,允许客户端实时接收到数据变化的通知。
  4. 高可用性:ZooKeeper 通常以集群形式部署,可以容忍部分节点的故障,只要集群中超过半数的节点是可用的,ZooKeeper 就能继续提供服务。

ZooKeeper 的数据模型:

ZooKeeper 使用一个层次化的命名空间来组织数据,类似于文件系统中的目录树。每个节点(称为 znode)都可以有子节点,形成树状结构。每个 znode 可以存储一定量的数据,并且可以设置访问控制列表(ACL)来控制谁可以读取或修改数据。

ZooKeeper 的应用场景:

  • 配置管理:ZooKeeper 可以用来集中存储和管理分布式系统中的配置信息,当配置发生变化时,可以实时通知到所有客户端。
  • 命名服务:ZooKeeper 可以作为服务发现的注册中心,帮助客户端查找和定位服务。
  • 集群管理:ZooKeeper 可以用于选举主节点、检测集群成员的变化、以及监控集群的健康状况。
  • 分布式锁:ZooKeeper 提供了一种机制来实现分布式环境下的互斥访问,保证多个进程之间数据操作的正确性。
  • 队列管理:ZooKeeper 可以用来实现分布式队列,如任务调度队列或消息队列。

下载镜像

打开命令行工具,执行如下命令,拉取 Zookeeper 镜像:

docker pull zookeeper:3.5.6

创建挂载文件夹

镜像下载完成后,在 E:/docker/ 目录下创建 /zookeeper 文件夹,用于存放等会启动容器时,挂载出容器内 Zookeeper 的相关配置文件,以及相关持久化数据:

运行容器

执行如下命令,运行一个 Zookeeper 容器:

docker run -d --name zookeeper -p 2181:2181 -e TZ="Asia/Shanghai" -v E:\docker\zookeeper\data:/data -v E:\docker\zookeeper\conf:/conf zookeeper:3.5.6

解释一下这条命令的各项参数:

  1. docker run: 这是启动一个新的 Docker 容器的命令。
  2. -d: 这个选项表示以守护进程模式(即后台)运行容器。
  3. --name zookeeper: 给容器指定一个名字叫做 zookeeper。这可以帮助你更容易地识别和管理这个容器。
  4. -p 2181:2181: 这是一个端口映射选项,它将宿主机的 2181 端口映射到容器内的 2181 端口。这意味着在宿主机上,你可以通过访问 localhost:2181 来连接到运行在容器内的 ZooKeeper 服务。
  5. -e TZ="Asia/Shanghai": 这个环境变量设置将容器内部的时间区域设为上海时区(亚洲/上海)。这样可以确保容器内的时间与你的本地时区一致。
  6. -v E:\docker\zookeeper\data:/data: 这是一个卷挂载选项,将宿主机上的 E:\docker\zookeeper\data 目录挂载到容器内的 /data 目录。通常,ZooKeeper 将数据存储在 /data 目录下,因此这个挂载点可以让你在宿主机上持久化 ZooKeeper 的数据。
  7. -v E:\docker\zookeeper\conf:/conf: 类似于上面的挂载,这里将宿主机上的 E:\docker\zookeeper\conf 目录挂载到容器内的 /conf 目录。ZooKeeper 的配置文件一般位于 /conf 目录下,这样你可以在宿主机上编辑配置文件,而不会影响到容器重启后的配置。
  8. zookeeper:3.5.6: 这是指定使用的 Docker 镜像,这里是 ZooKeeper 版本 3.5.6 的镜像。

容器运行成功后,可通过 docker ps 命令查看正在运行中的容器,确认一下 Zookeeper 是否启动成功了:

进入 Zookeeper

执行如下命令,进入到 Zookeeper 容器中:

docker exec -it zookeeper bash

接着,执行如下命令,来启动 ZooKeeper 的命令行界面(CLI),它允许用户直接与 ZooKeeper 服务器进行交互:

./bin/zkCli.sh

连接成功后,效果图如下:

zk 基本命令

ZooKeeper CLI (zkCli) 是 ZooKeeper 分布式协调服务附带的一个命令行工具,它提供了与 ZooKeeper 服务器交互的方式。使用 zkCli,你可以执行诸如查看、创建、修改和删除 ZooKeeper 中的数据节点(znodes)的操作。

接下来,我们来学习一下 Zookeeper 的基础命令:

  • ls:列出当前路径下的子节点。如:查看根节点的子节点,命令如下:

    ls /
    

  • create:创建一个新的节点 (znode)。命令如下:

    create /myNode "犬小哈专栏"
    

    以上命令,将创建一个名为 /myNode 的节点,并初始化其数据为 "犬小哈专栏"

  • get:获取指定节点的数据和状态信息。命令如下:

    get /myNode
    

  • set:设置指定节点的数据。命令如下:

    set /myNode "犬小哈专栏更新啦"
    

    以上命令,将会把 /myNode 的数据更改为 "犬小哈专栏更新啦"

  • delete:删除指定的节点(znode) 。命令如下:

    delete /myNode
    

    以上命令,将删除 /myNode 节点,注意,只有当该节点没有子节点时才有效。

  • quit:退出 zkCli 命令行工具。效果如下: