zookeeper从入门到精通

一、入门基础

1.1 什么是 ZooKeeper

ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,后成为 Apache 的顶级项目。它为分布式应用提供了高效、可靠的协调服务,例如统一命名服务、配置管理、分布式锁、集群管理等。ZooKeeper 的数据模型类似文件系统,以树形结构存储数据,每个节点称为 Znode,每个 Znode 可以存储数据和子节点。

1.2 安装与启动

  1. 下载 ZooKeeper:从 Apache ZooKeeper 官网(Apache ZooKeeper)下载合适的版本。
  2. 解压文件:将下载的压缩包解压到指定目录,例如/usr/local/zookeeper
  3. 配置文件:在conf目录下,复制zoo_sample.cfgzoo.cfg,并根据需求进行配置。以下是常见且详细的参数配置说明:

properties

# 基本时间单元,以毫秒为单位
# 用于心跳检测,同时也是会话超时时间的基本衡量单位,默认2000毫秒
tickTime=2000  # 数据存储目录,用于存放内存数据库快照以及事务日志等数据
dataDir=/var/lib/zookeeper  # 事务日志目录,若未设置,默认使用 dataDir 目录
# 分离事务日志和快照数据存储,有助于提高I/O性能
# dataLogDir=/var/lib/zookeeper/logs  # 客户端连接端口,客户端通过此端口与ZooKeeper服务器建立连接
clientPort=2181  # 最大客户端连接数,0表示不限制,建议根据服务器资源设置合理值
# 例如,设置为100,表示最多允许100个客户端同时连接
maxClientCnxns=100  # 服务器之间通信的端口,用于数据同步和选举等
# 每个节点都需要通过此端口与其他节点进行通信
initLimit=5  # 这个参数指定了在leader和follower之间进行心跳检测时,
# follower可以滞后leader的最大tickTime数量。
# 例如,如果 syncLimit 设置为 2,tickTime 为 2000 毫秒,
# 那么 follower 与 leader 之间的时间差超过 4000 毫秒,follower 可能会被认为是“失联”状态
syncLimit=2  # 集群中服务器的配置,格式为 server.id=host:port:port
# 第一个port(2888)用于节点间通信,ZooKeeper 集群中的节点通过这个端口进行数据同步、
# 状态信息交换以及日常的心跳检测等操作。例如,Leader 节点会通过此端口将事务日志同步给 Follower 节点,
# 确保集群中各个节点的数据一致性。
# 第二个port(3888)用于选举。当集群中需要进行 Leader 选举时,各个节点会通过这个端口
# 交换选举相关的信息,如节点的 ID、ZXID(事务 ID)等,从而确定新的 Leader 节点。
# 例如,以下配置表示三个节点的集群
server.1=192.168.1.10:2888:3888
server.2=192.168.1.11:2888:3888
server.3=192.168.1.12:2888:3888# 动态配置文件路径,用于配置动态更新集群成员等信息
# autopurge.snapRetainCount 和 autopurge.purgeInterval 两个参数用于自动清理事务日志和快照文件
# autopurge.snapRetainCount 表示保留的快照文件数量,默认保留3个
autopurge.snapRetainCount=3  # autopurge.purgeInterval 表示清理频率,单位为小时,设置为0表示禁用自动清理
# 例如,设置为1,表示每小时清理一次
autopurge.purgeInterval=1  # 用于启用四字命令(如 ruok、stat 等)的白名单,限制可以执行这些命令的IP地址
# 例如,设置为 192.168.1.0/24,表示允许 192.168.1.0 网段内的IP访问四字命令
4lw.commands.whitelist=ruok,stat,......# 配置观察者(Observer)节点,格式与 server 类似,但端口号使用不同规则
# observer 不参与选举,仅用于提高读性能,适合读多写少的场景
# server.4=192.168.1.13:2888:3888:observer# 用于配置是否允许客户端连接到未完成初始化的服务器
# 默认值为 yes,设置为 no 时,客户端只能连接到已完全初始化的服务器
allowServingUnstableInternals=true# ZooKeeper 服务器可以配置为在启动时等待特定的条件,
# 例如等待网络稳定或其他依赖服务启动。这个参数用于指定等待策略的实现类
# waitingForSafeStartup=org.apache.zookeeper.server.quorum.WaitForAllServersSafeStartup# 启用 SSL 连接,配置相关的 SSL 上下文工厂类等参数
# ssl.keyStore.location=/path/to/keystore
# ssl.keyStore.password=password
# ssl.trustStore.location=/path/to/truststore
# ssl.trustStore.password=password
# ssl.clientAuth=need

  1. 启动 ZooKeeper:在bin目录下执行zkServer.sh start启动 ZooKeeper 服务,执行zkServer.sh status查看服务状态。

1.3 基本概念

  1. Znode:ZooKeeper 数据模型的节点,有四种类型:
    • 持久节点(PERSISTENT):节点创建后一直存在,直到主动删除。
    • 持久顺序节点(PERSISTENT_SEQUENTIAL):在持久节点的基础上,节点名称后会追加一个单调递增的序号。
    • 临时节点(EPHEMERAL):客户端会话结束时,节点自动删除。
    • 临时顺序节点(EPHEMERAL_SEQUENTIAL):结合临时节点和顺序节点的特性。
  2. 会话(Session):客户端与 ZooKeeper 服务器建立的连接。会话有超时时间,通过心跳机制保持连接。
  3. Watcher(监听器):客户端可以在读取数据时设置 Watcher,当数据或子节点变化时,ZooKeeper 会通知客户端。

二、进阶应用

2.1 统一命名服务

在分布式系统中,不同的服务实例需要一个唯一的标识。ZooKeeper 可以通过创建顺序节点来实现统一命名服务。例如,一个分布式文件系统,每个文件块可以在 ZooKeeper 上创建一个顺序节点,节点名称作为文件块的唯一标识。

2.2 配置管理

将应用的配置信息存储在 ZooKeeper 的 Znode 上。当配置发生变化时,ZooKeeper 通过 Watcher 通知所有监听该 Znode 的客户端,客户端重新读取配置信息。这样可以实现集中式的配置管理,避免在每个应用实例上手动修改配置。

2.3 分布式锁

  1. 排他锁:利用 ZooKeeper 的临时节点和 Watcher 机制实现。客户端尝试创建一个临时节点,如果创建成功,则获取到锁;如果创建失败,说明锁已被其他客户端获取,客户端通过 Watcher 监听该节点的删除事件,当锁释放时,重新尝试获取锁。
  2. 共享锁:可以通过创建临时顺序节点实现。客户端创建一个临时顺序节点,获取所有子节点列表,判断自己的节点序号是否最小。如果是最小,则获取到共享锁;否则,监听前一个节点的删除事件,当轮到自己时获取锁。

2.4 集群管理

  1. 选举 Leader:在 ZooKeeper 集群中,通过 ZAB(ZooKeeper Atomic Broadcast)协议进行 Leader 选举。每个节点在启动时都会参与选举,通过比较节点 ID、ZXID(事务 ID)等信息,选出一个节点作为 Leader,其他节点作为 Follower。
  2. 节点动态上下线:利用临时节点实现。当一个服务节点启动时,在 ZooKeeper 上创建一个临时节点,其他节点通过监听该节点的变化来感知新节点的加入;当服务节点关闭时,临时节点自动删除,其他节点可以感知到节点下线。

三、高级特性与优化

3.1 读写性能优化

  1. 读性能优化:ZooKeeper 的读操作可以在 Follower 节点上执行,通过配置合理的 Follower 数量,可以提高读性能。同时,可以启用本地缓存,减少对 ZooKeeper 服务器的读请求。
  2. 写性能优化:ZooKeeper 的写操作需要 Leader 节点进行广播,通过合理配置 tickTime、syncLimit 等参数,可以优化写性能。此外,批量操作可以减少网络开销,提高写性能。

3.2 高可用性与容错

  1. 集群搭建:为了提高 ZooKeeper 的可用性,需要搭建多节点集群。一般建议集群节点数量为奇数个,因为在选举 Leader 时,需要超过半数的节点同意才能选出 Leader。例如,3 个节点的集群可以容忍 1 个节点故障,5 个节点的集群可以容忍 2 个节点故障。
  2. 故障恢复:当 ZooKeeper 集群中的节点发生故障时,集群会自动进行 Leader 选举,重新恢复服务。Follower 节点在故障恢复后,会从 Leader 节点同步数据,保证数据的一致性。

3.3 安全机制

  1. 身份认证:ZooKeeper 支持多种身份认证方式,如 Digest、SASL 等。Digest 认证通过用户名和密码进行认证,SASL 认证支持更强大的安全机制,如 Kerberos 认证。
  2. 访问控制:通过 ACL(Access Control List)来控制对 Znode 的访问。ACL 可以设置不同用户或用户组对 Znode 的读、写、创建、删除等权限。

四、ZooKeeper 集群部署方式

4.1 伪集群部署(适用于开发与测试环境)

  1. 准备工作:确保服务器上安装了 Java 环境,且有足够的可用端口。
  2. 复制配置文件:在解压后的 ZooKeeper 目录下,复制zoo.cfg为多个不同的配置文件,例如zoo1.cfgzoo2.cfgzoo3.cfg
  3. 修改配置文件
    • dataDir:为每个配置文件指定不同的数据目录,如dataDir=/var/lib/zookeeper1dataDir=/var/lib/zookeeper2dataDir=/var/lib/zookeeper3
    • clientPort:指定不同的客户端连接端口,如clientPort=2181clientPort=2182clientPort=2183
    • 添加集群配置:在每个配置文件中添加以下内容,指定集群中的其他节点:

properties

server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

这里server.X中的X为节点编号,127.0.0.1是服务器 IP 地址,2888等第一个端口用于节点间通信,3888等第二个端口用于选举。
4. 创建 myid 文件:在每个dataDir指定的目录下,创建一个名为myid的文件,并在文件中写入对应的节点编号(如在/var/lib/zookeeper1目录下的myid文件中写入1)。
5. 启动节点:分别使用不同的配置文件启动每个 ZooKeeper 节点,例如:

zkServer.sh start zoo1.cfg
zkServer.sh start zoo2.cfg
zkServer.sh start zoo3.cfg

4.2 真实集群部署(适用于生产环境)

  1. 规划服务器:确定集群节点数量,建议为奇数个,如 3 个或 5 个。准备相应数量的服务器,确保它们之间网络畅通,且安装了 Java 环境。
  2. 配置文件:在每台服务器的 ZooKeeper 目录下的conf目录中,修改zoo.cfg文件。
    • dataDir:设置数据存储目录,如dataDir=/var/lib/zookeeper
    • clientPort:设置客户端连接端口,通常保持默认的 2181。
    • 添加集群配置:根据集群中的节点信息,添加如下配置。例如,对于一个 3 节点的集群,节点 1 的 IP 为192.168.1.10,节点 2 的 IP 为192.168.1.11,节点 3 的 IP 为192.168.1.12,则在每个节点的zoo.cfg中添加:

properties

server.1=192.168.1.10:2888:3888
server.2=192.168.1.11:2888:3888
server.3=192.168.1.12:2888:3888

  1. 创建 myid 文件:在每台服务器的dataDir目录下,创建myid文件,并写入对应的节点编号(如在节点 1 的/var/lib/zookeeper目录下的myid文件中写入1)。
  2. 启动集群:在每台服务器上,使用zkServer.sh start命令启动 ZooKeeper 服务。启动后,可以通过zkServer.sh status命令查看每个节点的角色(Leader 或 Follower)。

五、实践案例

5.1 分布式任务调度

假设有一个分布式任务调度系统,需要在多个节点上分配任务并监控任务执行状态。可以利用 ZooKeeper 的临时节点和 Watcher 机制实现:

  1. 任务分配:任务调度中心在 ZooKeeper 上创建一个持久节点作为任务根节点,每个任务在根节点下创建一个持久顺序节点。工作节点启动时,在任务根节点下创建一个临时节点,通过获取任务根节点下的子节点列表,判断自己是否有任务需要执行。
  2. 任务监控:工作节点在执行任务时,更新任务节点的状态信息。任务调度中心通过监听任务节点的变化,实时监控任务执行状态。

5.2 分布式缓存一致性

在分布式缓存系统中,需要保证缓存数据的一致性。可以利用 ZooKeeper 的配置管理和 Watcher 机制实现:

  1. 缓存配置管理:将缓存的配置信息(如缓存过期时间、缓存大小等)存储在 ZooKeeper 的 Znode 上。缓存节点启动时,读取配置信息并应用。
  2. 缓存数据更新:当缓存数据发生变化时,更新 ZooKeeper 上的 Znode。其他缓存节点通过监听该 Znode 的变化,同步更新本地缓存数据,保证缓存一致性。

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

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

相关文章

Windows CMD 命令大全(Complete List of Windows CMD Commands)

Windows CMD 命令大全: Windows CMD 是 Windows 系统内置的命令行工具,用于执行各种命令和管理任务。 称为Command Prompt。它提供了一个通过键入命令来与计算机系统进行交互的方式,类似于早期的DOS操作系统。以下是 CMD 的基础知识和常用命…

hot100-二叉树

二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…

【JavaWeb13】了解ES6的核心特性,对于提高JavaScript编程效率有哪些潜在影响?

文章目录 &#x1f30d;一. ES6 新特性❄️1. ES6 基本介绍❄️2. 基本使用2.1 let 声明变量2.2 const 声明常量/只读变量2.3 解构赋值2.4 模板字符串2.5 对象拓展运算符2.6 箭头函数 &#x1f30d;二. Promise❄️1. 基本使用❄️2. 如何解决回调地狱问题2.1回调地狱问题2.2 使…

ROS的action通信——实现阶乘运算(三)

在ROS中除了常见的话题(topic&#xff09;通信、服务(server)通信等方式&#xff0c;还有action通信这一方式&#xff0c;由于可以实时反馈任务完成情况&#xff0c;该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享&#xff0c;实现基于action通信的阶乘运…

centos系统MBR格式转换成gpt格式 (华为云)

在华为云上的centos7.9系统MBR格式转换成GPT格式的步骤 华为云上关于转换的步骤 这个链接里面 gdisk -g /dev/vda 是不对的&#xff0c;-g参数是新创建一个分区&#xff0c;慎用 自己步骤如下&#xff1a;&#xff08;已经试验过&#xff09; 1、gdisk /dev/sda (这里是盘 不…

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜…

uni-app 开发 App 、 H5 横屏签名(基于lime-signature)

所用插件&#xff1a;lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素&#xff08;相对定位、绝对定位、粘性定位&#xff09; 代码# <template><view class"signature-page"><view clas…

【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制

线程互斥与同步&#xff08;上&#xff09;&#xff1a;【Linux探索学习】第三十弹——线程互斥与同步&#xff08;上&#xff09;&#xff1a;深入理解线程保证安全的机制-CSDN博客 Linux探索学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?…

《Effective Objective-C》阅读笔记(中)

目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 ​编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…

python-leetcode-每日温度

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n len(temperatures)answer [0] * nstack [] # 存储索引for i, temp in enumerate(temperatures):while stack and temperat…

山东大学软件学院nosql实验三

实验题目&#xff1a; 用Java做简单查询(2学时) 实验内容 用API方式&#xff0c;做简单查询。 实验要求 在以下要求中选择至少2个&#xff0c;使用Java语言实现数据查询&#xff0c;最终把数据输出到前端界面。 &#xff08;1&#xff09;找出年龄小于20岁的所有学生 &…

【Linux】初探信号的奥秘

目录 一、引入信号&#xff1a; 1、什么是信号&#xff1a; 二、前后台进程&#xff1a; 三、信号的处理方式&#xff1a; 四、键盘数据与信号&#xff1a; 前言&#xff1a; 在Linux系统编程中&#xff0c;信号&#xff08;Signal&#xff09;是一种至关重要的进程间通信…

Bugku CTF CRYPTO

Bugku CTF CRYPTO 文章目录 Bugku CTF CRYPTO聪明的小羊ok[-<>]散乱的密文.!? 聪明的小羊 描 述: 一只小羊翻过了2个栅栏 fa{fe13f590lg6d46d0d0} 分 析&#xff1a;栅栏密码&#xff0c;分2栏&#xff0c;一个栏里有11个 ①手动解密 f a { f e 1 3 f 5 9 0 l g 6 d 4 …

数据库的基本操作

目录 一、查看所有的数据库&#xff1a; 二、创建数据库&#xff1a; if not exists : 字符编码集&#xff1a; 排序规则&#xff1a; 三、查看创建的库&#xff1a; 四、修改数据库&#xff1a; 五、删除数据库&#xff1a; if exists&#xff1a; 前言&#xff1a; 在…

IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题

文章目录 引言一、安装Proxy AI1.1 在线安装Proxy AI1.2 离线安装Proxy AI 二、Proxy AI中配置DeepSeek2.1 配置本地部署的DeepSeek&#xff08;Ollama方式&#xff09;2.2 通过第三方服务商提供的API进行配置 三、效果测试 引言 许多开发者尝试通过安装Proxy AI等插件将AI能力…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下&#xff0c;5G 通信技术的普及、云计算能力…

【时时三省】(C语言基础)常量和变量

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 在计算机高级语言中&#xff0c;数据有两种表现形式&#xff1a;常量和变量。 常量 在程序运行过程中&#xff0c;其值不能被改变的量称为常量。数值常量就是数学中的常数。 常用的常量有以…

zabbix故障案例 WEB页面Database error Connection refused

目录 1.思路 2.问题解决 3.其他数据库问题思路 1.思路 当我们遇到 Database error Connection refused的问题的时候一般想到的都是数据库的问题 那我们这时候就顺着这条线索排查 2.问题解决 我们首先先进入数据库 mysql -uzabbix -p123 发现了如下报错 应该是数…

MaxKB+Ollama+DeepSeek1.5B部署知识库

环境信息 练习测试用&#xff0c;所以资源很低&#xff0c;8G显卡。大模型部署在Windows台式机上&#xff0c;MaxKB部署在CentOS虚拟机上。 台式机&#xff1a; 硬件&#xff1a;i7 13900 NV GeForce RTX 3060 Ti 8G显存 32G内存 软件&#xff1a;Windows 11操作系统&…

猿大师播放器:智慧交通Web网页低延迟播放监控RTSP H.265视频解决方案

在智慧城市建设加速推进的今天&#xff0c;智慧交通作为城市"神经系统"正面临前所未有的发展机遇。据统计&#xff0c;2023年全国交通视频监控设备保有量已突破4500万台&#xff0c;日均产生的视频数据量超50PB。但在这些庞大数字背后&#xff0c;行业却普遍面临着&q…