Skip to main content

Command Palette

Search for a command to run...

什么是ZooKeeper

Updated
•1 min read•View as Markdown
  • ZooKeeper就是这样一个分布式大家庭的管理员

  • 你问到了点子上!ZooKeeper 这个名字起得非常有意思,它直译过来就是“动物园管理员”。

为什么叫这个名字?因为在大数据和分布式系统中,我们有各种各样的软件图标是动物(Hadoop 是大象,Hive 是蜜蜂,Pig 是猪,Tomcat 是猫)。管理这群“珍禽异兽”非常头疼,所以需要一个管理员来驯服它们。

简单来说,ZooKeeper 是分布式系统的“大管家”或“协调员”。


1. 为什么需要它?(分布式系统的混乱)

接着刚才 RPC 的例子。假设你的物理模拟项目越做越大,你现在有 100 台服务器(Server)组成了一个集群。

这时候噩梦来了:

  • 谁活着? 既然是机器,总会坏。你怎么知道哪台机器挂了?哪台刚上线?

  • 谁是老大? 这一百台机器里,谁负责分配任务(Master),谁负责干活(Slave)?如果老大挂了,剩下的99个谁来接班?

  • 配置文件改了怎么办? 你想把一个参数从 10 改成 20,难道要一台台登录 100 台机器去改文件吗?

这就是分布式协调的难题。ZooKeeper 就是为了解决这些破事而生的。


2. ZooKeeper 到底在干什么?(三个通俗场景)

你可以把 ZooKeeper 想象成一个挂在公司大厅的超大实时白板,所有员工(服务器)都要盯着它看,并且可以在上面写字。

场景一:花名册(服务注册与发现)

  • 没有 ZK:客户端想调用服务,得把 IP 地址写死在代码里。如果有服务器挂了或者换了 IP,代码就崩了。

  • 有 ZK:

    1. 每台服务器启动时,去 ZK 这个“白板”上写下自己的名字和 IP:“我是 3 号机,IP 是 192.168.1.3,我在线”。

    2. 客户端要调用时,先问 ZK:“现在谁活着?”

    3. ZK 说:“3 号机活着,你去找它吧。”

    4. 最妙的是:如果 3 号机断电了,它在 ZK 上的名字会自动消失(因为它们之间有心跳检测)。客户端立刻就能知道 3 号机不在了。

场景二:选班长(Leader 选举)

  • 背景:为了防止混乱,集群里通常只能有一个“老大”负责写数据,其他人只能读。

  • 有 ZK:

    1. 老大突然挂了。

    2. 剩下的 99 台小弟检测到老大在 ZK 上的标记消失了。

    3. 大家蜂拥而上去 ZK 上抢着写“我是老大”。

    4. ZK 保证只有一个人能写成功。

    5. 写成功的那个瞬间变成新老大,其他人继续当小弟。这就避免了“国不可一日无君”,也避免了“两个老大打架”。

场景三:大喇叭(配置中心)

  • 背景:你要修改一个物理常数配置。

  • 有 ZK:

    1. 你只需要修改 ZK 上面的一行数据。

    2. ZK 会利用“监听机制”(Watcher),瞬间通知那 100 台服务器:“喂!配置变了!快更新!”

    3. 100 台服务器收到通知,自动同步新配置。

    4. 一次修改,全员同步。


3. ZooKeeper 的数据长什么样?

虽然它是“管理员”,但它存储数据的方式非常简单,就像电脑的文件系统目录:

/
├── /configs           (存放配置文件)
│    └── app_config
├── /workers           (存放现在活着的机器列表)
│    ├── server_1
│    ├── server_2
│    └── server_3
└── /election          (存放谁是老大的信息)

每个节点(比如 /server_1)都可以存一点点数据。服务器们就是通过创建节点、删除节点、监听节点变化这三个动作,完成了复杂的配合。


总结

如果说:

  • ProtoBuf 是普通话(统一的数据格式)。

  • RPC 是电话(远程通话的工具)。

  • ZooKeeper 就是通讯录 + 居委会大妈。

它负责:

  1. 记账(谁在哪,谁活着)。

  2. 调解(谁当老大,谁排队)。

  3. 通知(配置改了,大家注意)。

在微服务架构或者大数据组件(如 Kafka, Hadoop, HBase)中,ZooKeeper 几乎是标配的幕后英雄。虽然你写业务代码时不一定直接操作它,但它保证了整个系统的稳定运行。

这样把这三者串起来,是不是对这套技术栈有个整体画面了?

More from this blog

Redis学习

1.什么是SSD HDD作为存储传统的数据库? SSD:固态硬盘---使用闪存芯片存储数据 无机械部件 特点:读写速度快(尤其是随机读写)、延迟低、抗震性好,但单位容量成本较高。 HDD:机械硬盘--传统机械硬盘 特点:容量大、成本低,但读写速度较慢(尤其是随机读写),延迟高。 2.什么是非易失性持久化 非易失性持久化 = 靠谱的硬件 (断电不丢数据的 SSD/PMEM) + 严谨的软件策略 (确

Mar 4, 20261 min read

分布式存储系统面试问题解析

共识算法剖析 raft共识算法 1.在你的 C++ 实现中,如果 Leader 发送 AppendEntries 给 Follower,但 Follower 的日志落后太多(比如中间缺了 100 条),Raft 论文建议是一个一个往前找(nextIndex--)。这种做法在高性能存储中显然是不可接受的,你会如何优化这个“回溯”过程? 在工程实现中,我会从两个维度优化日志冲突后的同步效率: 1. 快

Feb 9, 202613 min read

Unix环境编程:杂谈

动态加载 API 进程管理 什么是进程 进程的创建 进程的终止与遗言函数 进程资源回收 进程的映像更新 ps -o pid,ppid,pgrp,comm 这个linux命令是将当前终端上运行的进程打印出来 进程中使用环境变量 子进程环境变量改变 不会更改父进程的环境变量 进程间通信 有名管道不存储数据 其本身大小为 0 当一个进程写入数据进去时 如果没有进程读取数据那么该写进程就会堵塞在哪里 同理 如果读进程想要读取数据 但是却没有数据...

Jan 30, 20263 min read

Unix环境编程:第一章

1.1操作系统的介绍 1.2 计算机系统的分层 1.3 编译过程 ?上一个命令的运行结果 echo 就是输出上一个命令的运行结果 哎linux环境下文件中查找一个元素 即在命令模式下 输入/+你要查找的字符 即/printf 这样 然后找到之后 n表示查找下一条 shift+n表示上一条 file+文件名 查=查看文件是否可运行 1.4 多模块开发 变量的定义是为变量扩充作用域 而变量的声明需要为变量内存空间 gcc -c 文件 检验是否存在语法错误 nm 目标文...

Jan 30, 20261 min read

C++ Stl杂项

迭代器特性 输入流的容器特性 迭代器对算法的影响 仿函数和函数对象 分配器 对于平常的我们内存的使用,直接使用new delete 即可 使用分配器的话还需要记住自己当时申请了多少的内存 很不方便 哈希表深度探索 哈希容器 哈希表在扩充时,会先将自身大小乘以2 然后在选择自身2倍距离最近的一个质数 作为新的大小 哈希函数 以哈希表为底层支撑的适配器 红黑树 容器 list容器 forward_list 对于标准库,其本身提供一个sort排序函数,但某些容器也提供sort服务...

Jan 29, 20261 min read

xianyu-sheng

29 posts