openobserve(1)介绍及架构

OpenObserve 是一个开源的云原生可观测性平台,专为日志、指标和追踪数据设计,能够处理 PB 级规模的数据。它旨在提供比传统工具(如 Elasticsearch、Splunk 或 Datadog)更简单、更高效、更经济的解决方案。

openobserve offical

介绍

核心特点

  1. 易用性
    OpenObserve 的设计目标是“10 倍简单”,用户可以在不到 2 分钟内完成安装和运行,不像 Elasticsearch 那样需要调整大量复杂参数。它提供内置的用户界面,无需额外安装其他工具(如 Kibana)。

  2. 低存储成本
    通过使用压缩技术(如 Parquet 列式存储)和对象存储(如 S3、GCS、MinIO 或 Azure Blob),OpenObserve 将日志存储成本降低了约 140 倍(与 Elasticsearch 相比,具体效果可能因数据熵而异)。这种成本优势使其非常适合大规模数据处理。

  3. 高性能
    OpenObserve 使用 Rust 语言开发,利用其高性能特性。它通过分区、布隆过滤器、倒排索引、缓存和列式存储的组合优化了查询速度,尤其在聚合查询上表现优异。

  4. 功能全面

    • 支持日志、指标、追踪、实时用户监控(RUM,包括性能、错误和会话回放)。
    • 提供仪表盘、警报、数据管道等功能。
    • 支持 OpenTelemetry 和 PromQL 等标准协议,易于与现有工具集成。
  5. 可扩展性
    OpenObserve 采用无状态节点架构,支持水平扩展,能够轻松应对 PB 级数据需求。它还可以选择本地磁盘存储或云存储,灵活性高。

使用场景

OpenObserve 是 Elasticsearch、Splunk 或 Datadog 的替代品,特别适合需要高效日志搜索、指标监控和分布式追踪的团队。它适用于从初创公司到大型企业的各种规模用户,已在全球范围内被数百个生产环境采用,包括处理每日 100+ TB 数据的集群。

与 Elasticsearch 的对比

  • 设计目标:Elasticsearch 是一个通用搜索引擎,而 OpenObserve 专为可观测性优化
  • 存储与查询:OpenObserve 不像 Elasticsearch 那样依赖大量索引,而是将数据压缩存储在列式格式中,牺牲部分搜索速度换取更快的聚合查询和更低的存储需求。
  • 运维成本:无索引映射问题,集群管理更简单,GUI 内置,减少了额外组件的需求。

架构

架构概览

OpenObserve 的架构是无状态的分布式系统,分为以下几个关键部分:

    1. 数据摄取层:负责接收和处理外部数据。
    1. 数据处理与存储层:将数据进行压缩、分区并存储到对象存储或本地磁盘。
    1. 查询层:处理用户查询并返回结果。
    1. 元数据管理:维护数据索引和元信息。
    1. 用户界面:内置 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)

  • 功能
    支持数据转换和过滤,例如字段提取、格式化或丢弃无关数据。
  • 实现
    通过配置规则在摄取时处理数据。
  • 特点
    • 轻量级,减少下游存储和查询负担。

架构特点

    1. 无状态设计
      摄取和查询节点无状态,可通过负载均衡器动态扩展,适合 Kubernetes 等环境。
    1. 分离存储与计算
      计算节点不存储数据,所有数据持久化到对象存储,实现低成本和高可用性。
    1. 高性能
      Rust 的内存安全和高并发特性,结合列式存储和缓存,显著提升查询和摄取速度。
    1. 灵活部署
      支持单节点(All-in-One)模式和分布式集群模式,适应不同规模需求。

与传统工具的对比

  • Elasticsearch
    • Elasticsearch 使用 Lucene 索引,适合全文搜索,但存储和运维成本高。
    • OpenObserve 放弃复杂索引,专注于可观测性场景,存储成本低,聚合查询更快。
  • Loki
    • Loki 是轻量级日志系统,但功能较单一(仅日志),查询性能依赖标签。
    • OpenObserve 提供日志、指标和追踪的全栈支持,功能更全面。

典型工作流程

  1. 数据通过 HTTP/gRPC 进入 Ingester。
  2. Ingester 解析数据,写入 WAL 并批量生成 Parquet 文件。
  3. Parquet 文件上传至对象存储,元数据更新。
  4. 用户通过 UI 或 API 发起查询,Querier 从存储中读取数据并返回结果。
  5. Compactor 定期优化存储文件。

社区与许可

总的来说,OpenObserve 是一个高性能、低成本且易于上手的可观测性工具,特别适合希望降低存储成本、简化运维并实现大规模数据分析的用户。OpenObserve 的架构兼顾了简单性、性能和成本效益,是现代可观测性需求的理想选择。