第一章:Loki 简介

了解 Loki 的设计理念、核心特性、架构原理和使用场景。

最后更新: 2024-01-15
页面目录

Loki 简介

Loki 是 Grafana Labs 开源的日志聚合系统,专为云原生环境设计,与 Prometheus 共享监控标签理念。

什么是 Loki?

Loki 是一个 水平可扩展、高可用、多租户的日志聚合系统。它的设计理念是"像 Prometheus 一样索引日志",只索引元数据而非完整的日志内容。

核心特性

特性 说明
标签索引 使用与 Prometheus 相同的标签模型
高效存储 压缩日志存储,节省空间
原生 Kubernetes 支持 Pod Logs、Service Monitors
水平扩展 支持微服务架构
多租户 内置租户隔离
LogQL 强大的日志查询语言
Grafana 集成 与 Grafana 无缝集成

Loki vs ELK

┌─────────────────────────────────────────────────────────────────┐
│                    Loki vs ELK 对比                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ELK Stack (Elasticsearch + Logstash + Kibana)                 │
│   ├── 全文索引存储日志全文                                        │
│   ├── 存储成本高                                                │
│   ├── 水平扩展复杂                                              │
│   └── 查询性能随数据量下降                                       │
│                                                                  │
│   Loki (Grafana Loki)                                           │
│   ├── 仅索引元数据 + 压缩存储                                    │
│   ├── 存储成本低 80%+                                           │
│   ├── 水平扩展简单                                              │
│   └── 查询性能稳定                                              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

对比表

对比项 Loki Elasticsearch Splunk
存储方式 压缩日志块 + 索引 全文索引 全文索引
存储成本 非常高
查询速度
水平扩展 简单 复杂 复杂
标签模型 Prometheus - -
内存占用
多租户 原生支持 需配置 需授权
Kubernetes 支持 原生 需要配置 需要配置

Loki 的设计原则

1. 不索引日志内容

┌─────────────────────────────────────────────────────────────────┐
│                      Loki 数据存储                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   索引 (Index)            日志块 (Chunks)                        │
│   ┌─────────────┐         ┌─────────────┐                       │
│   │ streams     │         │ compressed  │                       │
│   │ labels:     │ ──────► │ log data    │                       │
│   │ job=nginx   │         │             │                       │
│   │ instance=1  │         │ stored in   │                       │
│   │ namespace=x │         │ object store│                       │
│   └─────────────┘         └─────────────┘                       │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

2. 标签驱动

Loki 使用与 Prometheus 相同的标签模型,每个日志流由一组标签标识:

{job="nginx", instance="web-1", namespace="production", pod="nginx-abc123"}
  ├── job: 服务名称
  ├── instance: 主机/实例标识
  ├── namespace: 命名空间
  └── pod: Pod 名称

3. 组件分离

┌─────────────────────────────────────────────────────────────────┐
│                      Loki 架构                                   │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌─────────────┐     ┌─────────────┐     ┌─────────────┐     │
│   │  Distributor│ ───►│   Ingester  │ ───►│   Query     │     │
│   │  (分发器)    │      │  (采集器)    │      │   Frontend │     │
│   └─────────────┘     └─────────────┘     │  (查询前端)  │     │
│          │                   │            └──────┬──────┘     │
│          │                   │                   │            │
│          ▼                   ▼                   ▼            │
│   ┌─────────────────────────────────────────────────────┐      │
│   │                  Object Store (S3/GCS/MinIO)        │      │
│   │                  索引存储 + 日志块存储                │      │
│   └─────────────────────────────────────────────────────┘      │
│                                                                  │
│   ┌─────────────┐     ┌─────────────┐     ┌─────────────┐      │
│   │   Compactor │     │   Querier   │     │   Ruler     │      │
│   │   (压缩器)   │     │   (查询器)   │     │   (告警)    │      │
│   └─────────────┘     └─────────────┘     └─────────────┘      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

Loki 核心组件

Distributor (分发器)

负责接收日志数据并进行验证、分片、写入。

# Distributor 工作流程
接收日志 → 验证 → 分片 → 复制到多个 Ingester

Ingester (采集器)

接收并存储日志,与 Query组件 配合完成查询。

# Ingester 工作流程
接收日志 → 内存缓冲 → 压缩写入对象存储

Querier (查询器)

处理日志查询请求,从存储中检索数据。

Query Frontend (查询前端)

可选组件,用于并行化查询请求。

Compactor (压缩器)

压缩和保留索引数据。

Ruler (告警器)

处理告警规则评估。

Loki 数据模型

标签 (Labels)

{job="nginx", instance="web-1"}

日志流 (Stream)

具有相同标签组合的日志属于同一日志流。

# 日志流示例
{job="nginx", namespace="default", pod="nginx-7d9f9b8c5-x2k1m"}

├── 2024-01-15 10:00:00 INFO Starting nginx...
├── 2024-01-15 10:00:01 INFO Accepted connection from 10.0.0.1
├── 2024-01-15 10:00:02 INFO GET /api/health 200
└── ...

使用场景

1. Kubernetes 日志聚合

# Kubernetes 部署场景
┌─────────────┐
│   Grafana   │ ← 日志查询和可视化
└──────┬──────┘
       
       
┌─────────────┐
│    Loki     │ ← 日志存储和索引
└──────┬──────┘
       
       
┌─────────────┐
│  Promtail   │ ← Kubernetes DaemonSet
└─────────────┘

2. 微服务架构日志追踪

# 统一标签体系
{job="service-api", instance="api-1", version="v2.1.0", environment="prod"}

# 支持跨服务查询
{job=~"service-.*", environment="prod"} |= "error"

3. 应用日志监控

# 告警规则示例
groups:
  - name: application
    rules:
      - alert: HighErrorRate
        expr: |
          sum by (job) (
            count_over_time(
              {job="myapp"} |= "error"[5m]
            )
          ) > 10
        for: 5m
        labels:
          severity: critical

Loki 与 Prometheus 的关系

┌─────────────────────────────────────────────────────────────────┐
│                    Grafana 可观测性平台                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌────────────────────────────────────────────────────────┐     │
│   │                      Grafana                           │     │
│   │                                                         │     │
│   │   ┌──────────┐    ┌──────────┐    ┌──────────┐       │     │
│   │   │ Metrics  │    │  Logs   │    │ Traces  │       │     │
│   │   │(PromQL)  │    │ (LogQL) │    │(TraceQL)│       │     │
│   │   └────┬─────┘    └────┬─────┘    └────┬─────┘       │     │
│   │        │               │               │            │     │
│   │        ▼               ▼               ▼            │     │
│   │   ┌──────────┐    ┌──────────┐    ┌──────────┐       │     │
│   │   │Prometheus│    │   Loki   │    │ Tempo    │       │     │
│   │   └──────────┘    └──────────┘    └──────────┘       │     │
│   │                                                         │     │
│   └────────────────────────────────────────────────────────┘     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

共享标签模型

# Prometheus 指标
# {__name__="http_requests_total", job="api", instance="server1"}

# Loki 日志
# {job="api", instance="server1"}

Loki 生态系统

组件 说明
Promtail 日志收集代理
LogCLI 命令行查询工具
Grafana 可视化和仪表板
Loki Canary 可用性检测工具
pyroscope 性能分析集成

常用术语表

术语 说明
Stream 日志流,相同标签的日志集合
Chunk 日志块,压缩存储单元
Index 索引,标签到日志的映射
LogQL Loki 查询语言
Promtail Loki 的日志收集代理
Ingester 写入组件,负责存储日志
Querier 查询组件,负责检索日志
Ruler 告警规则评估器

下一步

接下来让我们学习如何安装和部署 Loki。

👉 安装与部署