Loki 官方文档明确支持 Redis 用于 chunks 缓存和 results 缓存,能减少对象存储(如 S3)的负载,并提供分布式共享缓存。 Redis 的性能通常与 Memcached 相当,甚至在某些场景下更好(如支持持久化和更灵活的键值操作),但配置略有不同。

注意事项

  • Redis 支持多数据库(DB),所以可以用一个 Redis 实例处理多个缓存(chunks 用 DB 0,results 用 DB 1),避免部署多个容器。
  • 与 Memcached 的 extstore 不同,Redis 主要依赖内存,但可以启用 AOF 持久化到 SSD(appendonly yes),让数据在内存不足时通过 eviction policy(如 allkeys-lru)自动管理,并持久化到磁盘。这能部分模拟 SSD 缓存,但不是完全等价(Redis 的磁盘使用更侧重于耐久性而非冷热分离)。
  • 如果缓存量大,设置 maxmemory(e.g., 4096MB for chunks)和 eviction policy 以防 OOM。
  • 这里假设无用户名认证,只用密码(lokipass);生产中推荐启用 ACL(Redis 6+)。
  • 测试环境:Redis 7.4,Loki 3.2.0。

架构图

pasted_file_1766474880944.svg

docker-compose.yml

替换 Memcached 服务为 Redis。挂载主机 SSD 到 Redis 的 /data,用于 AOF 持久化。

version: '3.8'

services:
  loki:
    image: grafana/loki:3.2.0
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yaml:/etc/loki/loki-config.yaml
    command: -config.file=/etc/loki/loki-config.yaml
    environment:
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      - AWS_REGION=${AWS_REGION}
    depends_on:
      - redis
    networks:
      - loki-net

  redis:
    image: redis:7.4-alpine
    command: redis-server --requirepass lokipass --appendonly yes --aof-use-rdb-preamble yes --maxmemory 5120mb --maxmemory-policy allkeys-lru --dir /data
    volumes:
      - /ssd/redis:/data  # 主机 SSD 路径映射,用于 AOF 持久化
    networks:
      - loki-net

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - loki-net

networks:
  loki-net:

volumes:
  grafana-data:
  • Redis 配置说明

    • --requirepass lokipass:设置密码。
    • --appendonly yes --aof-use-rdb-preamble yes:启用 AOF 持久化到 SSD,混合 RDB 格式以减小文件大小。
    • --maxmemory 5120mb:总内存限(chunks 4GB + results 1GB 相当于,调整为你的 RAM)。
    • --maxmemory-policy allkeys-lru:内存满时,逐出最近最少使用键。
    • 如果不需要持久化,移除 --appendonly 参数以纯内存运行。

修改后的 loki-config.yaml

将 memcached 替换为 redis 配置。chunks 用 DB 0,results 用 DB 1;添加密码和超时等优化。

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /loki
  storage:
    s3:
      bucketnames: ${S3_BUCKET}
      endpoint: s3.${AWS_REGION}.amazonaws.com
      region: ${AWS_REGION}
      access_key_id: ${AWS_ACCESS_KEY_ID}
      secret_access_key: ${AWS_SECRET_ACCESS_KEY}
      s3forcepathstyle: false
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2024-01-01  # 调整为你的起始日期
      store: tsdb
      object_store: s3
      schema: v13
      index:
        prefix: index_
        period: 24h

storage_config:
  tsdb_shipper:
    active_index_directory: /loki/tsdb-shipper-active
    cache_location: /loki/tsdb-shipper-cache
    cache_ttl: 24h

chunk_store_config:
  chunk_cache_config:
    enable_fifocache: true
    fifocache:
      max_size_items: 1024
      validity: 1h
    redis:
      endpoint: redis:6379
      db: 0
      password: lokipass
      timeout: 60s
      expiration: 24h  # chunks TTL
      max_connection_age: 30m
      idle_timeout: 5m
      pool_size: 16
  max_look_back_period: 7d  # 保留期,调整为需要

query_range:
  results_cache:
    cache:
      redis:
        endpoint: redis:6379
        db: 1
        password: lokipass
        timeout: 60s
        expiration: 5m  # results TTL,短一些
        max_connection_age: 30m
        idle_timeout: 5m
        pool_size: 16
  cache_results: true

limits_config:
  query_length: 30d
  max_query_parallelism: 14

querier:
  query_timeout: 2m
  • Redis 配置说明

    • endpoint: redis:6379:容器内地址(无 redis:// 前缀,Loki 会自动处理)。
    • db:分离 chunks (0) 和 results (1)。
    • expiration:键过期时间(chunks 24h,results 5m,根据需求调整)。
    • pool_size: 16:连接池大小,类似 Memcached 的 max_idle_conns。
    • 无需 consistent_hashbatch_size,Redis 内部处理。

启动后,测试查询性能。如果 Redis 内存压力大,监控 stats(用 redis-cli INFO)并调整 maxmemory。相比 Memcached,Redis 更易扩展到集群模式(如添加 Sentinel)。

最后修改:2025 年 12 月 23 日
如果觉得我的文章对你有用,请随意赞赏