Zookeeper 集群部署与故障转移
Zookeeper 介绍
Zookeeper 是一个开源的分布式协调服务,由Apache基金会维护,专为分布式应用提供高可用、强一致性的核心基础能力。它通过简单的树形命名空间(称为ZNode树)存储数据节点(ZNode),每个节点可包含少量数据和ACL权限控制。Zookeeper的核心价值在于解决分布式环境中的协同难题:如统一配置管理、分布式锁服务、集群选主、状态同步和命名服务等。其设计遵循CP原则(一致性优先),采用ZAB(Zookeeper Atomic Broadcast)共识协议保证数据强一致性,所有写操作必须由Leader节点协调,经集群多数节点(Quorum)确认后才能提交。客户端通过Session会话与集群交互,会话超时机制可自动清理临时节点(Ephemeral Nodes),而顺序节点(Sequential Nodes)生成的全局唯一路径则实现了分布式队列等高级模式。凭借其轻量级API、高吞吐和可靠的故障恢复机制,Zookeeper已成为Hadoop、Kafka、Dubbo等众多分布式系统的核心依赖。
Zookeeper 写请求处理
-
客户端请求:客户端图标向Zookeeper集群发送写请求
-
Leader协调:其中一个节点接收请求,Leader将操作转换为事务Proposal
-
广播提案:Leader向所有Follower广播提案
-
ACK确认:Followers处理提案后返回ACK,当收到多数节点ACK(如3/5节点)时,Leader发出COMMIT指令
-
数据提交:所有节点将数据写入内存数据库,事务日志实时滚动记录
Zookeeper 事务日志和快照
Zookeeper 集群中的每个服务器节点每次接收到写操作请求时,都会先将这次请求发送给 leader。leader 将这次写操作转换为带有状态的事务,然后对这次写操作进行广播以便协调。当协调通过(即大多数节点允许这次写操作)后,leader 通知所有的服务器节点,使它们将这次写操作应用到内存数据库中,并将其记录到事务日志中。
当事务日志记录的次数达到一定数量后(默认 100,000 次),就会将内存数据库序列化一次,使其持久化保存到磁盘上。序列化后的文件称为“快照文件”。每次生成快照后,都会创建新的事务日志文件。
-
日志计数:事务日志计数器从0开始累加
-
触发阈值:当计数器达到snapCount=100,000时暂停新事务写入
-
序列化快照:内存数据库内容被序列化,生成快照文件
-
日志重置:创建新事务日志文件(旧日志归档,新日志从0开始计数)
Zookeeper 配置文件
tickTime=2000 # "滴答时间",用于配置Zookeeper中最小的时间单元长度(单位:毫秒),是其它时间配置的基础。
initLimit=10 # 初始化限制时间(包含启动和数据同步),单位是tickTime的倍数。
syncLimit=5 # 同步限制时间(用于正常工作状态下的心跳监测间隔),单位是tickTime的倍数。
dataDir=/tmp/zookeeper # 配置Zookeeper服务存储数据文件的目录供服务器访问。基于安全考虑,可以修改为 dataDir=/usr/local/zookeeper/data
#dataLogdir=/usr/local/zookeeper/logs # 可以指定事务日志的存储路径。事务日志对Zookeeper的性能影响非常大,强烈建议将事务日志目录(dataLogDir)和数据目录(dataDir)分开存储。
clientPort=2181 # 配置当前Zookeeper服务对外暴露的端口,供客户端连接和建立会话使用。
preAllocsize: # 为每个新的事务日志文件预分配磁盘空间的大小。默认是64M,意味着每个新的事务日志文件初始大小即为64M。如果Zookeeper产生事务(写操作)的频率非常高,可以考虑减小这个参数值,因为每次日志切换后都会创建一个新的事务日志文件(即使之前的64M空间可能尚未写满)。
snapCount: # 此配置项定义了Zookeeper在将内存数据库(DataTree)序列化为快照(Snapshot)文件之前,需要写入多少次事务日志。即,每写入若干次事务日志后,会生成一次快照。默认值为100000。为了防止Zookeeper集群中的所有服务器节点同时生成快照(通常情况下,所有集群节点的配置文件是完全相同的),当某个节点已写入的事务日志数量进入区间 (snapCount/2 + 1, snapCount) 时,会随机选择一个具体的数值作为该节点实际生成快照的触发点。
autopurge.snapRetainCount=3 # (3.4.0中新增的功能):启用Zookeeper自动清理功能后,此参数指定保留在 dataDir 和 dataLogDir 中的最新快照文件及其对应的事务日志文件的数量。系统将保留此数量的文件(默认为3,最小值也为3),并清除更旧的文件。
autopurge.purgeInterval=24 # (3.4.0及之后版本):此参数指定了自动清理功能执行的频率(单位:小时)。需要配置一个1或更大的整数。默认值是0,表示不开启自动清理功能。
Zookeeper 集群部署
现在有三台机器都已经安装Zookeeper
主机 | IP |
---|---|
Server1 | 192.168.80.11 |
Server2 | 192.168.80.22 |
Server3 | 192.168.80.33 |
三台机器上传Zookeeper集群一键安装脚本
#!/bin/bash
ZK_VERSION=3.8.4
ZK_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin"NODE1=192.168.80.11
NODE2=192.168.80.22
NODE3=192.168.80.33. /etc/os-releaseprint_status() {local message=$1local status=$2local GREEN='\033[0;32m'local RED='\033[0;31m'local YELLOW='\033[0;33m'local NC='\033[0m'local status_symbol=""case $status insuccess)status_symbol="[ OK ]"color=$GREEN;;failure)status_symbol="[FAILED]"color=$RED;;warning)status_symbol="[WARN ]"color=$YELLOW;;esacprintf "%-50s ${color}%s${NC}\n" "$message" "$status_symbol"
}detect_node_id() {local current_ip=$(hostname -I | awk '{print $1}')if [[ $current_ip == $NODE1 ]]; thenMYID=1elif [[ $current_ip == $NODE2 ]]; thenMYID=2elif [[ $current_ip == $NODE3 ]]; thenMYID=3elsewhile true; doread -p "输入节点编号 (1-3): " MYIDif [[ $MYID =~ ^[1-3]$ ]]; thenbreakelseprint_status "无效的节点编号,请输入1-3" warningfidonefiprint_status "节点ID: $MYID" success
}install_java() {print_status "安装Java环境..." successif [[ $ID == 'centos' || $ID == 'rocky' ]]; thenyum -y install java-1.8.0-openjdk-develelseapt updateapt install -y openjdk-8-jdkfiif java -version &>/dev/null; thenprint_status "Java安装成功" successjava -versionelseprint_status "Java安装失败" failureexit 1fi
}setup_zookeeper() {print_status "安装ZooKeeper..." successlocal install_dir="/usr/local/src"local zk_package="apache-zookeeper-${ZK_VERSION}-bin.tar.gz"local zk_home="/usr/local/zookeeper"mkdir -p $install_dirif [[ ! -f "$install_dir/$zk_package" ]]; thenprint_status "下载ZooKeeper安装包..." successwget -P $install_dir --no-check-certificate "$ZK_URL" || {print_status "下载失败: $ZK_URL" failureexit 1}fitar xf "$install_dir/$zk_package" -C /usr/local || {print_status "解压失败" failureexit 1}ln -sf "/usr/local/apache-zookeeper-${ZK_VERSION}-bin" "$zk_home"echo "export PATH=$zk_home/bin:\$PATH" > /etc/profile.d/zookeeper.shsource /etc/profile.d/zookeeper.shlocal data_dir="$zk_home/data"mkdir -p "$data_dir"echo "$MYID" > "$data_dir/myid"cat > "$zk_home/conf/zoo.cfg" <<EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=$data_dir
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
server.1=$NODE1:2888:3888
server.2=$NODE2:2888:3888
server.3=$NODE3:2888:3888
EOFcat > /etc/systemd/system/zookeeper.service <<EOF
[Unit]
Description=Apache ZooKeeper Service
After=network.target[Service]
Type=forking
Environment="JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))"
ExecStart=$zk_home/bin/zkServer.sh start
ExecStop=$zk_home/bin/zkServer.sh stop
ExecReload=$zk_home/bin/zkServer.sh restart
User=root
Group=root
Restart=on-failure
RestartSec=10[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reloadsystemctl enable --now zookeeper.serviceif systemctl is-active --quiet zookeeper.service; thenprint_status "ZooKeeper 启动成功" successzkServer.sh statuselseprint_status "ZooKeeper 启动失败" failurejournalctl -u zookeeper.service -b --no-pagerexit 1fi
}main() {detect_node_idinstall_javasetup_zookeeperprint_status "ZooKeeper 节点 $MYID 安装完成" success
}main
依次执行脚本,并查看集群状态:
192.168.80.11:
192.168.80.22:
192.168.80.33:
测试故障转移:
停掉192.168.80.22 也就是leader:
查看节点状态,80.33成为leader
Zookeeper 客户端访问
1.连接集群
zkCli.sh -server 192.168.80.22:2181 #指定服务器连接
zkCli.sh #默认连接本机
2.基础命令
命令 | 作用 | 示例 |
---|---|---|
ls / | 查看根节点下所有节点 | ls / → [zookeeper] |
create | 创建节点(默认持久节点) | create /appl "data" |
get | 获取节点数据 | get /appl → hello,zookeeper |
set | 修改节点数据 | set /appl "new_data" |
delete | 删除无子节点的节点 | delete /appl |
deleteall | 递归删除节点及其子节点 | deleteall /appl |
stat | 查看节点元数据 | stat /zookeeper |
version | 查看客户端版本 | version → 3.6.2... |
TAB键 | 列出所有支持命令 | 输入后显示命令列表 |
3.节点类型特性
类型 | 创建方式 | 关键特性 |
---|---|---|
持久节点 | create /path | 会话结束仍存在,支持创建子节点(需逐级创建) |
临时节点 | create -e /path | 会话结束自动删除,不支持创建子节点 |
4.写入和读取
在test1下的config中写入或读取数据,所以Zookeeper中的文件可以理解为文件或文件夹,是通用的,既能存放数据又能当文件夹。
注意临时节点无法创建子目录:
相关文章:

Zookeeper 集群部署与故障转移
Zookeeper 介绍 Zookeeper 是一个开源的分布式协调服务,由Apache基金会维护,专为分布式应用提供高可用、强一致性的核心基础能力。它通过简单的树形命名空间(称为ZNode树)存储数据节点(ZNode),…...

Redis最佳实践——电商应用的性能监控与告警体系设计详解
Redis 在电商应用的性能监控与告警体系设计 一、原子级监控指标深度拆解 1. 内存维度监控 核心指标: # 实时内存组成分析(单位字节) used_memory: 物理内存总量 used_memory_dataset: 数据集占用量 used_memory_overhead: 管理开销内存 us…...

区域徘徊检测算法AI智能分析网关V4助力公共场所/工厂等多场景安全升级
一、项目背景 随着数字化安全管理需求激增,重点场所急需强化人员异常行为监测。区域徘徊作为潜在安全威胁的早期征兆,例如校园围墙外的陌生逗留者,都可能引发安全隐患。传统人工监控模式效率低、易疏漏,AI智能分析网关V4的区域徘…...

修复与升级suse linux
suse linux enterprise desktop 10提示:xxx service failed when loaded shared lib . error ibgobject.so.2.0:no such file or directory. suse linux enterprise server 12.iso 通过第一启动项引导,按照如下方式直接升级解决。...

电力高空作业安全检测(2)数据集构建
数据集构建的重要性 在电力高空作业安全检测领域,利用 计算机视觉技术 进行安全监测需要大量的图像数据,这些数据需要准确标注不同的安全设备与作业人员行为。只有构建出包含真实场景的高质量数据集,才能通过深度学习等算法对高空作业中的潜…...

嵌入式开发之STM32学习笔记day18
STM32F103C8T6 SPI通信读写W25Q64 1 W25Q64简介 W25Qxx系列是一种低成本、小型化且易于使用的非易失性存储器(NOR Flash),它广泛应用于需要持久化存储数据的各种场景,如数据存储、字库存储以及固件程序存储等。该系列存储器采用…...

[论文阅读]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning
PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning | IJCAI IJCAI-22 发表于2022年的论文,当时大家还都在做小模型NLP的相关工作(BERT,Ro…...
一键 Ubuntu、Debian、Centos 换源(阿里源、腾讯源等)
网上各种办法都不行,使用这个工具可以了。 我用的是腾讯云源 配置系统源 bash <(curl -sSL https://linuxmirrors.cn/main.sh)配置 docker 源 bash <(curl -sSL https://linuxmirrors.cn/docker.sh)...

汽车安全:功能安全FuSa、预期功能安全SOTIF与网络安全Cybersecurity 解析
汽车安全的三重防线:深入解析FuSa、SOTIF与网络安全技术 现代汽车已成为装有数千个传感器的移动计算机,安全挑战比传统车辆复杂百倍。 随着汽车智能化、网联化飞速发展,汽车电子电气架构已从简单的分布式控制系统演变为复杂的移动计算平台。现…...

【C++高级主题】虚继承
目录 一、菱形继承:虚继承的 “导火索” 1.1 菱形继承的结构与问题 1.2 菱形继承的核心矛盾:多份基类实例 1.3 菱形继承的具体问题:二义性与数据冗余 二、虚继承的语法与核心目标 2.1 虚继承的声明方式 2.2 虚继承的核心目标 三、虚继…...

基于 ZYNQ 的实时运动目标检测系统设计
摘 要: 传统视频监控系统在实时运动目标检测时,存在目标检测不完整和目标检测错误的局限 性 。 本研究基于体积小 、 实时性高的需求,提出了一种将动态三帧差分法与 Sobel 边缘检测算法结 合的实时目标检测方法,并基于 ZYNQ 构建了视频…...
数据结构(JAVA版)练习题
(题目难易程度与题号顺序无关哦) 目录 1、多关键字排序 2、集合类的综合应用问题 3、数组排序 4、球的相关计算问题 5、利用类对象计算日期 6、日期计算问题 7、星期日期的计算 8、计算坐标平面上两点距离 9、异常处理设计问题 10、Java源文件…...
C#编程过程中变量用中文有啥影响?
一、C#语言对中文变量名的支持规则 技术可行性 C#编译器基于Unicode标准(UTF-16编码),支持包括中文在内的非ASCII字符作为变量名。变量名规则允许字母、数字、下划线及Unicode字符(如汉字),但不能以数字开头…...
哈希表入门:用 C 语言实现简单哈希表(开放寻址法解决冲突)
目录 一、引言 二、代码结构与核心概念解析 1. 数据结构定义 2. 初始化函数 initList 3. 哈希函数 hash 4. 插入函数 put(核心逻辑) 开放寻址法详解: 三、主函数验证与运行结果 1. 测试逻辑 2. 运行结果分析 四、完整代码 五、优…...

[华为eNSP] 在eNSP上实现IPv4地址以及IPv4静态路由的配置
设备名称配置 重命名设备以及关闭信息提示 此处以R1演示,R2R3以此类推 <Huawei>system-view [Huawei]sysname R1#关闭提示 undo info-center enable 配置路由接口IP地址 R1 [R1]interface GigabitEthernet 0/0/1[R1-GigabitEthernet0/0/1]ip address 10.0.…...

2024年第十五届蓝桥杯青少组c++国赛真题——快速分解质因数
2024年第十五届蓝桥杯青少组c国赛真题——快速分解质因数 题目可点下方去处,支持在线编程,在线测评~ 快速分解质因数_C_少儿编程题库学习中心-嗨信奥 题库收集了历届各白名单赛事真题和权威机构考级真题,覆盖初赛—省赛—国赛&am…...

【动手学MCP从0到1】2.1 SDK介绍和第一个MCP创建的步骤详解
SDK介绍和第一个MCP 1. 安装SDK2. MCP通信协议3. 基于stdio通信3.1 服务段脚本代码3.2 客户端执行代码3.2.1 客户端的初始化设置3.2.2 创建执行进行的函数3.2.3 代码优化 4. 基于SSE协议通信 1. 安装SDK 开发mcp项目,既可以使用Anthropic官方提供的SDK,…...
基于MyBatis插件实现动态表名解决多环境单一数据库问题
业务场景 在为某新能源汽车厂商进行我司系统私有化部署时,在预演环境和生产环境中,客户仅提供了一个 MySQL 数据库实例。为了确保数据隔离并避免不同环境之间的数据冲突,常规做法是为每个环境创建独立的表(如通过添加环境前缀或后…...

测试面试题总结一
目录 列表、元组、字典的区别 nvicat连接出现问题如何排查 mysql性能调优 python连接mysql数据库方法 参数化 pytest.mark.parametrize 装饰器 list1 [1,7,4,5,5,6] for i in range(len(list1): assert list1[i] < list1[i1] 这段程序有问题嘛? pytest.i…...
Spring Boot应用多环境打包与Shell自动化部署实践
一、多环境配置管理(Profile方案) 推荐方案:通过Maven Profiles实现环境隔离 在pom.xml中定义不同环境配置,避免硬编码在application.yml中: <profiles><!-- 默认环境 --><profile><id>node…...

【深度学习】14. DL在CV中的应用章:目标检测: R-CNN, Fast R-CNN, Faster R-CNN, MASK R-CNN
深度学习在计算机视觉中的应用介绍 深度卷积神经网络(Deep convolutional neural network, DCNN)是将深度学习引入计算机视觉发展的关键概念。通过模仿生物神经系统,深度神经网络可以提供前所未有的能力来解释复杂的数据模式&…...
grpc的二进制序列化与http的文本协议对比
grpc的二进制序列化与http的文本协议对比 1. 二进制格式 vs 文本格式2. 编码机制:Varint 与固定长度3. 没有字段名与标点4. 较少的元信息开销4.1 HTTP/1.1 请求的元信息组成与开销4.1.1 各部分字节数示例 4.2 HTTP/2 帧结构与 HPACK 头部压缩4.2.1 HEADERS 开销对比…...
Linux 环境下 PPP 拨号的嵌入式开发实现
一、PPP 协议基础与嵌入式应用场景 PPP (Point-to-Point Protocol) 是一种在串行线路上传输多协议数据包的通信协议,广泛应用于拨号上网、VPN 和嵌入式系统的远程通信场景。在嵌入式开发中,PPP 常用于 GPRS/3G/4G 模块、工业路由器和物联网设备的网络连接…...

UE 材质基础第三天
飘动的旗帜 错乱的贴图排序,创建一个材质函数 可以用在地面材质 体积云材质制作 通过网盘分享的文件:虚幻引擎材质宝典.rar 链接: https://pan.baidu.com/s/1AYRz2V5zQFaitNPA5_JbJw 提取码: cz1q --来自百度网盘超级会员v6的分享...

【Github/Gitee Webhook触发自动部署-Jenkins】
Github/Gitee Webhook触发自动部署-Jenkins #mermaid-svg-hRyAcESlyk5R2rDn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRyAcESlyk5R2rDn .error-icon{fill:#552222;}#mermaid-svg-hRyAcESlyk5R2rDn .error-tex…...
软件工程专业本科毕业论文模板
以下是软件工程专业本科毕业论文的通用模板框架,结合学术规范与工程实践要求,涵盖从需求分析到测试验证的全流程结构,并附格式说明与写作建议: 一、前置部分 1. 封面 - 包含论文标题(简明反映研究核心,如“…...

新松机械臂 2001端口服务的客户端例程
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

电脑网络重置,找不到原先自家的WIFI,手机还能正常连接并上网
问题排查:1、电脑感觉网络太慢,因此打算点击了网络重置 2、点击提示会删除网络,在五分钟后关机重启 3、从设备管理器设备的无线wifi属性-事件中发现删除记录 4、选择更新驱动程序 5、从列表中选取 6、更改回老驱动版本 备选方案&#…...

期末复习(学习)之机器学习入门基础
上课没听过报道。欢迎补充交流! 前言:老师画的重点其实可以完全不用看,我这里只是看了一眼书顺着书本敲一遍。 比较干货的部分,直接看学习通的内容就好。最重要的是把学习通的内容记好。 目录 老师划的重点:P50 结构…...

网络各类型(BMA,NBMA,P2P)
网络类型—基于二层(数据链路层)使用的协议不同从而导致数据包封装方式不同,工作方式也有所区别,从而对网络本身进行分类 一、网络类型分类 2. 关键差异对比 1. HDLC(高级数据链路控制协议) 协议特点&…...