docker-compose 部署zookeeper集群 —— 筑梦之路

news2024/12/25 9:52:24

1. zookeeper介绍

Zookeeper是一个开源的分布式协调服务中间件,它提供了一种分布式数据管理服务,能够实现分布式锁、命名服务、配置管理、集群管理等功能,从而帮助用户构建高可用、高性能的分布式系统。以下是Zookeeper的一些主要特点和功能:

  • 分布式协调服务:Zookeeper具有完备的分布式协调服务,如分布式锁、leader选举、命名服务、配置管理等,可以帮助用户构建高可用、高性能的分布式系统。

  • 高可用性:Zookeeper采用了多种机制保证服务的高可用性,其中包括主从复制、数据版本控制、环路日志等,从而构建了一个高度可靠、高度可用的分布式服务。

  • 快速响应:Zookeeper具有非常快速的响应能力,可以快速处理大量的请求并提供高效的数据存取服务。

  • 数据一致性:Zookeeper保证所有客户端看到服务端数据的一致性。它使用了一系列协议和算法,如ZAB协议、Paxos算法等,确保所有节点上的数据同步和协调。

  • 开放API:Zookeeper提供了众多的API,包括Java、C、C++等多种编程语言,可以方便地与其他软件系统进行集成和交互。

总之,Zookeeper是一个可靠、高效、易用的分布式协调服务中间件。它具有强大的分布式协调和管理功能,可以帮助用户轻松构建高可用、高性能的分布式系统。

 

 2. docker创建网络

docker network create hadoop-network

# 查看创建的网络

docker network ls

 3. 准备zookeeper镜像和部署

1)下载zookeeper二进制文件

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz --no-check-certificate

2)准备配置文件和所需目录

mkdir conf data/{zookeeper-node1,zookeeper-node2,zookeeper-node3}/data -p

# zookeeper 主配置文件
cat > conf/zoo.cfg <<EOF
# tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。session最小有效时间为tickTime*2
tickTime=2000

# Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。不要使用/tmp目录
dataDir=/opt/apache/zookeeper/data

# 端口,默认就是2181
clientPort=2181

# 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),超过此数量没有回复会断开链接
initLimit=10

# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5

# 最大客户端链接数量,0不限制,默认是0
maxClientCnxns=0

# zookeeper集群配置项,server.1,server.2,server.3是zk集群节点;zookeeper-node1,zookeeper-node2,zookeeper-node3是主机名称;2888是主从通信端口;3888用来选举leader
server.1=zookeeper-node1:2888:3888
server.2=zookeeper-node2:2888:3888
server.3=zookeeper-node3:2888:3888
EOF

# 在刚创建好的zk data数据目录下面创建一个文件 myid
# 里面内容是server.N中的N,会通过挂载的方式添加
echo 1 > ./data/zookeeper-node1/data/myid
echo 2 > ./data/zookeeper-node2/data/myid
echo 3 > ./data/zookeeper-node3/data/myid


# 对外暴露的端口
cat << EOF > .env
ZOOKEEPER_HOME=/opt/apache/zookeeper
ZOOKEEPER_NODE1_SERVER_PORT=31181
ZOOKEEPER_NODE2_SERVER_PORT=32181
ZOOKEEPER_NODE3_SERVER_PORT=33181
EOF

3)服务启动脚本


cat > bootstrap.sh << EOF
#!/usr/bin/env sh

${ZOOKEEPER_HOME}/bin/zkServer.sh start

tail -f ${ZOOKEEPER_HOME}/logs/*.out

EOF

4)Dockerfile文件

FROM centos:7.9

RUN rm -f /etc/localtime && \
    ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

RUN export LANG=zh_CN.UTF-8

# 创建用户和用户组,跟yaml编排里的user: 10000:10000
RUN groupadd --system --gid=10000 hadoop && \
    useradd --system --home-dir /home/hadoop --uid=10000 --gid=hadoop hadoop -m

# 安装sudo和常用工具
RUN yum -y install sudo net-tools telnet wget nc less curl ; chmod 640 /etc/sudoers

# 给hadoop添加sudo权限
RUN echo "hadoop ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

RUN mkdir /opt/apache/

# 添加配置 JDK
ADD jdk-8u212-linux-x64.tar.gz /opt/apache/
ENV JAVA_HOME /opt/apache/jdk1.8.0_212
ENV PATH $JAVA_HOME/bin:$PATH

# 添加配置 trino server
ENV ZOOKEEPER_VERSION 3.8.1
ADD apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz /opt/apache/
ENV ZOOKEEPER_HOME /opt/apache/zookeeper
RUN ln -s /opt/apache/apache-zookeeper-${ZOOKEEPER_VERSION}-bin $ZOOKEEPER_HOME

# 创建数据存储目录
RUN mkdir ${ZOOKEEPER_HOME}/data
# copy 配置文件
RUN cp ${ZOOKEEPER_HOME}/conf/zoo_sample.cfg ${ZOOKEEPER_HOME}/conf/zoo.cfg
# 这里的值会根据挂载的而修改
RUN echo 1 >${ZOOKEEPER_HOME}/data/myid

# copy bootstrap.sh
COPY bootstrap.sh /opt/apache/
RUN chmod +x /opt/apache/bootstrap.sh

RUN chown -R hadoop:hadoop /opt/apache

WORKDIR $ZOOKEEPER_HOME

5)构建镜像

docker build -t zookeeper:3.8.1 . --no-cache

### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存

6) 编写docker-compose.yml

version: '3'
services:
  zookeeper-node1:
    image: zookeeper:3.8.1
    user: "hadoop:hadoop"
    container_name: zookeeper-node1
    hostname: zookeeper-node1
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - privileged=true
    env_file:
      - .env
    volumes:
      - ./conf/zoo.cfg:${ZOOKEEPER_HOME}/conf/zoo.cfg
      - ./data/zookeeper-node1/data/myid:${ZOOKEEPER_HOME}/data/myid
    ports:
      - "${ZOOKEEPER_NODE1_SERVER_PORT}:2181"
    expose:
      - 2888
      - 3888
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :2181 || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5
  zookeeper-node2:
    image: zookeeper:3.8.1
    user: "hadoop:hadoop"
    container_name: zookeeper-node2
    hostname: zookeeper-node2
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - privileged=true
    env_file:
      - .env
    volumes:
      - ./conf/zoo.cfg:${ZOOKEEPER_HOME}/conf/zoo.cfg
      - ./data/zookeeper-node2/data/myid:${ZOOKEEPER_HOME}/data/myid
    ports:
      - "${ZOOKEEPER_NODE2_SERVER_PORT}:2181"
    expose:
      - 2888
      - 3888
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :2181 || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5
  zookeeper-node3:
    image: zookeeper:3.8.1
    user: "hadoop:hadoop"
    container_name: zookeeper-node3
    hostname: zookeeper-node3
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - privileged=true
    env_file:
      - .env
    volumes:
      - ./conf/zoo.cfg:${ZOOKEEPER_HOME}/conf/zoo.cfg
      - ./data/zookeeper-node3/data/myid:${ZOOKEEPER_HOME}/data/myid
    ports:
      - "${ZOOKEEPER_NODE3_SERVER_PORT}:2181"
    expose:
      - 2888
      - 3888
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :2181 || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5

# 连接外部网络
networks:
  hadoop-network:
    external: true

7)部署启动

# 启动

docker-compose up -d

# 查看

docker-compose ps

# 检查日志

docker-compose logs -f

8)检查验证

# 检查节点状态,服务是否启动
docker exec -it zookeeper-node1 bash
${ZOOKEEPER_HOME}/bin/zkServer.sh status
exit

docker exec -it zookeeper-node2 bash
${ZOOKEEPER_HOME}/bin/zkServer.sh status
exit

docker exec -it zookeeper-node3 bash
${ZOOKEEPER_HOME}/bin/zkServer.sh status

4. zookeeper常用命令

在Zookeeper中,节点类型分为四种:持久节点临时节点有序节点有序临时节点

  • 持久节点:持久节点是指一旦创建,就一直存在于Zookeeper中,直到主动删除。它可以存储任意类型的数据,并且在节点的路径中,数据的路径是必须存在的。

  • 临时节点:临时节点是指一旦客户端与Zookeeper会话失效或关闭后,节点将会从Zookeeper中删除。它的创建和删除都由客户端来维护。客户端下线或会话失效时,与该客户端相关的所有临时节点都会被删除。

  • 有序节点:有序节点是指创建的节点路径后增加一个自然数序列,每个数值表示一个节点的次序。它是按照节点创建的顺序进行编号的,可以帮助节点在Zookeeper中排序并查询。有序节点需要通过自增序列来实现,并且可以同时维护完整路径信息。

  • 有序临时节点:有序临时节点是指同时拥有临时节点和有序节点两个特性的节点。它一旦被创建,就会在Zookeeper中保留一段时间,直到客户端连接断开或者会话过期。 它的序列号将会按照节点的创建顺序,由小到大进行排序,并且同样会在节点被删除时删除。

总之,不同类型的Zookeeper节点具有不同的生命周期和功能。合理地利用这些节点类型,可以帮助用户构建出更加高效、可靠的分布式应用系统。

1)创建节点

# 随便登录一个容器节点
docker exec -it zookeeper-node1 bash

# 登录
${ZOOKEEPER_HOME}/bin/zkCli.sh -server zookeeper-node1:2181

# 【持久节点】数据节点创建后,一直存在,直到有删除操作主动清除,示例如下:
create /zk-node data

# 【持久顺序节点】节点一直存在,zk自动追加数字后缀做节点名,后缀上限 MAX(int),示例如下:
create -s /zk-node data

# 【临时节点】生命周期和会话相同,客户端会话失效,则临时节点被清除,示例如下:
create -e /zk-node-temp data

# 【临时顺序节点】临时节点+顺序节点后缀,示例如下:
create -s -e /zk-node-temp data

 2)查看节点

# 随便登录一个容器节点
docker exec -it zookeeper-node1 bash

# 登录
${ZOOKEEPER_HOME}/bin/zkCli.sh -server zookeeper-node1:2181

# 列出zk执行节点的所有子节点,只能看到第一级子节点
ls /
# 获取zk指定节点数据内容和属性
get /zk-node

3)更新节点

# 表达式:set ${path} ${data} [version]
set /zk-node hello

get /zk-node

4)删除节点

# 对于包含子节点的节点,该命令无法成功删除,使用deleteall /zk-node
delete /zk-node

# 删除非空目录
deleteall /zk-node

5)退出交互模式

#帮助
help

# 退出
quit

6)非交互模式

# 直接后面接上命令执行即可
${ZOOKEEPER_HOME}/bin/zkCli.sh -server zookeeper-node1:2181 ls /

参考资料:

【中间件】通过 docker-compose 快速部署 Zookeeper 保姆级教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java注解的入门学习

一、概念 Java注解是一种元数据形式&#xff0c;可以被添加到Java代码中的各种元素&#xff08;类、方法、字段等&#xff09;上&#xff0c;以提供关于这些元素的额外信息。注解是在Java 5中引入的一项特性&#xff0c;它们不直接影响代码的执行&#xff0c;而是提供了一种机…

顺序表算法练习

一.顺序表基础算法 1.说明 博主这里是算法练习&#xff0c;帅气的读者来这里默认已经知道了它&#xff0c;这里主要是针对408考研真题中关于线性表的算法题进行编写。第一部分是根据课本编写线性表的基本函数&#xff0c;剩下四个部分是针对考研真题的算法练习。 2.C语言代码…

ChatGLM的模型架构

ChatGLM的部署微调等&#xff0c;很多资料&#xff0c;不再赘述。 P-tuning V2 以P-Turing V2为例&#xff0c;介绍ChatGLM的网络结构。P-tuning V2方法训练时冻结模型的全部参数&#xff0c;只激活prefix_encoder的参数。 1、prefix encoder 初始化pre_len&#xff0c;代表…

Apple pencil平替哪款好?平价电容笔测评

现今&#xff0c;使用电容笔的人越来越多&#xff0c;各大品牌厂商对电容笔各种性能的设计也愈发用心。那么&#xff0c;电容笔哪个品牌好用呢&#xff1f;下面&#xff0c;我来给大家推荐几款质量好的Apple pencil平替&#xff0c;需要的小伙伴可以当个参考。 一、如何挑选到…

Vue3+TS+Vite开发组件库并发布到npm

Vue2开发插件并发布到npm 使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub 目标&#xff1a;创建 vue-amazing-ui 组件库 &#xff0c;并发布到npm 该组件库已发布到 npm&#xff0c;直接安装即可使用&#xff1a; pnpm i vue-amazing-ui #or yarn add vue-a…

(十一)K8S可视化工具Rancher学习、安装

1.Rancher背景概述 在过去几年中&#xff0c;容器技术如 Docker 和容器编排引擎如 Kubernetes 受到了广泛关注和采用&#xff0c;它们为应用程序的部署、可扩展性和管理带来了革命性的变化。 然而&#xff0c;随着容器技术的快速发展&#xff0c;容器集群的管理和操作变得越来…

【笔试强训选择题】Day21.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、…

hadoop搭建、mysql、hive部署

写在前面&#xff1a; 本篇文章基于linux系统Centos7环境下进行搭建、操作 仅作为学习参考借鉴&#xff0c;欢迎大家交流学习&#xff01;一、 HDFS安装搭建 1.1 关闭虚拟机防火墙 在之后的学习、操作中&#xff0c;经常会遇到在宿主机中通过程序去访问虚拟机中的相关软件&am…

再获肯定!Coremail入选2023网络空间安全大会优秀案例!

6月2日-3日&#xff0c;在中国电子学会主办的“2023网络空间安全大会”上&#xff0c;由广东盈世计算机科技有限公司申报的“Coremail邮件安全解决方案”获评2023网络空间安全大会优秀案例&#xff0c;再次获得行业权威认可&#xff01; 本次大会由中国电子学会主办&#xff0c…

hudi系列-append写过程

前言 Append模式每次都生成新的parquet文件,不涉及数据修改、去重。cow+insert一直是append模式,mor+insert在0.13.1后也统一走append写流程(HUDI-6045) 在0.13.1之前,mor+insert存在着写parquet和写log两种情况: 写parquet:compaction.schedule.enabled = false & …

Loadrunner和JMeter、Locust三款性能测试工具全面对比

随着软件技术的发展&#xff0c;软件应用越来越普遍&#xff0c;不仅仅是互联网大厂的应用需要进行性能测试了&#xff0c;就连一些中小型的互联网应用也越来越需要对软件项目进行性能测试了。所以本文就将通过Loadrunner、JMeter和Locust三款性能测试工具从以下几个方面进行介…

QML学习二:Doxygen为qml工程生成代码文档

效果如下: 设置后能够支持.js和.qml文档。 QML学习二:Doxygen为工程生成注释文档 前言一、安装doxyqml二、Doxygen设置1.文档目录设置2.文档目录设置三、添加注释总结前言 好的代码必须配一个好的文档说明,方便以后维护以及学习。 前提条件: 1.安装好了Doxygen代码生成工…

快速搭建,降低成本!了解低代码平台适用的五大场景

对于希望简化应用程序开发流程的公司来说&#xff0c;低代码平台已经成为一种有效的解决方案。这些平台使创建和部署应用程序成为可能&#xff0c;而不需要广泛的编码技能或知识&#xff0c;从而使过程更快、更高效、更具成本效益。但是&#xff0c;低代码平台适用于哪些场景呢…

《操作系统》by李治军 | 实验6 - 信号量的实现和应用

目录 一、实验目的 二、实验内容 &#xff08;一&#xff09;用信号量解决生产者—消费者问题 &#xff08;二&#xff09;实现信号量&#xff0c;用生产者—消费者程序检验 三、实验准备 1、信号量 2、多进程共享文件 3、终端也是临界资源 4、原子操作、睡眠和唤醒 …

接口测试 —— 接口测试定义

1、接口测试概念 &#xff08;重点&#xff09; 接口测试是测试系统组件间接口的一种测试&#xff0c;它界于单元测试与系统测试中间。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过…

pinia 持久化插件pinia-plugin-persistedstate 安装、使用(图文详解)

序&#xff1a; 1、博主vue3、ts 5.x、pinia 2.1.3版本&#xff0c; 2、所以如果试了不行的你看看是不是自己版本和博主的对不上 3、其实就是省略掉localStorage 这一步&#xff0c;会自己写的小伙伴自己写个也是蛮快的 4、放个中文文档》Home | pinia-plugin-persistedstate 5…

【Verilog】汉明码

文章目录 汉明码定义校验位个数编码规则一个例子编码解码 C实现功能编写测试结果 Verilog实现.v功能代码testbench波形 汉明码 定义 在传输的信息流中插入验证码&#xff0c;侦测单一比特错误只能发现和修正一位错误&#xff0c;对于两位或两位以上的错误无法发现与修正 校验…

iSCSI共享存储搭建

1.简介 iSCSI&#xff1a;Internet Small Computer System Interface&#xff0c;Internet小型计算机系统接口&#xff0c;又称为IP-SAN&#xff0c;是一种基于因特网及SCSI-3协议下的存储技术。 2.iSCSI的作用 基于客户端和服务端架构的虚拟磁盘技术&#xff0c;服务端提供…

如何让url在新页面打开路由页面,并脱离vue-admin-template的壳,即不包裹在侧边栏和顶栏中

文章目录 一、打开的页面不包裹在侧边栏和顶栏中二、新窗口打开&#xff08;_blank&#xff09;三、最终效果 一、打开的页面不包裹在侧边栏和顶栏中 在使用vue-admin-template新建的页面中&#xff0c;打开的页面都是在框架内的内容区。 但假如我需要在左侧点击一个链接&…

面试题丨android面试问题合集

1、项目里静态分析和基于xposed动态工具介绍一下&#xff0c;如果不使用xposed&#xff0c;怎么实现动态分析工具&#xff1f; 静态分析工具是指在不运行程序的情况下&#xff0c;通过对程序文件进行源代码分析&#xff0c;从而对程序的安全性、可靠性、性能等进行分析的工具。…