Apache Druid 高可用部署实践:ZooKeeper、元数据存储、Coordinator/Overlord 与 Broker 的高可用方案
数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载本文是 Apache Druid 高可用High Availability部署的实战指南。围绕官方操作文档的核心结论结合仓库中的源码与集群示例配置系统讲解如何为 ZooKeeper、元数据存储、Coordinator、Overlord 和 Broker 搭建高可用环境并揭示 leader 选举与故障转移在 Druid 内部的真实实现机制。读完本文你将掌握 Druid 集群各关键组件的 HA 架构设计、配置要点与故障切换行为可直接用于生产集群的规划与排障。高可用覆盖范围哪些组件必须做 HADruid 是一个分布式实时分析数据库由 ZooKeeper、元数据存储、Coordinator、Overlord、Broker、Historical、MiddleManager/Indexer 等角色组成。并非所有组件都需要同等程度的高可用投入官方文档明确建议以下组件优先搭建高可用环境Apache ZooKeeper集群协调的大脑几乎所有服务发现与领导选举都依赖它。元数据存储Metadata store保存段元数据、任务信息、规则等关键状态是集群事实的最终来源。Coordinator负责段管理与数据生命周期。Overlord负责索引任务的接收与调度。Broker查询入口可水平扩展需置于负载均衡之后。ZooKeeper 高可用3 或 5 节点集群ZooKeeper 是 Druid 集群协调的基石。官方建议使用3 个或 5 个 ZooKeeper 节点组成的集群来保证其高可用——奇数节点数量是 ZooKeeper 多数派选举协议的要求可以容忍(N-1)/2个节点的故障3 节点容忍 1 台故障5 节点容忍 2 台故障。部署形态有两种推荐方式ZooKeeper 独立部署将 ZooKeeper 安装在自己的专用硬件/虚拟机上与 Druid 进程隔离避免资源竞争与故障传染。与 Master 服务器混部在 3 或 5 台运行 Overlord 或 Coordinator 的 Master 服务器上安装并配置 ZooKeeper一套硬件同时承担协调与主控职责。Druid 侧 ZooKeeper 配置无论采用哪种形态Druid 各服务都需要通过druid.zk.service.host指向同一套 ZooKeeper 集群。以仓库中的集群示例配置 examples/conf/druid/cluster/_common/common.runtime.properties 为基准# # Zookeeper # druid.zk.service.hostlocalhost druid.zk.paths.base/druid在生产环境中druid.zk.service.host应填写 ZooKeeper ensemble 的完整主机列表例如zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181。ZooKeeper 客户端的连接行为由 server/src/main/java/org/apache/druid/curator/CuratorConfig.java 定义与高可用密切相关的主要参数如下配置项默认值说明druid.zk.service.hostlocalhostZooKeeper 集群地址列表高可用场景必须配置为多个节点druid.zk.service.sessionTimeoutMs30000ZK 会话超时时间毫秒。会话过期会被判定为节点失联触发领导权交接druid.zk.service.connectionTimeoutMs15000建立连接的超时时间毫秒druid.zk.service.maxZkRetries29连接 ZK 的最大重试次数。较小的重试次数能让节点在 ZK 连接丢失时快速失败druid.zk.service.aclfalse是否启用 ZooKeeper ACL安全环境建议开启druid.zk.service.compresstrue是否对 ZK 节点数据启用压缩在 server/src/main/java/org/apache/druid/curator/CuratorModule.java 中可以看到 Curator 客户端的构建逻辑它使用FixedEnsembleProvider固定连接配置的 ensemble并采用BoundedExponentialBackoffRetry基础退避 1 秒、最大退避 45 秒作为重试策略。也就是说当某个 ZK 节点故障时客户端会自动转向 ensemble 中的其他节点这正是 ZK 集群化带来的第一层高可用保障。此外Curator 客户端注册了未处理错误监听器addUnhandledErrorListener当 ZK 层出现无法恢复的错误时Druid 会发出告警alert并停止服务必要时在 30 秒后强制halt(1)避免节点带着不一致的状态假活下去——这是保证故障能被外部检测并触发切换的重要设计。ZK 路径规划druid.zk.paths.base是所有 Druid ZK 路径的根。从 server/src/main/java/org/apache/druid/server/initialization/ZkPathsConfig.java 的实现可以看出Coordinator 和 Overlord 的选举路径分别默认为base/coordinator与base/overlordgetCoordinatorPath()默认druid/coordinatorleader 选举 latch 路径为druid/coordinator/_COORDINATORgetOverlordPath()默认druid/overlordleader 选举 latch 路径为druid/overlord/_OVERLORD这些路径在 server/src/main/java/org/apache/druid/curator/discovery/DiscoveryModule.java 中通过ZKPaths.makePath拼接生成。如果同一套 ZK 集群被多个环境共享务必为不同环境设置不同的druid.zk.paths.base避免选举节点互相干扰。元数据存储高可用MySQL 或 PostgreSQL 主从 故障转移Druid 的元数据存储保存段元数据、规则、任务信息、数据源模式等核心状态。官方文档明确指出不建议在生产环境使用单实例的内嵌 Derby示例配置中也注明 Derby 仅适用于single Coordinator, no fail-over的场景而应使用MySQL 或 PostgreSQL并启用复制replication与故障转移failover。生产推荐配置示例以 examples/conf/druid/cluster/_common/common.runtime.properties 中注释掉的配置为模板生产环境的元数据存储配置如下# 对于 MySQL确保 MySQL JDBC 驱动在 classpath 上 druid.metadata.storage.typemysql druid.metadata.storage.connector.connectURIjdbc:mysql://db1.example.com:3306/druid druid.metadata.storage.connector.user... druid.metadata.storage.connector.password... # 对于 PostgreSQL druid.metadata.storage.typepostgresql druid.metadata.storage.connector.connectURIjdbc:postgresql://db1.example.com:5432/druid druid.metadata.storage.connector.user... druid.metadata.storage.connector.password...对于高可用数据库本身官方推荐的做法是MySQL使用 MySQL Enterprise High Availability 方案如 Group Replication / InnoDB Cluster实现复制与自动故障转移PostgreSQL参考 PostgreSQL 官方文档中的 High Availability、Load Balancing and Replication 章节搭建流复制Streaming Replication 自动故障转移如 Patroni、repmgr 等常见工具。高可用元数据存储 高可用 ZooKeeper 是 Coordinators 和 Overlords 实现自动故障转移的前提——新选出的 leader 必须能立即读写到一致的元数据。仓库中提供了对应存储类型的扩展实现MySQL 见 extensions-core/mysql-metadata-storagePostgreSQL 见 extensions-core/postgresql-metadata-storage。部署时需将对应扩展加入druid.extensions.loadList。Coordinator 与 Overlord 高可用基于 ZooKeeper 的自动领导选举运行多实例自动故障转移官方建议为Coordinator 和 Overlord 各运行多个服务器实例让它们指向同一个 ZooKeeper 集群和同一套元数据存储。这样任意时刻只有一个实例是活跃 leader其余实例处于 standby 状态当活跃 leader 故障或失去 ZK 连接时其余实例会自动完成 failover无需人工干预非 leader 实例不会处理领导职责但会把请求重定向到当前活跃的 leader。因此Coordinator 和 Overlord 本质上是主备模式active-standby而不是同时工作的多活模式。源码视角选举如何发生Druid 的 leader 选举抽象定义在 server/src/main/java/org/apache/druid/discovery/DruidLeaderSelector.java核心接口包括getCurrentLeader()返回当前 leader 的 ID无 leader 时返回 nullisLeader()本节点当前是否为 leaderlocalTerm()本节点成为 leader 的次数任期号用于长时间任务中途校验自己是否仍是同一任期内的 leaderregisterListener(Listener)/unregisterListener()注册/注销领导权监听Listener提供becomeLeader()与stopBeingLeader()两个回调。基于 ZooKeeper 的实现是 server/src/main/java/org/apache/druid/curator/discovery/CuratorDruidLeaderSelector.java它直接使用 Apache Curator 的LeaderLatch配方。结合代码可以还原整个选举流程每个 Coordinator/Overlord 实例在启动时创建一个指向同一 latch 路径的LeaderLatch参与者 ID 为scheme://host:port见createNewLeaderLatch()registerListener()被调用后latch 才start()节点开始参与选举在此之前仅作为旁观者查询当前 leaderZK 依据临时节点ephemeral node的创建顺序选出一个 leader当选实例的isLeader()回调被触发执行listener.becomeLeader()当节点失去领导权主动退出、会话过期或 ZK 连接断开时触发stopBeingLeader()回调并调用recreateLeaderLatch()重建 latch有趣的是重建后节点会随机休眠 1000–5000 毫秒再重新参与选举见 CuratorDruidLeaderSelector.java目的是给其他等待中的节点优先当选的机会避免同一节点反复抢占领导权导致抖动如果becomeLeader()抛出异常节点会通过makeAlert发出告警并重建 latch主动放弃领导权。其中只有 leader 干活的语义由localTerm()支撑DruidCoordinator、TaskMaster 等消费方在启动长时间任务如段协调、任务清扫时会记录任期号并在执行中周期性校验自己是否仍是该任期的 leader一旦发现已失去领导权就停止工作。非 leader 如何重定向非活跃的 Coordinator/Overlord 实例会把自己收到的请求重定向到当前 leader。这一机制由 server/src/main/java/org/apache/druid/discovery/DruidLeaderClient.java 实现客户端通过DruidNodeDiscoveryProvider发现目标角色的所有实例然后向候选节点逐个发起 leader 探测请求leaderRequestPath找到当前 leader 后把真正的请求转发过去如果 leader 无法定位或请求失败最多重试 5 次MAX_RETRIES 5。服务发现层面server/src/main/java/org/apache/druid/curator/discovery/DiscoveryModule.java 通过druid.discovery.typecurator默认值将Coordinator 的DruidLeaderSelector绑定到 latch 路径zkBase/coordinator/_COORDINATOROverlord 的DruidLeaderSelector绑定到 latch 路径zkBase/overlord/_OVERLORD。各服务间的寻址则依赖druid.selectors.*配置见 examples/conf/druid/cluster/_common/common.runtime.propertiesdruid.selectors.indexing.serviceNamedruid/overlord druid.selectors.coordinator.serviceNamedruid/coordinator部署建议Coordinator 与 Overlord 的主备实例数量不必很多官方建议运行多个即可典型为 2–3 个数量主要受 ZK 选举开销与资源成本约束所有实例的 ZK ensemble 与元数据存储连接配置必须完全一致否则会出现脑裂或选不出 leader 的问题主备实例应分布在不同物理机/可用区避免机架级故障导致所有实例同时宕机结合上文所述Coordinator/Overlord 的 HA 依赖 ZK 与元数据存储的 HA应优先保障这两层。Broker 高可用水平扩展 负载均衡与 Coordinator/Overlord 不同Druid Broker 是无状态的查询入口所有 Broker 实例可以同时处于活跃状态并对外服务。官方建议Druid Brokers 可以水平扩展scale out所有运行的服务器都是活跃且可查询的建议将它们放在负载均衡器load balancer后面。部署要点水平扩展按查询 QPS 与并发度线性增加 Broker 实例数量每个实例都能独立接收查询负载均衡使用负载均衡器如 Nginx、HAProxy、云厂商 LB将查询流量均匀分发到所有 Broker避免单点过载无状态重启由于 Broker 不持有持久状态查询结果缓存属可丢失数据可以放心滚动重启、弹性伸缩不会破坏集群一致性故障剔除负载均衡器应配置健康检查health check自动摘除宕机的 Broker 实例实现查询入口的透明故障转移。Broker 的查询入口角色、与数据节点的交互细节可参考 docs/design/broker.md 与 docs/design/architecture.md 了解全貌。高可用整体架构与操作建议综合官方文档与仓库实现一个生产级高可用 Druid 集群的分层要点如下组件高可用模式关键依赖故障转移方式ZooKeeper3 或 5 节点集群—ZK 多数派协议客户端自动切换元数据存储MySQL/PostgreSQL 复制 故障转移—数据库层主从切换Coordinator多实例主备ZK 元数据存储Curator LeaderLatch 自动选举Overlord多实例主备ZK 元数据存储Curator LeaderLatch 自动选举Broker多实例多活—负载均衡器健康检查摘除故障节点运维提醒依赖顺序Coordinator/Overlord 的自动 failover 以 ZK 与元数据存储的 HA 为前提三层需依次保障配置一致性同一角色的多个实例必须使用完全相同的 ZK ensemble、druid.zk.paths.base与元数据存储地址会话超时权衡druid.zk.service.sessionTimeoutMs默认 30 秒过短会放大网络抖动导致的误切换过长会拖慢真实故障的检测速度需按网络质量调整健康检查为所有无状态入口Broker、Router配置负载均衡健康检查确保故障实例被及时摘除告警Curator 层的未处理错误与选举回调异常都会通过makeAlert上报依赖druid.emitter配置建议接入监控系统第一时间感知 leader 交接与 ZK 连接异常。总结Apache Druid 的高可用方案可以概括为有状态组件靠集群主控组件靠选举无状态组件靠扩展ZooKeeper 与元数据存储分别用多节点集群和数据库复制实现自身 HACoordinator 与 Overlord 通过指向同一套 ZK 元数据存储的多实例部署由 CuratorLeaderLatch自动完成主备切换Broker 则依靠水平扩展与负载均衡实现查询入口的横向高可用。理解这些机制背后的实现CuratorDruidLeaderSelector、DiscoveryModule、DruidLeaderClient有助于在生产环境中正确规划容量、定位选举异常并针对自身网络与故障场景调优超时参数。赞分享数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载相关推荐CANNBot TileLang代码骨架代码骨架模板 生成 example_{op}.py 时的文件结构 python import tilelang from tilelang import DaAI 技能人工智能AI 评测CANNAscendDXMT资源管理与内存分配终极指南深入理解Direct3D到Metal的资源转换机制DXMT资源管理与内存分配终极指南深入理解Direct3D到Metal的资源转换机制 你是否想在macOS上流畅运行Windows游戏和图形应用 今天我从崩溃到自愈Apache Dubbo Nacos元数据存储的7个高可用实践从崩溃到自愈Apache Dubbo Nacos元数据存储的7个高可用实践 你是否遇到过分布式系统中配置中心宕机导致服务不可用的情况是否在配置更新时因网络抖RPC框架微服务后端服务注册发现上一篇Roo Code 上手指南VS Code 里装一支 AI 编码团队改代码、查错、问架构全搞定下一篇Paint App - Level Name创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

244张电塔图训练YOLOv8:从VOC转YOLO到遥感检测的完整避坑指南

244张电塔图训练YOLOv8:从VOC转YOLO到遥感检测的完整避坑指南

简介:面向遥感目标检测与电力设施巡检方向的开发者与研究者,这份数据集提供了244张电塔遥感影像及对应标注,统一采用Pascal VOC和YOLO两种格式,方便直接接入主流检测框架。包内共734个文件,包括244张jpg原图、244个xml…

2026/9/23 21:21:16 阅读更多 →
YOLOv9行人检测实战:遮挡低照度场景下的轻量计数系统

YOLOv9行人检测实战:遮挡低照度场景下的轻量计数系统

简介:本资源是一套基于YOLOv9的行人识别、检测与计数完整实现方案,面向计算机、人工智能、自动化等专业的本科生毕业设计、课程实践及初阶科研开发者。项目提供可直接运行的Python源码、详细环境配置与训练教程、已训练好的YOLOv9-s模型(.pt&…

2026/9/23 21:21:16 阅读更多 →
零配置在线工具站设计:纯前端架构与打开即用体验

零配置在线工具站设计:纯前端架构与打开即用体验

1. 一个标题引发的思考:从「卧槽」到产品设计逻辑第一次看到「你只管打开这个网站,剩下的交给卧槽」这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个靠情绪冲击力做传播的工具型站点。做了十多年产品拆解和流量分析&…

2026/9/23 21:20:14 阅读更多 →

最新新闻

Apache DataFusion 中的 Arrow 入门:RecordBatch、ArrayRef 与列式执行原理详解

Apache DataFusion 中的 Arrow 入门:RecordBatch、ArrayRef 与列式执行原理详解

大数据数据分析后端 【免费下载链接】datafusion Apache DataFusion SQL Query Engine 项目地址: https://gitcode.com/gh_mirrors/datafu/datafusion 点击查看 免费下载 导读 Apache DataFusion 将 Apache Arrow 作为其原生内存数据格式,因此任何使用…

2026/9/25 2:50:25 阅读更多 →
Artillery 自定义插件开发实战:以 artillery-plugin-hello-world 为例剖析插件接口与扩展机制

Artillery 自定义插件开发实战:以 artillery-plugin-hello-world 为例剖析插件接口与扩展机制

性能测试接口测试CLI 【免费下载链接】artillery The complete load testing platform. Everything you need for production-grade load tests. Serverless & distributed. Load test with Playwright. Load test HTTP APIs, GraphQL, WebSocket, and more. Use any Node.…

2026/9/25 2:50:25 阅读更多 →
react-map-gl 入门指南:为 Mapbox GL JS 与 MapLibre GL JS 打造的 React 组件套件

react-map-gl 入门指南:为 Mapbox GL JS 与 MapLibre GL JS 打造的 React 组件套件

前端UI组件 【免费下载链接】react-map-gl React friendly API wrapper around MapboxGL JS 项目地址: https://gitcode.com/gh_mirrors/re/react-map-gl 点击查看 免费下载 react-map-gl 是一套专为 React 设计的开源组件库,它把 mapbox-gl 与 maplibr…

2026/9/25 2:50:25 阅读更多 →
Spyder 内置教程全解:从运行首个 Python 程序到调试、绘图与代码规范实战

Spyder 内置教程全解:从运行首个 Python 程序到调试、绘图与代码规范实战

开发工具IDE代码编辑器 【免费下载链接】spyder Official repository for Spyder - The Scientific Python Development Environment 项目地址: https://gitcode.com/gh_mirrors/sp/spyder 点击查看 免费下载 Spyder(Scientific Python Development Env…

2026/9/25 2:50:25 阅读更多 →
RocketRide llm_perplexity 节点深度解析:把 Perplexity Sonar 搜索增强大模型接入 AI 流水线

RocketRide llm_perplexity 节点深度解析:把 Perplexity Sonar 搜索增强大模型接入 AI 流水线

【免费下载链接】rocketride-server High-performance AI pipeline engine with a C core and 50 Python-extensible nodes. Build, debug, and scale LLM workflows with 13 model providers, 8 vector databases, and agent orchestration, all from your IDE. Includes VS C…

2026/9/25 2:50:25 阅读更多 →
ctf-wiki 橢圓曲線加密(ECC)從入門到實戰:離散對數基礎、ElGamal 方案與 SECCON CTF 破解

ctf-wiki 橢圓曲線加密(ECC)從入門到實戰:離散對數基礎、ElGamal 方案與 SECCON CTF 破解

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 本篇技術指南以 ctf-wiki 的 ecc.md 為主體,系統梳理橢圓曲線加密(Elliptic Curve C…

2026/9/25 2:49:25 阅读更多 →

日新闻

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 阅读更多 →