Zookeeper入门部署(单点与集群)

          本篇文章基于docker方式部署zookeeper集群,请先安装docker

目录

1.  docker初期准备

2.启动zookeeper

        2.1 单点部署

        2.2 集群部署

 3. Linux脚本实现快速切换启动关闭


1.  docker初期准备

        拉取zookeeper镜像

docker pull zookeeper:3.5.6

        如果拉取时间过长,可以配置docker镜像源重启docker后重试

sudo bash -c 'echo '\''{"registry-mirrors": ["https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com","https://mirror.ccs.tencentyun.com","https://0dj0t5fb.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://6kx4zyno.mirror.aliyuncs.com","https://akchsmlh.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}'\'' > /etc/docker/daemon.json'
sudo systemctl daemon-reload
sudo systemctl restart docker

        创建docker网络(方便集群内部通信)

docker network create zookeeper-net

2.启动zookeeper

        2.1 单点部署

        启动docker容器

        第一台

# 指定容器名称 zookeeper
# 指定容器的主机名 zookeeper(在容器网络中使用的名称)
# 将容器加入名为 zookeeper-net 的 Docker 网络(方便集群扩展)
# 将容器的 2181 端口映射到宿主机的 2181 端口(Zookeeper 客户端默认端口)
# 设置容器的时区为 Asia/Shanghai
# 卷挂载:将宿主机的 /root/zookeeper/node-1/data 目录挂载到容器的 /data 目录(用于存储 Zookeeper 数据)
# 卷挂载:将宿主机的 /root/zookeeper/node-1/conf 目录挂载到容器的 /conf 目录(用于存放 Zookeeper 配置文件)
# 使用 zookeeper:3.5.6 镜像启动容器
docker run -d \--name zookeeper \--hostname zookeeper \--network zookeeper-net \-p 2181:2181 \-e TZ="Asia/Shanghai" \-v /root/zookeeper/node-1/data:/data \-v /root/zookeeper/node-1/conf:/conf \zookeeper:3.5.6

         默认生成的配置文件都是单点部署的配置文件,那么单点部署就已经完成了

        2.2 集群部署

        由于zookeeper的选举机制是超过半数可用才能正常提供服务,因此一般集群个数为奇数台,这里以三台作案例

        启动第二台

docker run -d \--name zookeeper-2 \--hostname zookeeper-2 \--network zookeeper-net \-p 2182:2181 \-e TZ="Asia/Shanghai" \-v /root/zookeeper/node-2/data:/data \-v /root/zookeeper/node-2/conf:/conf \zookeeper:3.5.6

        启动第三台

docker run -d \--name zookeeper-3 \--hostname zookeeper-3 \--network zookeeper-net \-p 2183:2181 \-e TZ="Asia/Shanghai" \-v /root/zookeeper/node-3/data:/data \-v /root/zookeeper/node-3/conf:/conf \zookeeper:3.5.6

        

        现在我们有了三台zookeeper单点的容器,让我们把它们配置成一个集群

        首先执行以下命令将默认生成的单点配置文件备份

cp /root/zookeeper/node-1/conf/zoo.cfg /root/zookeeper/node-1/conf/zooAlone.cfg

        接着生成集群配置文件

echo 'dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
clientPort=2181
admin.enableServer=true
server.1=zookeeper:2888:3888
server.2=zookeeper-2:2888:3888
server.3=zookeeper-3:2888:3888' > /root/zookeeper/node-1/conf/zooCluster.cfg

        使用集群配置文件覆写

cp /root/zookeeper/node-1/conf/zooCluster.cfg /root/zookeeper/node-1/conf/zoo.cfg

        这样我们就有了三个文件zoo.cfg,zooCluster.cfg和zooAlone.cfg,zookeeper启动时会读取的是zoo.cfg文件,我们可以根据启动场景使用另外两个配置文件灵活覆写zoo.cfg

        因为已经有一个备份配置文件了,并且单点启动的话只需要启动结点1即可,结点2和3的配置文件可以不进行备份直接覆写

echo 'dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
clientPort=2181
admin.enableServer=true
server.1=zookeeper:2888:3888
server.2=zookeeper-2:2888:3888
server.3=zookeeper-3:2888:3888' > /root/zookeeper/node-2/conf/zoo.cfg
echo 'dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
clientPort=2181
admin.enableServer=true
server.1=zookeeper:2888:3888
server.2=zookeeper-2:2888:3888
server.3=zookeeper-3:2888:3888' > /root/zookeeper/node-2/conf/zoo.cfg

       

        【重要】

        我们需要编辑/root/zookeeper/node-1/data/myid文件

vim /root/zookeeper/node-1/data/myid

        结点1一般默认内容都是1,不用动即可

1

        这个myid是zookeeper集群内部的身份标识,必须唯一才能启动成功

        同理需要保证结点2,结点三的myid在集群内部唯一

vim /root/zookeeper/node-2/data/myid
2
vim /root/zookeeper/node-3/data/myid
3

        重启容器加载配置文件

docker restart zookeeper
docker restart zookeeper-2
docker restart zookeeper-3

 3. Linux脚本实现快速切换启动关闭

        因为作者的云服务器资源经常不够,虽然学习过程中常常需要集群环境进行选举机制等研究,但是实际使用环境单点部署完全够用了,所以作者需要常常面临单点部署和集群部署模式的切换。对此,作者使用了编写Linux脚本的方式进行快速管理

          单点管理脚本

vim /root/zookeeper/zookeeperAlone.sh
NODES=("zookeeper")# 检查是否提供了正确的参数
if [ $# -ne 1 ]; thenecho "Usage: $0 {start|stop|restart}"exit 1
fi# 获取操作类型
OPERATION=$1# 检查操作类型是否有效
if [[ "$OPERATION" != "start" && "$OPERATION" != "stop" && "$OPERATION" != "restart" ]]; thenecho "Invalid argument. Usage: $0 {start|stop|restart}"exit 1
fi# 覆写 zoo.cfg 文件
ZOO_CLUSTER_CFG="/root/zookeeper/node-1/conf/zooAlone.cfg"
ZOO_CFG="/root/zookeeper/node-1/conf/zoo.cfg"if [ -f "$ZOO_CLUSTER_CFG" ]; thenecho "Copying $ZOO_CLUSTER_CFG to $ZOO_CFG..."cp "$ZOO_CLUSTER_CFG" "$ZOO_CFG"if [ $? -eq 0 ]; thenecho "Configuration file updated successfully."elseecho "Failed to update configuration file."exit 1fi
elseecho "zooCluster.cfg not found in /root/zookeeper/node-1/conf."exit 1
fi# 执行操作
for node in "${NODES[@]}"; doecho "$OPERATION $node..."docker "$OPERATION" "$node"if [ $? -eq 0 ]; thenecho "$node $OPERATION successfully."elseecho "Failed to $OPERATION $node."fi
done

        集群管理脚本

vim /root/zookeeper/zookeeperCluster.sh
#!/bin/bash# 定义节点列表
NODES=("zookeeper" "zookeeper-2" "zookeeper-3")# 检查是否提供了正确的参数
if [ $# -ne 1 ]; thenecho "Usage: $0 {start|stop|restart}"exit 1
fi# 获取操作类型
OPERATION=$1# 检查操作类型是否有效
if [[ "$OPERATION" != "start" && "$OPERATION" != "stop" && "$OPERATION" != "restart" ]]; thenecho "Invalid argument. Usage: $0 {start|stop|restart}"exit 1
fi# 覆写 zoo.cfg 文件
ZOO_CLUSTER_CFG="/root/zookeeper/node-1/conf/zooCluster.cfg"
ZOO_CFG="/root/zookeeper/node-1/conf/zoo.cfg"if [ -f "$ZOO_CLUSTER_CFG" ]; thenecho "Copying $ZOO_CLUSTER_CFG to $ZOO_CFG..."cp "$ZOO_CLUSTER_CFG" "$ZOO_CFG"if [ $? -eq 0 ]; thenecho "Configuration file updated successfully."elseecho "Failed to update configuration file."exit 1fi
elseecho "zooCluster.cfg not found in /root/zookeeper/node-1/conf."exit 1
fi# 执行操作
for node in "${NODES[@]}"; doecho "$OPERATION $node..."docker "$OPERATION" "$node"if [ $? -eq 0 ]; thenecho "$node $OPERATION successfully."elseecho "Failed to $OPERATION $node."fi
done

          添加可执行权限

chmod +x /root/zookeeper/zookeeperAlone.sh
chmod +x /root/zookeeper/zookeeperCluster.sh

        使用方式:

        单节点

#开启
#关闭
#重启
./root/zookeeper/zookeeperAlone.sh start
./root/zookeeper/zookeeperAlone.sh stop
./root/zookeeper/zookeeperAlone.sh restart

        集群

#开启
#关闭
#重启
./root/zookeeper/zookeeperCluster.sh start
./root/zookeeper/zookeeperCluster.sh stop
./root/zookeeper/zookeeperCluster.sh restart

        读者也可以自己修改脚本内容尝试添加更多参数命令

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…

SCRM在企业私域流量与客户管理中的变革之路探索

内容概要 在当今数字化高速发展的时代,SCRM(社交客户关系管理)作为一种新的管理工具,正逐渐成为企业私域流量管理和客户关系维护的重要基石。它不仅仅是一种软件工具,更是一种整合客户数据和关系管理的全新思维方式。…

实战 | 域环境下通过anydesk进入生产网

视频教程在我主页简介或专栏里 目录: 前言 外网突破 资产扫描与常规漏洞 经典的MS17010漏洞利用: 网络通信设备弱口令: 安全防护设备集群: 域环境渗透 核心生产网渗透 总结 教程下载链接:zkanzz 话不多说&#x…

卡特兰数学习

1,概念 卡特兰数(英语:Catalan number),又称卡塔兰数,明安图数。是组合数学中一种常出现于各种计数问题中的数列。它在不同的计数问题中频繁出现。 2,公式 卡特兰数的递推公式为:f(…

算法刷题Day28:BM66 最长公共子串

题目链接,点击跳转 题目描述: 解题思路: 方法一:暴力枚举 遍历str1的每个字符x,并在str2中寻找以相同元素x为起始的最长字符串。记录最长的公共子串及其长度。 代码实现: def LCS(self, str1: str, st…

Open FPV VTX开源之ardupilot双OSD配置摄像头

Open FPV VTX开源之ardupilot双OSD配置 1 源由2. 分析3. 配置4. 解决办法5. 参考资料 1 源由 鉴于笔者这台Mark4 Copter已经具备一定的历史,目前机载了两个FPV摄像头: 模拟摄像头数字摄像头(OpenIPC) 测试场景: 从稳定性的角度&#xff1…

【Super Tilemap Editor使用详解】(十六):高级主题:深入理解 Super Tilemap Editor

在本节中,我们将深入探讨 Super Tilemap Editor 的工作原理,特别是图块地图(Tilemap)的渲染机制以及如何优化性能。这些知识将帮助你更好地理解工具的内部机制,并在开发中做出更明智的决策。 一、图块地图与图块渲染 图块地图是 Super Tilemap Editor 的核心组件之一。它由…

01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)

目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…

Node.js下载安装及环境配置教程 (详细版)

Node.js:是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型,使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序&#xff0…

SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)

导言 SimpleFOC STM32教程09|基于STM32F103CubeMX,ADC采样相电流 如上图所示, 增加了电流环. 效果如下: 20250123-200906 RTT 如上图所示,三相占空比依然是马鞍波。当我用手去给电机施加阻力时,PID要维持目标转速&am…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志 日志流程 logfile-> l…

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚,DeepSeek正式发布了全新的推理模型DeepSeek-R1,引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色,性能对标OpenAI的o1正式版。同时,DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕

终端输入nvidia-smi查看cuda版本 我的是12.5,在网上没有找到12.5的torch,就安装12.1的。torch,torchvision,torchaudio版本以及python版本要对应 参考:https://blog.csdn.net/FengHanI/article/details/135116114 创…

炫酷JavaScript文本时钟

今天分享一段简单的 JS 代码,创意来自aem1k.com/qlock ,可以将整段 JS 代码字符本身变成时钟,每秒以 HH:MM:SS 的格式显示当前的时间。 JS逻辑实现代码本身也是时钟展示的载体,通过给字符设置不同的高亮颜色来显示当前的时间&…

前端jquery 实现文本框输入出现自动补全提示功能

git仓库:web_study/some-demos/inputAutoFit at main Cong0925/web_study (github.com) 压缩包:已绑定到指定资源 示例图: 实现说明: 1.首先,html部分设置好相关的定位标签如图: 2.主要函数 3.默认数据

Python3 OS模块中的文件/目录方法说明十二

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法:rename() 方法与 renames()方法。 二. Python3 OS模块中的文件/目录方法 1. rename() 方法 rename() 方法用于重命名文件或目录。它还可…

【Uniapp-Vue3】StorageSync数据缓存API

一、存储本地数据 uni.setStorageSync("键名", 键值); 二、获取本地数据 uni.getStorageSync("键名"); 也可以同时获取所有存储的数据的键名: uin.getStorageInfoSync(); 三、删除本地数据 uni.removeStorageSync("键名"); 如果想要…

2. Java-MarkDown文件解析-工具类

2. Java-MarkDown文件解析-工具类 1. 思路 读取markdown文件的内容&#xff0c;根据markdown的语法进行各个类型语法的解析。引入工具类 commonmark 和 commonmark-ext-gfm-tables进行markdown语法解析。 2. 工具类 pom.xml <!-- commonmark 解析markdown --> <d…

【Pytest】生成html报告中,中文乱码问题解决方案

import pytestif __name__ "__main__":# 只运行 tests 目录下的测试用例&#xff0c;并生成 HTML 报告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中设置 [pytest] addopts --htmlreport.html --self-contai…

Couchbase UI: Views

Couchbase 的 Views 页面是用于创建和管理视图的部分&#xff0c;视图是一种用于从 Couchbase 中提取和聚合数据的机制。视图通常用于实现简单的查询和数据汇总&#xff0c;特别是在处理大数据集时。以下是关于 Couchbase Views 页面的详细说明。 Views 页面功能概述 视图创建…