Apache Druid 中的 ZooKeeper 集群状态管理:路径协议、领导者选举与 Segment 发布机制
数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载Apache Druid 使用 Apache ZooKeeper简称 ZK来管理集群的当前状态current cluster state包括 Coordinator/Overlord 的领导者选举、Historical 节点的 Segment 发布协议以及 Overlord 与 MiddleManager 之间的任务管理。本文基于 docs/design/zookeeper.md 展开并结合仓库源码如 ZkPathsConfig.java、CuratorDruidLeaderSelector.java、Announcer.java深入讲解其底层实现帮助你理解 Druid 各服务节点如何通过 ZK 协同工作、如何配置 ZK 路径以及在版本演进中 ZK 相关能力的迁移方向。ZooKeeper 在 Druid 中的角色定位Druid 的分布式架构由 Coordinator、Overlord、Broker、Historical、MiddleManager/Indexer 等角色组成。在这些节点之间ZooKeeper 承担的核心职责是管理集群的当前状态management of current cluster state具体表现为四类关键操作Coordinator 领导者选举leader electionHistorical 节点的 Segment publishing 协议segment 发布/宣告协议Overlord 领导者选举Overlord 与 MiddleManager 之间的任务管理task management。从源码结构看Druid 在server模块下组织了一整套 Curator 工具集来支撑上述能力CuratorModule.java 负责构建 CuratorFramework 客户端Announcer.java 负责向 ZK 发布/撤销临时节点DiscoveryModule.java 负责服务发现与领导者选择器装配。也就是说Druid 并没有直接使用 ZooKeeper 的原生 API而是统一通过 Apache Curator 这一高层客户端来访问 ZK。支持的 ZooKeeper 版本Apache Druid 支持 ZooKeeper3.5.x 及以上版本。有两个重要的版本演进需要特别注意自Apache Druid 0.22.0起移除了对 ZooKeeper 3.4.x 的支持自Apache Druid 31.0.0起移除了基于 Zookeeper 的 segment 加载ZK-based segment loading支持。第二条演进在源码中同样留有痕迹ZkCoordinator.java 的类注释明确标注了Deprecated并说明 Druid has already migrated to HTTP-based segment loading and will soon migrate to HTTP-based inventory view usingSegmentListerResourceZkPathsConfig.java 中的getLiveSegmentsPath()方法也被标记为Deprecated注释建议改用 HTTP-based segment discovery。这意味着新版 Druid 中 segment 的加载与发现正逐步从 ZK 迁移到 HTTP 通道SegmentListerResource但 ZK 在领导者选举与任务管理中的角色仍然保留。ZooKeeper 路径配置druid.zk.paths 系列参数Druid 在 ZK 上使用的一系列路径均可通过配置自定义核心配置类为 ZkPathsConfig.java。该类通过 JacksonJsonProperty绑定druid.zk.paths.*配置项默认以druid作为 base 根路径配置项默认值基于 basedruid用途druid.zk.paths.basedruid所有 ZK 路径的公共根前缀druid.zk.paths.propertiesPathdruid/properties节点属性properties发布路径druid.zk.paths.announcementsPathdruid/announcements服务节点如 Historical存在性宣告路径druid.zk.paths.liveSegmentsPathdruid/segments已废弃Historical 宣告其正在服务的 segment 列表druid.zk.paths.coordinatorPathdruid/coordinatorCoordinator 领导者选举路径druid.zk.paths.connectorPathdruid/connector连接器相关路径druid.zk.paths.overlordPathdruid/overlordOverlord 领导者选举路径druid.zk.paths.internalDiscoveryPathdruid/internal-discovery内部服务发现路径从 ZkPathsConfig.java 可以看到所有默认路径均由defaultPath(subPath)方法生成即ZKPaths.makePath(getBase(), subPath)等价于把 base 与子路径用/拼接。若某个路径显式配置则优先使用显式值否则回退到默认值。在仓库的示例配置中例如 common.runtime.properties典型的 ZK 配置片段如下druid.hostlocalhost druid.zk.service.hostlocalhost druid.zk.paths.base/druid其中druid.zk.paths.base/druid表示所有 ZK 状态路径都挂在/druid之下。druid.host则是每个进程在 ZK 上宣告自身时所使用的节点标识host:port 形式在下文的 segment 发布协议中会看到它的具体作用。ZooKeeper 连接与客户端参数druid.zk.service 系列除了路径Druid 还通过 CuratorConfig.java 绑定druid.zk.service.*配置项来控制 ZK 连接行为源码中CONFIG_PREFIX druid.zk.service配置项默认值说明druid.zk.service.hostlocalhostZK 集群地址如localhost:2181多实例用逗号分隔druid.zk.service.sessionTimeoutMs30000ZK 会话超时时间毫秒druid.zk.service.connectionTimeoutMs15000连接超时时间毫秒与 Curator 默认值一致druid.zk.service.compresstrue是否对 znode 数据启用压缩druid.zk.service.aclfalse是否启用 ZK ACLdruid.zk.service.user无ACL 用户名与authScheme配合druid.zk.service.pwd空密码通过PasswordProvider提供druid.zk.service.authSchemedigestZK 认证方案druid.zk.service.maxZkRetries29连接 ZK 的最大重试次数较小的值有助于节点在 ZK 连接丢失时快速失败其中compresstrue与 Announcer.java 中的curator.create().compressed().withMode(CreateMode.EPHEMERAL)一一对应——Druid 在创建和更新 znode 时都会走压缩通道以减少 ZK 上的数据体积。Coordinator 领导者选举Leader ElectionDruid 使用 Curator 的LeaderLatchrecipe 在以下路径执行 Coordinator 领导者选举${druid.zk.paths.coordinatorPath}/_COORDINATOR在默认配置下该路径为/druid/coordinator/_COORDINATOR。所有 Coordinator 进程在同一 latch 路径上竞争最终只有一个节点成为 leader其余节点处于 standby 状态。源码层面的实现位于 CuratorDruidLeaderSelector.java关键细节如下构造时会以latchPath创建一个LeaderLatch参与者 ID 为self.getServiceScheme() :// self.getHostAndPortToUse()见 第 77 行即每个节点以自己的scheme://host:port作为参与标识只有调用registerListener()并执行leaderLatch.get().start()后节点才真正参与选举见 第 184-185 行在此之前创建的 latch 仅用于查询当前 leader不会参与竞争当选 leader 时触发isLeader()回调内部递增term任期号并调用监听器的becomeLeader()失去 leadership 时触发notLeader()并调用stopBeingLeader()见 第 87-128 行异常情况下如becomeLeader()失败会调用recreateLeaderLatch()重建 latch并在重新参与选举前随机等待 15 秒ThreadLocalRandom.current().nextInt(1000, 5000)见 第 219 行把机会让给其他等待中的节点避免立即重新抢回 leadership 造成抖动。在 DruidCoordinator.java 中Coordinator 通过注册becomeLeader()/stopBeingLeader()监听器来感知自身是否成为 leader并在成为 leader 后执行协调职责如 segment 加载/卸载计划。当 leader 进程崩溃或与 ZK 会话断开时其临时 znode 消失其余节点会通过 LeaderLatch 快速感知并选举出新的 leader从而保证 Coordinator 的高可用。Segment publishing 协议Historical 节点宣告机制Segment 的 publishing发布/宣告协议依赖两个 ZK 路径announcementsPath与liveSegmentsPath。服务存在性宣告announcementsPath所有 Historical 进程都会在announcementsPath上发布自身的存在性具体做法是创建一个临时ephemeralznode${druid.zk.paths.announcementsPath}/${druid.host}默认路径即/druid/announcements/host:port。由于是临时节点Historical 进程一旦宕机或与 ZK 会话过期该 znode 会自动消失其他进程据此判断该节点是否存活。正在服务的 Segment 宣告liveSegmentsPathHistorical 随后还会在liveSegmentsPath下创建一个永久permanentznode${druid.zk.paths.liveSegmentsPath}/${druid.host}默认路径即/druid/segments/host:port。随着该节点陆续加载 segment它会在自己名下挂载形如以下的临时 znode${druid.zk.paths.liveSegmentsPath}/${druid.host}/_segment_identifier_即/druid/segments/host:port/segment_identifier每个 znode 对应一个正在被该节点服务的 segment。segment 被卸载或节点下线时对应临时节点随之消失。Coordinator 和 Broker 等进程可以 watch监听这些路径从而实时获知哪个进程当前正在服务哪些 segment据此进行负载均衡决策与查询路由。底层实现与故障自愈上述协议在代码中由两套机制配合完成Announcer.java 是宣告的核心组件。announce()在指定路径创建临时节点CreateMode.EPHEMERAL见 第 370 行并利用PathChildrenCache对父路径建立监听该缓存监听器实现了故障自愈逻辑见 第 234-290 行当子节点被意外删除CHILD_REMOVED时会自动重建宣告当发生CONNECTION_LOST时会记录所有待恢复路径当CONNECTION_RECONNECTED时逐一重新创建丢失的宣告。这保证了即使 ZK 连接短暂中断Druid 的宣告信息也能在会话恢复后自动复原而不是永久丢失。另外Announcer在创建宣告时若父路径不存在会先创建父路径creatingParentsIfNeeded()见 第 423 行并在 stop 时尝试清理自己创建的父路径。关于 liveSegmentsPath 的废弃说明需要再次强调随着 Druid 迁移到 HTTP-based segment loadingliveSegmentsPathgetLiveSegmentsPath()已在 ZkPathsConfig.java 中被标记为Deprecated源码注释明确说明 Use HTTP-based segment discovery instead对应的 ZkCoordinator.java 整个类也已废弃。在新版本中segment 的加载与 inventory 视图改由 HTTP 通道SegmentListerResource承担ZkCoordinator.java 中的isSkipSegmentAnnouncementOnZk配置也印证了这一点——当跳过 ZK segment 宣告开启时节点将不再在 ZK 上创建 live segments 路径。Overlord 领导者选举与任务管理与 Coordinator 类似Overlord 也通过 LeaderLatch 在overlordPath上执行领导者选举。虽然 ZkPathsConfig.java 中的getOverlordPath()未提供显式配置入口直接返回默认的druid/overlord但可以在druid.zk.paths.base层面统一调整其前缀。Overlord 与 MiddleManager 之间的任务管理task management同样依赖 ZKOverlord 把任务分发/状态信息通过 ZK 与 MiddleManager 协调MiddleManager 及其管理的 Peon 进程通过 ZK 路径宣告自己的状态并接收任务分配。在较新版本中任务管理相关的交互如任务分派状态也逐步引入了 HTTP 通道但 ZK 仍然承担着重要的协调职责。实际部署中的 ZK 配置建议在真实集群部署时请参照仓库中的 common.runtime.properties 统一配置各节点的 ZK 参数。核心要点如下统一 base 路径druid.zk.paths.base必须在所有节点上保持一致如/druid否则不同节点会各自读写不同的 ZK 子树导致彼此不可见ZK 地址集群化druid.zk.service.host应配置为完整的 ZK ensemble 地址列表逗号分隔例如zk1:2181,zk2:2181,zk3:2181服务标识唯一每个进程的druid.host必须全局唯一host:port因为它是 ZK 上宣告节点的直接标识重复会导致宣告冲突考虑 ACL 与压缩多租户或安全敏感环境可开启druid.zk.service.acltrue并配合user/pwd/authScheme数据量较大时保持compresstrue以降低 ZK 存储与传输开销版本约束确保部署的 ZooKeeper 为 3.5.x 及以上版本且不要依赖 ZK-based segment loading 的旧行为Druid 31.0.0 起已移除。小结ZooKeeper 在 Apache Druid 中承担着集群状态管理的中枢角色Coordinator 与 Overlord 通过 Curator LeaderLatch 在coordinatorPath、overlordPath上完成领导者选举保证管理节点的高可用Historical 通过announcementsPath宣告存在性、通过liveSegmentsPath宣告正在服务的 segment 列表供 Coordinator 与 Broker 实时感知Overlord 与 MiddleManager 则借助 ZK 完成任务的分发与管理。理解这些 ZK 路径协议与配置项druid.zk.paths.*、druid.zk.service.*是排查 Druid 集群协调问题、规划多集群隔离与安全加固的基础。同时也要注意到 Druid 正在将 segment 发现与加载逐步从 ZK 迁移到 HTTP 通道SegmentListerResource部署新版本时应以 HTTP-based segment loading 为准。赞分享数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载相关推荐CVAT 多语言支持配置Django gettext、i18next 与文档站点 i18n 完整指南CVAT 多语言支持配置Django gettext、i18next 与文档站点 i18n 完整指南 CVATComputer Vision Annotat数据库OLAP大数据后端Apache Hadoop分布式协调服务Zookeeper选举与配置管理Apache Hadoop分布式协调服务Zookeeper选举与配置管理 引言分布式系统的大脑——Zookeeper在Hadoop中的关键作用 在分布式大数据分布式文件系统批处理任务调度集群管理网页视频难保存猫抓 cat-catch 浏览器资源嗅探扩展使用指南网页视频难保存猫抓 cat catch 浏览器资源嗅探扩展使用指南 猫抓cat catch是一款免费开源的 浏览器资源嗅探扩展 打开任意网页时它会自动音视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Node.js跨平台端口占用检测与终止工具开发实践

Node.js跨平台端口占用检测与终止工具开发实践

1. 项目背景与痛点解析作为一名全栈开发者,我每天至少要重启本地开发服务十几次。每次遇到"端口已被占用"的报错时,都要重复执行以下操作:打开终端输入lsof -i :3000查进程ID复制PID再执行kill -9 [PID]有时还要用ps aux | grep no…

2026/9/25 1:54:05 阅读更多 →
OpenSpec 使用教程:规格即源码的协作框架与校验实践

OpenSpec 使用教程:规格即源码的协作框架与校验实践

1. 从“规格散落各处”说起:OpenSpec 到底想解决什么问题如果你参与过稍微有点规模的软件项目,大概率经历过这样的场景:需求文档在飞书里、接口定义在 Swagger 里、数据库字段说明在某个人的脑子里、测试用例又躺在另一个仓库的 Markdown 文件…

2026/9/25 7:16:14 阅读更多 →
Anaconda安装与配置实战:conda命令消失、环境隔离与镜像源

Anaconda安装与配置实战:conda命令消失、环境隔离与镜像源

简介:这是一份面向数据科学与机器学习初学者的Anaconda安装与配置指南,致力于解决下载速度慢、安装选项不清晰、环境变量配置易错等常见问题,帮助读者快速搭建可用的Python数据科学环境。资源为1个docx格式文档,压缩包仅9KB&#…

2026/9/25 7:52:40 阅读更多 →

最新新闻

Atlas 300V 24G推理卡详解:从入门到YOLO部署实战

Atlas 300V 24G推理卡详解:从入门到YOLO部署实战

在边缘AI推理这个圈子里,Atlas这个名字最近几年出现的频率越来越高。尤其当“atlas部署yolo”和“atlas 300v 24g 是运算加速卡吗”这两个问题被反复问到的时候,我就知道很多人其实已经拿到了卡,或者正在选型阶段,但对这套工具链还…

2026/9/25 9:44:44 阅读更多 →
Atlas 300V 24G推理加速卡部署YOLO完整实战:从环境配置到模型转换与调优

Atlas 300V 24G推理加速卡部署YOLO完整实战:从环境配置到模型转换与调优

最近收到好几条私信,都是同一个问题:“Atlas 300V 24G 是运算加速卡吗?能不能拿来部署 YOLO?” 问的人多了,我干脆把之前折腾过的整套流程整理出来。这篇文章不是官方文档,是我自己从装卡、配驱动、转模型到…

2026/9/25 9:44:44 阅读更多 →
C# 项目接入 OpenClaw 的配置骨架:TaoToken 统一 Key 与 settings.json 实战

C# 项目接入 OpenClaw 的配置骨架:TaoToken 统一 Key 与 settings.json 实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 9:44:44 阅读更多 →
如何用AI Agent实现日均万行可用代码:工作流与实战指南

如何用AI Agent实现日均万行可用代码:工作流与实战指南

1. 当CEO把AI当成"结对程序员"而不是"代码补全器"第一次看到"日均产出一万行可用代码"这个说法,我的反应和大多数人一样:要么是标题党,要么是把AI生成的垃圾代码也算进去了。但仔细拆解这个数字背后的工作模式…

2026/9/25 9:44:44 阅读更多 →
Atlas 300V 24G部署YOLOv5全流程:环境搭建、模型转换与性能调优

Atlas 300V 24G部署YOLOv5全流程:环境搭建、模型转换与性能调优

前两天看到有人在搜“atlas 300v 24g 是运算加速卡吗”,紧接着还有一条是“atlas部署yolo”。这两个问题拼在一起,基本就是一张昇腾推理卡从“这玩意到底能不能用”到“怎么把它跑起来”的全过程心态写照。我最近正好在Atlas 300V 24G这张卡上把YOLOv5检…

2026/9/25 9:44:43 阅读更多 →
网络安全应急演练实战:从ATTCK场景设计到自动化处置剧本

网络安全应急演练实战:从ATTCK场景设计到自动化处置剧本

简介:这份文档资料面向政府机构、企事业单位的安全管理人员及专业应急处理人员,系统讲解网络安全应急响应预案的培训与演练方法,帮助组织在遭遇网络攻击、数据泄露等突发事件时做到临危不乱、快速处置。内容围绕演练目的、预案培训、实战演练…

2026/9/25 9:43:43 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →