第一章: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。
👉 安装与部署