第十二章:最佳实践

掌握 Loki 的性能优化、资源配置和运维最佳实践。

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

Loki 最佳实践

本章节汇总 Loki 的配置和运维最佳实践。

标签设计

好的标签设计

# ✅ 推荐:低基数标签
{job="api", namespace="production", service="user-service", instance="api-1"}

# ✅ 推荐:有限取值
{environment="prod", tier="frontend", region="us-east"}

避免的标签设计

# ❌ 避免:高基数标签
{user_id="12345"}              # 用户 ID
{request_id="abc-123"}        # 请求 ID
{timestamp="1705312800"}      # 时间戳
{ip="192.168.1.1"}            # IP 地址

# ❌ 避免:过多标签
{env="prod", app="myapp", ver="1.0", ns="default", pod="xyz", ip="...", host="..."}

标签指南

标签类型 示例 说明
服务标识 job="api" 标识服务
环境 env="prod" 环境区分
集群 cluster="us-east-1" 集群标识
命名空间 namespace="default" K8s 命名空间
实例 instance="web-1" 实例标识

存储优化

对象存储选择

存储 适用场景 成本
S3 AWS 环境
GCS GCP 环境
Azure Blob Azure 环境
MinIO 私有环境
磁盘 开发测试 -

存储配置

# 生产环境存储配置
storage_config:
  aws:
    bucketnames: loki-chunks
    region: us-east-1
    s3forcepathstyle: false
    http_config:
      idle_conn_timeout: 90s
      response_header_timeout: 0s

性能优化

1. 调整 Chunk 大小

ingester:
  chunk_target_size: 1572864        # 1.5MB
  chunk_encoding: gzip               # 或 snappy
  max_chunk_age: 1h

2. 启用写入缓冲

ingester:
  wal:
    enabled: true
    dir: /var/loki/wal
    flush_on_shutdown: true

3. 查询并行化

limits_config:
  max_query_parallelism: 32

querier:
  max_outstanding_per_tenant: 4096

4. 缓存配置

# 启用查询缓存
querier:
  query_ingesters_within: 3h

采集优化

Promtail 优化

# Promtail 配置优化
client:
  batchwait: 1s
  batchsize: 102400

scrape_configs:
  - job_name: system
    pipeline_stages:
      - docker: {}              # 使用 docker 解析
    relabel_configs:
      - source_labels: ['__meta_kubernetes_pod_label_app']
        target_label: service

日志格式

# 统一日志格式
# {"timestamp":"2024-01-15T10:00:00Z","level":"info","service":"api","message":"Request processed"}
pipeline_stages:
  - json:
      expressions:
        timestamp: timestamp
        level: level
        service: service
        message: message
  - labels:
      level:
      service:

资源规划

组件资源需求

组件 CPU 内存 磁盘
Ingester 1-2 核 2-4 GB 10-50 GB
Querier 1-2 核 2-4 GB -
Compactor 0.5 核 1-2 GB 10-50 GB
Distributor 0.5 核 512 MB -

容量计算

# 存储容量估算
每日日志量 = 采集速率 × 86400 秒 × 压缩比

示例:
- 10000 logs/s
- 平均日志大小:500 bytes
- 压缩比:10:1
- 保留天数:30

每日日志量 = 10000 × 500 × 86400 / 10 = 43.2 GB
30 天总容量 = 43.2 GB × 30 = 1296 GB ≈ 1.3 TB

监控指标

关键指标

指标 说明 阈值
loki_ingester_streams_created_total 创建的流数 -
loki_ingester_chunk_entries Chunk 条目数 -
loki_distributor_bytes_received_total 接收字节数 -
loki_query_errors_total 查询错误数 > 0
loki_query_duration_seconds 查询延迟 P99 < 5s

告警规则

# 监控告警
- alert: LokiHighQueryLatency
  expr: histogram_quantile(0.99, sum(rate(loki_query_duration_seconds_bucket[5m])) by (le)) > 5
  for: 10m
  labels:
    severity: warning
  annotations:
    summary: "Loki query latency is high"

- alert: LokiHighMemoryUsage
  expr: (container_memory_usage_bytes{pod=~"loki-.*"}) / (container_spec_memory_limit_bytes{pod=~"loki-.*"}) > 0.9
  for: 5m
  labels:
    severity: warning

运维清单

部署前检查

  • 存储配置正确
  • 网络连通性正常
  • 资源配额充足
  • TLS 证书有效

日常检查

  • 服务状态正常
  • 磁盘空间充足
  • 日志流正常
  • 查询延迟正常
  • 告警正常

定期维护

  • 日志清理
  • 证书更新
  • 配置审计
  • 性能调优
  • 备份验证

下一步

接下来让我们学习故障排查。

👉 故障排查