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.mzph.cn/diannao/69263.shtml

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

相关文章

QMK启用摇杆和鼠标按键功能

虽然选择了触摸屏,我仍选择为机械键盘嵌入摇杆模块,这本质上是对"操作连续性"的执着。   值得深思的是,本次开发过程中借助DeepSeek的代码生成与逻辑推理,其展现的能力已然颠覆传统编程范式,需求描述可自动…

Linux里的容器被OOM killed的两种情况

生产上遇到过几次容器实例被OOM的现象,总结一下LInux OOM的两种触发条件。我的虚拟机是ubuntu 24.0.4版本,分配4G内存,在我的虚拟机上复现这两种case。 一 宿主机物理内存不够 当linux上所有应用程序的内存需求加起来超出了物理内存&#x…

Windows本地部署DeepSeek-R1大模型并使用web界面远程交互

文章目录 前言1. 安装Ollama2. 安装DeepSeek-r1模型3. 安装图形化界面3.1 Windows系统安装Docker3.2 Docker部署Open WebUI3.3 添加Deepseek模型 4. 安装内网穿透工具5. 配置固定公网地址 前言 最近爆火的国产AI大模型Deepseek详细大家都不陌生,不过除了在手机上安…

低代码开发与传统开发:未来的技术路线选择

在科技飞速发展的当下,软件开发技术日新月异,低代码开发与传统开发作为两种重要的开发模式,正站在未来技术路线选择的十字路口,引发了众多企业和开发者的关注。它们各自有着独特的优势和适用场景,究竟该如何抉择&#…

二、0-1搭建springboot+vue3前后端分离-登录页面

项目仓库地址:zgw-admin: 从0-1搭建一个springbootvue3的项目,这是源码 本次主要是为了: a.写登录页面 b.element plus组件是否能正常使用 c.页面调用ts是否正常,无参和有参的函数 首页的图片: 页面效果 1、引入…

Spring Task之Cron表达式

🌟 Spring Task高能预警:你以为的Cron表达式可能都是错的!【附实战避坑指南】 开篇暴击:为什么你的定时任务总在凌晨3点翻车? “明明设置了0 0 2 * * ?,为什么任务每天凌晨3点执行?” —— 来…

web-JSON Web Token-CTFHub

前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…

【FPGA】 MIPS 12条整数指令【2】

目录 实现slt 仿真 代码 完整代码 ID.v DataMem.v define.v EX.v IF.v InstMem.v MEM.v MIPS.v RegFile.v Soc.v soc_tb.v 实现slt 仿真 ori r1,r0,1100h ori r2,r0,0020h ori r3,r0,ff00h ori r4,r0,ffffh addi r5,r0,ffff slt r6,r5,r4 slt r6,r4,r…

C基础寒假练习(6)

一、终端输入行数&#xff0c;打印倒金字塔 #include <stdio.h> int main() {int rows;printf("请输入倒金字塔的行数: ");scanf("%d", &rows);for (int i rows; i > 0; i--) {// 打印空格for (int j 0; j < rows - i; j) {printf(&qu…

【C# 】图像资源的使用

在C#中&#xff0c;图像资源的使用方式方法主要依赖于你所使用的框架和库。以下是几种常见的使用图像资源的方法&#xff1a; Windows Forms 直接加载图像&#xff1a; 使用System.Drawing.Image.FromFile()方法可以直接从文件系统加载图像。 Image image Image.FromFile(&qu…

OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)

文章目录 向量变换使用GLM变换&#xff08;缩放、旋转、位移&#xff09;将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试&#xff08;Z-buffer&#xff09;练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…

OSPF基础(1):工作过程、状态机、更新

OSPF基础 1、技术背景&#xff08;与RIP密不可分&#xff0c;因为RIP中存在的问题&#xff09; RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网周期性发送全部路由信息&#xff0c;占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…

python爬虫--简单登录

1&#xff0c;使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…

如何在React中使用Redux进行状态管理?

在现代前端开发中&#xff0c;React已成为构建用户界面的流行选择。然而&#xff0c;随着应用规模的不断增长&#xff0c;管理组件之间的状态变得愈加复杂。为了解决这一问题&#xff0c;Redux 作为一种状态管理工具应运而生。本文将详细介绍如何在React中集成和使用Redux来进行…

HTML中的图片标签详解及路径使用【学术投稿-第五届环境资源与能源工程国际学术会议(ICEREE 2025)】

官网&#xff1a;www.iceree.org 会议时间&#xff1a;2025年2月21-23日 会议地点&#xff1a;中国-昆明 简介 第五届环境资源与能源工程国际学术会议&#xff08;ICEREE 2025&#xff09;将于2025年2月21日至23日在中国昆明隆重举行。主要围绕“能源工程和能源技术”、“环…

react的antd表格自定义图标

将原版的加号换成箭头 自定义图标 安装图标包&#xff1a; npm install --save ant-design/icons 引入&#xff1a; import { RightOutlined, DownOutlined } from ant-design/icons; 参数是一个函数 <Table columns{columns} dataSource{data} indentSize{20}expandIc…

【回溯+剪枝】单词搜索,你能用递归解决吗?

文章目录 79. 单词搜索解题思路&#xff1a;回溯&#xff08;深搜&#xff09; 剪枝 79. 单词搜索 79. 单词搜索 ​ 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …

Redis企业开发实战(二)——点评项目之商户缓存查询

目录 一、缓存介绍 二、缓存更新策略 三、如何保证redis与数据库一致性 1.解决方案概述 2.双写策略 3.双删策略 3.1延迟双删的目的 4.数据重要程度划分 四、缓存穿透 (一)缓存穿透解决方案 (二)缓存穿透示意图 五、缓存雪崩 (一)缓存雪崩解决方案 (二)缓存雪崩…

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署&#xff1a; 经过以下步骤&#xff0c; 最终会形成maven依赖的多个jar&#xff08;包括lib下添加的&#xff09;、 我们编写的程序代码打成一个jar&#xff0c;将程序jar与 依赖jar分开&#xff0c;便于管理&#xff1a; success&#xff1a; 最终…

Mac 部署Ollama + OpenWebUI完全指南

文章目录 &#x1f4bb; 环境说明&#x1f6e0;️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama &#x1f310; OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)&#xff08;可视化…