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 次),就会将内存数据库序列化一次,使其持久化保存到磁盘上。序列化后的文件称为“快照文件”。每次生成快照后,都会创建新的事务日志文件。


  1. 日志计数:事务日志计数器从0开始累加

  2. 触发阈值:当计数器达到snapCount=100,000时暂停新事务写入

  3. 序列化快照:内存数据库内容被序列化,生成快照文件

  4. 日志重置:创建新事务日志文件(旧日志归档,新日志从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
Server1192.168.80.11
Server2192.168.80.22
Server3192.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 /applhello,zookeeper
set修改节点数据set /appl "new_data"
delete删除无子节点的节点delete /appl
deleteall递归删除节点及其子节点deleteall /appl
stat查看节点元数据stat /zookeeper
version查看客户端版本version3.6.2...
TAB键列出所有支持命令输入后显示命令列表

3.节点类型特性

类型创建方式关键特性
持久节点create /path会话结束仍存在,支持创建子节点(需逐级创建)
临时节点create -e /path会话结束自动删除,不支持创建子节点

4.写入和读取

在test1下的config中写入或读取数据,所以Zookeeper中的文件可以理解为文件或文件夹,是通用的,既能存放数据又能当文件夹。

注意临时节点无法创建子目录:

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

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

相关文章

简单聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件总结 根据ICANN规则&#xff0c;域名注册商&#xff08;Verisign&#xff09;认定aliyuncs.com域名下的部分网站被用于非法活动&#xff08;如传播恶意软件&#xff09;&#xff1b;顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…

服务器出现故障怎么办?快速排查与解决方法

服务器故障的常见原因分析 硬件故障&#xff1a;内存、硬盘、网络设备故障。 软件故障&#xff1a;操作系统、应用程序、数据库异常。 网络攻击&#xff08;如DDoS攻击&#xff09;造成资源耗尽。 快速排查故障的步骤 检查监控系统报警日志。 查看系统资源使用情况&#x…

Claude vs ChatGPT vs Gemini:功能对比、使用体验、适合人群

随着AI应用全面进入生产力场景&#xff0c;市面上的主流AI对话工具也进入“三国杀”时代&#xff1a; Claude&#xff08;Anthropic&#xff09;&#xff1a;新锐崛起&#xff0c;语言逻辑惊艳&#xff0c;Opus 模型被称为 GPT-4 杀手ChatGPT&#xff08;OpenAI&#xff09;&a…

Git 使用大全:从入门到精通

Git 是目前最流行的分布式版本控制系统&#xff0c;被广泛应用于软件开发中。本文将全面介绍 Git 的各种功能和使用方法&#xff0c;包含大量代码示例和实践建议。 文章目录 Git 基础概念版本控制系统Git 的特点Git 的三个区域Git 文件状态 Git 安装与配置安装 GitLinuxmacOSWi…

SpringBoot 框架第 1 次接口调用慢

文章目录 背景分析思路 1:DeepSeek 分析思路 2:日志分析思路 3:Arthas 分析下载 Arthas启动 Arthastrace 调用耗时分析Controller 调用耗时Service 调用分析ServiceImpl 耗时分析IService 耗时分析BaseMapper 耗时分析debug 执行链路MyBatisMapperProxy 解读解决思路 1:预热…

数据分析Agent构建

数据分析agent构建 代码资料来源于 Streamline-Analyst&#xff0c;旨在通过该仓库上的代码了解如何使用大语言模型构建数据分析工具&#xff1b; 个人仓库&#xff1a;Data-Analysis-Agent-Tutorial 不同的在于 Data-Analysis-Agent-Tutorial 是在 Streamline-Analyst 基础…

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …

Python爬虫(三):BeautifulSoup库

1. BeautifulSoup是什么&#xff1f; BeautifulSoup 是一个 Python 库&#xff0c;专门用来解析 HTML 或 XML 文件&#xff0c;方便我们提取数据。它能把网页源代码转换成树形结构&#xff0c;让我们可以轻松查找、修改内容&#xff0c;并自动处理编码问题&#xff08;如 Unic…

AI电销机器人智能的发展趋势是什么?

AI电销机器人智能的发展趋势是什么&#xff1f;电销机器人智能的发展前景怎么样&#xff1f;随着互联网技术的不断发展&#xff0c;AI电销机器人智能已经成为了许多企业实现销售数字化转型的重要工具&#xff0c;我们一起来看看。 AI电销机器人正突破传统语音机械应答的边界&a…

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…

Mac M芯片 RAG 极简流程 安装 ragflow + LM studio

本文基于 【【知识科普】【纯本地化搭建】【不本地也行】DeepSeek RAGFlow 构建个人知识库】 https://www.bilibili.com/video/BV1WiP2ezE5a/?share_sourcecopy_web&vd_source9a55f12dd64d8e30ab6c0efc62844343 1 .docker-compose yml文件修改,指定平台 platform: linux/…

Rsync+inotify+nfs实现数据实时备份方案

技术栈 NFS是 Network File System的简写&#xff0c;即网络文件系统。NFS的优点是内核直接支持&#xff0c;部署简单、运行稳定&#xff0c;协议简单、传输效率高。缺点是仅依靠IP地址或主机名来决定用户能否挂载共享目录&#xff0c;容易出现单点故障。 rsync是linux系统下的…

Vue ⑥-路由

单页应用程序 单页应用程序&#xff0c;即 Single-Page Application&#xff0c;简称 SPA&#xff0c;是一种使用 JavaScript、HTML 和 CSS 构建的 Web 应用程序。SPA 的核心是前端路由&#xff0c;它使得用户在访问网站时&#xff0c;只需加载一次页面&#xff0c;然后通过前…

Hadoop复习(九)

Azkaban工作流管理器 选择 问题 1 判断题 2 / 2 分 工作流是指具有依赖的一组job任务&#xff0c;被依赖的job任务最后执行 正确 错误 问题 2 判断题 2 / 2 分 Azkaban兼容任何版本的Hadoop 正确 错误 问题 3 判断题 2 / 2 分 独立服务器模式下&#xff0c;Azkab…

SpringMVC相关知识(二)

一.重定向和转发 1.ModelandView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 页面 : {视图解析器前缀} viewName {视图解析器后缀} 相关代码&#xff1a; <!-- 视图解析器 --> <bean class"org.springframework.web.servlet.vi…

std::ratio 简单使用举例

author: hjjdebug date: 2025年 06月 09日 星期一 14:28:40 CST descrip: std::ratio 简单使用举例 文章目录 1. 先看一个简单的例子 1/2/1/35/62 std::ratio 的手册页3. std::ratio_add 到底是什么呢&#xff1f;4. 代码注释5. 加深理解.6. 自定义的std::ratio 与 std::ratio_…

Docker 优势与缺点全面解析:容器技术的利与弊

在当今云计算、微服务、DevOps盛行的时代&#xff0c;Docker 几乎成了开发者、运维工程师的标配工具之一。自2013年诞生以来&#xff0c;Docker 以其轻量、快速、易移植的特点&#xff0c;彻底改变了应用的构建、交付与部署方式。 但任何技术都有两面性&#xff0c;Docker 也不…