ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Apache Druid 高可用部署实践:ZooKeeper、元数据存储、Coordinator/Overlord 与 Broker 的高可用方案

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),仅供参考
返回列表