FerroDruid
Rust-native Apache-Druid-compatible OLAP
一个 Rust-native、兼容 Apache Druid 规格的实时 OLAP 数据库。它支持 Druid REST API、native query JSON 和 Druid SQL,并读写 Druid segment v9/v10 二进制文件 — 无需 JVM、无需 ZooKeeper,也无需六进程 control plane。单一二进制文件在低于 200 MB RAM 下可于一秒内启动。
经典 Apache Druid 集群在提供单个查询前,就需要六个或更多 JVM 进程、ZooKeeper、外部 metadata 数据库以及 16 GB+ RAM;FerroDruid 的单二进制模式用一个进程替代全部组件,并以自包含 AMI 交付。v0.2.0 提供全部八种 native query 类型(timeseries、topN、groupBy、scan、search、segmentMetadata、dataSourceMetadata、timeBoundary);运行 Druid SQL(SELECT、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、30+ 函数、EXPLAIN PLAN FOR、MSQ task endpoint,~95% 核心 SQL 对等);暴露 40+ 个 Druid-compatible REST endpoint;读写 Druid segment v9/v10;并从 Kafka 和 Kinesis supervisors 以及 native batch 摄取。默认启用 Basic auth(Argon2id)+ RBAC,通过 rustls 提供 TLS,并在首次启动时生成唯一随机管理员密码。
面临挑战
Apache Druid 是一款强大的实时 OLAP 引擎,但传统的集群在服务单个查询之前,需要 6 个或更多 JVM 进程、ZooKeeper、外部元数据数据库以及 16 GB 或更多的 RAM。建立、运行和监控这 6 进程控制平面非常繁重,对于评估环境和较小的部署来说大材小用。您希望使用 Druid 的 API 和 segment 格式,但不希望承担运行 JVM 和 ZooKeeper 集群的负担。
工作原理
- 1
作为单个二进制文件启动
单二进制模式运行单个进程 — 无 JVM、无 ZooKeeper、无外部元数据数据库 — 启动时间不到 1 秒,内存占用低于 200 MB。它使用 SQLite 存储元数据,使用本地文件系统作为深度存储,并作为自包含 of AMI 交付。
- 2
支持 Druid 线路协议
它支持 Druid REST API、原生查询 JSON 和 Druid SQL,并读取和写入 Druid segment v9/v10 二进制文件。它支持所有 8 种原生查询类型,并公开了 40 多个与 Druid 兼容的 REST 端点,因此您可以将现有的 Druid 客户端或 Apache Superset 连接器直接指向它。
- 3
启动时锁定,首次登录时需修改密码
默认启用基本身份验证(Basic auth,使用 Argon2id)和 RBAC,并通过 rustls 提供 TLS。在首次启动时,它会生成一个该实例特有的全新随机 admin 密码(绝非默认或共享密码),并将其写入实例系统日志一次。admin 账户被标记为必须修改,因此在操作员 POST 新密码之前,所有 API 端点都会返回 HTTP 403,从而强制在首次登录时修改密码。
产品亮点
Druid-spec wire-compatible(REST + native JSON + Druid SQL,segment v9/v10)— 现有 Druid 客户端和查询可用。
一个二进制文件,无需 JVM / ZooKeeper / 六进程 control plane;在低于 200 MB RAM 下亚秒级启动。
8 种 native query 类型 + Druid SQL(~95% 核心对等)+ Kafka / Kinesis ingest;默认启用 auth + RBAC。
包含内容
- 自包含的 Amazon Linux 2023 AMI(Graviton / arm64,支持 t4g、c7g、m7g 和 r7g 系列实例)
- 单二进制模式 — 无 JVM、ZooKeeper 或外部元数据数据库的单进程,在低于 200 MB 的 RAM 上启动时间不到 1 秒(SQLite 元数据以及本地文件系统深度存储)
- 所有 8 种 Druid 原生查询类型(timeseries、topN、groupBy、scan、search、segmentMetadata、dataSourceMetadata、timeBoundary)以及 40 多个与 Druid 兼容的 REST 端点
- Druid SQL(SELECT / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT,超过 30 个函数,EXPLAIN PLAN FOR,一个 MSQ 任务端点,以及约 95% 的核心 SQL 兼容性)
- 读取和写入 Druid segment v9/v10 二进制文件,支持从 Kafka、Kinesis supervisor 以及通过原生批处理进行摄取
- 默认开启安全设置 — 基本身份验证(Basic auth,使用 Argon2id)加上 RBAC,通过 rustls 提供 TLS,并在首次启动时生成实例唯一的随机 admin 密码,该密码必须在首次登录时修改
- 用于在 ALB 后方部署的 CloudFormation 模板(marketplace/cloudformation/ami.yaml),支持的拓扑结构为单二进制单节点(多节点默认 fail-closed)
适用场景
希望运行与 Druid 兼容的实时 OLAP 且无需运行 6 进程 JVM 和 ZooKeeper 集群的团队
使用 Druid REST API、原生查询 JSON、Druid SQL 或 Apache Superset 连接器的现有客户端的后端
基于轻量级二进制文件的 Druid 功能评估和开发环境,该文件启动时间不到 1 秒且内存占用低于 200 MB
单节点流式传输和时间序列分析,支持从 Kafka、Kinesis supervisor 或通过原生批处理进行摄取
常见问题
它与真正的 Apache Druid 的兼容性如何?
FerroDruid 支持 Druid REST API、原生查询 JSON 和 Druid SQL,并读取和写入 segment v9/v10。它支持所有 8 种原生查询类型,并提供 40 多个与 Druid 兼容的 REST 端点,具有约 95% 的核心 Druid SQL 兼容性(并非 100%)。针对 Apache Druid 30.0.1 的实时线路深层匹配为 5/5,与 Apache Superset 连接器的匹配也为 5/5。坦诚的适用范围:实时验证是针对 Druid 30.0.1 和单二进制模式进行的;Druid 31 到 36 是规范驱动的设计目标,尚未针对运行中的集群进行交叉验证。
我需要 JVM、ZooKeeper 还是外部元数据数据库吗?
在单二进制模式下不需要。单进程启动时间不到 1 秒,且使用低于 200 MB 的 RAM — 相比之下,传统的 Druid 集群需要 6 个或更多 JVM 进程、ZooKeeper、外部元数据数据库以及 16 GB 或更多的 RAM。支持的单二进制路径使用 SQLite 存储元数据,使用本地文件系统作为深度存储。
我可以运行多节点配置吗?
支持的拓扑结构是单二进制单节点;多节点配置默认 fail-closed。老实说,实时验证是针对单二进制模式进行的,我们目前尚未将其作为运行中的多节点集群进行验证。有关详细信息,请参阅 docs/KNOWN_LIMITATIONS.md。
安全是如何处理的?首次登录流程是怎样的?
默认启用基本身份验证(Basic auth,使用 Argon2id) and RBAC,并通过 rustls 提供 TLS。在首次启动时,AMI 会生成一个该实例特有的全新随机 admin 密码(绝非默认或共享密码),并将其写入实例系统日志一次。admin 账户被标记为必须修改,因此在操作员向 /druid-ext/basic-security/authentication/db/basic/users/admin/credential POST 新密码之前,所有 API 端点都会返回 HTTP 403。轮换后的凭据会被持久化,并在重启后依然保留。
如何部署它?许可和计费是如何工作的?
使用提供的 CloudFormation 模板(marketplace/cloudformation/ami.yaml)将其部署在 Application Load Balancer 后方;在 ALB 处终止 TLS,请勿将服务端口直接暴露给互联网。将您的客户端(REST API、原生查询 JSON、Druid SQL 或 Apache Superset 连接器)指向负载均衡器端点。此商品销售的是基于 Apache-2.0 源码并在固定发布版本下构建的、经过加固、扫描且获得支持的分发版;代码本身保持为 Apache-2.0。AWS 会根据运行的实例小时数自动对 AMI 进行计量收费,产品中没有计量代码。
计费模式
按小时收取软件费用 + EC2(t4g / c7g / m7g / r7g 级,Arm)。按实例类型计量。