openobserve(1)介绍及架构
OpenObserve 是一个开源的云原生可观测性平台,专为日志、指标和追踪数据设计,能够处理 PB 级规模的数据。它旨在提供比传统工具(如 Elasticsearch、Splunk 或 Datadog)更简单、更高效、更经济的解决方案。
openobserve offical
介绍
核心特点
易用性:
OpenObserve 的设计目标是“10 倍简单”,用户可以在不到 2 分钟内完成安装和运行,不像 Elasticsearch 那样需要调整大量复杂参数。它提供内置的用户界面,无需额外安装其他工具(如 Kibana)。低存储成本:
通过使用压缩技术(如 Parquet 列式存储)和对象存储(如 S3、GCS、MinIO 或 Azure Blob),OpenObserve 将日志存储成本降低了约 140 倍(与 Elasticsearch 相比,具体效果可能因数据熵而异)。这种成本优势使其非常适合大规模数据处理。高性能:
OpenObserve 使用 Rust 语言开发,利用其高性能特性。它通过分区、布隆过滤器、倒排索引、缓存和列式存储的组合优化了查询速度,尤其在聚合查询上表现优异。功能全面:
- 支持日志、指标、追踪、实时用户监控(RUM,包括性能、错误和会话回放)。
- 提供仪表盘、警报、数据管道等功能。
- 支持 OpenTelemetry 和 PromQL 等标准协议,易于与现有工具集成。
可扩展性:
OpenObserve 采用无状态节点架构,支持水平扩展,能够轻松应对 PB 级数据需求。它还可以选择本地磁盘存储或云存储,灵活性高。
使用场景
OpenObserve 是 Elasticsearch、Splunk 或 Datadog 的替代品,特别适合需要高效日志搜索、指标监控和分布式追踪的团队。它适用于从初创公司到大型企业的各种规模用户,已在全球范围内被数百个生产环境采用,包括处理每日 100+ TB 数据的集群。
与 Elasticsearch 的对比
- 设计目标:Elasticsearch 是一个通用搜索引擎,而 OpenObserve 专为可观测性优化。
- 存储与查询:OpenObserve 不像 Elasticsearch 那样依赖大量索引,而是将数据压缩存储在列式格式中,牺牲部分搜索速度换取更快的聚合查询和更低的存储需求。
- 运维成本:无索引映射问题,集群管理更简单,GUI 内置,减少了额外组件的需求。
架构
架构概览
OpenObserve 的架构是无状态的分布式系统,分为以下几个关键部分:
- 数据摄取层:负责接收和处理外部数据。
- 数据处理与存储层:将数据进行压缩、分区并存储到对象存储或本地磁盘。
- 查询层:处理用户查询并返回结果。
- 元数据管理:维护数据索引和元信息。
- 用户界面:内置 GUI,用于数据可视化和管理。
整个系统通过无状态节点实现水平扩展,支持高并发摄取和查询,同时利用对象存储(如 S3)实现低成本的 PB 级数据存储。
核心组件
1. 摄取服务 (Ingester)
- 功能:
接收来自客户端的日志、指标和追踪数据,支持多种协议(如 HTTP、gRPC、Syslog、Fluentd、OpenTelemetry 等)。 - 工作流程:
- 数据到达后,Ingester 进行初步解析和验证。
- 将数据分片(基于时间和流),并批量写入存储层。
- 通过 WAL(Write-Ahead Log,预写日志)确保数据可靠性,即使节点崩溃也能恢复。
- 特点:
- 高吞吐量,支持每秒数百万条日志摄取。
- 无状态设计,可动态扩展节点。
2. 存储引擎
- 格式:
使用 Parquet(列式存储格式),结合 Zstandard 压缩算法,大幅降低存储需求。 - 存储位置:
- 默认使用对象存储(如 AWS S3、Google GCS、MinIO、Azure Blob),支持无限扩展。
- 可选本地磁盘存储,适合小型部署。
- 分区策略:
- 数据按时间和流(Stream)分区,减少查询时的扫描范围。
- 使用布隆过滤器(Bloom Filter)和倒排索引优化查询效率。
- 特点:
- 与 Elasticsearch 的 Lucene 索引不同,OpenObserve 不依赖昂贵的索引结构,而是通过列式存储和压缩实现低成本和高性能。
3. 查询服务 (Querier)
- 功能:
处理用户查询,包括日志搜索、指标聚合和追踪分析。 - 工作流程:
- 从元数据服务获取数据位置和索引信息。
- 并行扫描存储中的 Parquet 文件,结合缓存和布隆过滤器加速查询。
- 支持 SQL-like 查询语言和 PromQL(用于指标)。
- 特点:
- 针对聚合查询优化(如 COUNT、SUM、AVG),比全文搜索更高效。
- 无状态,可水平扩展以支持高并发查询。
4. 元数据管理
- 存储:
使用嵌入式键值数据库(如 SQLite 或 RocksDB)存储元数据,包括流定义、分区信息和索引。 - 功能:
- 跟踪数据位置和结构,协调摄取和查询服务。
- 支持动态流创建,无需预定义 schema。
- 特点:
- 元数据轻量,占用资源少。
- 可通过分布式一致性协议(如 Raft)实现高可用(在集群模式下)。
5. 压缩与合并服务 (Compactor)
- 功能:
定期将小文件合并为大文件,优化存储和查询性能。 - 工作流程:
- 扫描存储中的小 Parquet 文件。
- 合并同分区的数据,更新元数据。
- 特点:
- 后台运行,不影响实时摄取和查询。
- 减少对象存储的请求次数,进一步降低成本。
6. 用户界面 (UI)
- 功能:
提供内置的 Web 界面,用于数据可视化、仪表盘创建、警报配置和实时用户监控(RUM)。 - 特点:
- 无需额外部署(如 Kibana),直接集成在服务中。
- 支持日志搜索、指标图表、追踪视图和会话回放。
7. 数据管道 (Pipeline)
- 功能:
支持数据转换和过滤,例如字段提取、格式化或丢弃无关数据。 - 实现:
通过配置规则在摄取时处理数据。 - 特点:
- 轻量级,减少下游存储和查询负担。
架构特点
- 无状态设计:
摄取和查询节点无状态,可通过负载均衡器动态扩展,适合 Kubernetes 等环境。
- 无状态设计:
- 分离存储与计算:
计算节点不存储数据,所有数据持久化到对象存储,实现低成本和高可用性。
- 分离存储与计算:
- 高性能:
Rust 的内存安全和高并发特性,结合列式存储和缓存,显著提升查询和摄取速度。
- 高性能:
- 灵活部署:
支持单节点(All-in-One)模式和分布式集群模式,适应不同规模需求。
- 灵活部署:
与传统工具的对比
- Elasticsearch:
- Elasticsearch 使用 Lucene 索引,适合全文搜索,但存储和运维成本高。
- OpenObserve 放弃复杂索引,专注于可观测性场景,存储成本低,聚合查询更快。
- Loki:
- Loki 是轻量级日志系统,但功能较单一(仅日志),查询性能依赖标签。
- OpenObserve 提供日志、指标和追踪的全栈支持,功能更全面。
典型工作流程
- 数据通过 HTTP/gRPC 进入 Ingester。
- Ingester 解析数据,写入 WAL 并批量生成 Parquet 文件。
- Parquet 文件上传至对象存储,元数据更新。
- 用户通过 UI 或 API 发起查询,Querier 从存储中读取数据并返回结果。
- Compactor 定期优化存储文件。
社区与许可
- 开源许可:采用 AGPL-3.0 许可。
- 社区支持:可在 GitHub(https://github.com/openobserve/openobserve)
总的来说,OpenObserve 是一个高性能、低成本且易于上手的可观测性工具,特别适合希望降低存储成本、简化运维并实现大规模数据分析的用户。OpenObserve 的架构兼顾了简单性、性能和成本效益,是现代可观测性需求的理想选择。