跳到主要内容

Loki 存储架构

介绍

Grafana Loki是一个水平可扩展、高可用的多租户日志聚合系统,其存储架构专为日志数据优化设计。与传统的全文索引系统不同,Loki通过只索引元数据的方式大幅降低存储开销,同时使用对象存储作为主要存储后端,这使得它成为成本效益极高的云原生日志解决方案。

核心组件

Loki的存储架构由三个关键部分组成:

  1. 索引存储:存储日志流的元数据(标签集)
  2. 块存储:存储压缩后的日志内容
  3. 缓存层:加速查询性能

存储模式详解

1. 单存储模式 (Monolithic)

适合中小规模部署,所有组件共享同一存储后端:

yaml
storage_config:
boltdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/cache
filesystem:
directory: /loki/chunks

2. 微服务模式

生产环境推荐架构,各组件独立扩展:

存储后端支持

Loki支持多种存储后端:

存储类型索引存储示例块存储示例
本地文件系统boltdbfilesystem
云对象存储aws-dynamodbaws-s3
键值数据库cassandragcs
内存存储inmemory (仅测试用)inmemory
生产环境建议

对于生产环境,推荐组合使用:

  • 索引存储:DynamoDB/Cassandra
  • 块存储:S3/GCS

实际配置案例

AWS部署示例

yaml
storage_config:
aws:
s3: s3://access-key:secret-key@region/bucket-name
dynamodb:
dynamodb_url: dynamodb://access-key:secret-key@region

本地开发配置

yaml
storage_config:
boltdb_shipper:
active_index_directory: /tmp/loki/index
cache_location: /tmp/loki/cache
filesystem:
directory: /tmp/loki/chunks

数据生命周期管理

Loki通过compactor组件管理数据保留:

yaml
compactor:
working_directory: /loki/compactor
shared_store: s3
compaction_interval: 10m
retention_enabled: true
retention_delete_delay: 2h
retention_delete_worker_count: 10
重要配置

确保retention_period与存储后端策略一致,避免意外删除:

yaml
limits_config:
retention_period: 720h # 30天

性能优化实践

  1. 批量写入:调整ingester配置减少小文件

    yaml
    ingester:
    chunk_idle_period: 1h
    chunk_block_size: 262144
  2. 查询缓存:启用results_cache

    yaml
    query_range:
    results_cache:
    cache:
    enable_fifocache: true
    fifocache:
    max_size_bytes: 500MB

总结

Loki的存储架构设计体现了以下核心思想:

  • 元数据与数据分离存储
  • 充分利用廉价对象存储
  • 通过缓存层弥补对象存储延迟
  • 水平扩展能力

延伸学习

  1. 尝试在不同存储后端之间迁移数据:

    bash
    loki-table-manager --config.file=loki.yaml --target-store gcs --source-store s3
  2. 监控关键指标:

    • loki_ingester_chunk_stored_bytes_total
    • loki_querier_store_chunks_downloaded_bytes
  3. 官方资源: