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。
架构图
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: 2mRedis 配置说明:
endpoint: redis:6379:容器内地址(无 redis:// 前缀,Loki 会自动处理)。db:分离 chunks (0) 和 results (1)。expiration:键过期时间(chunks 24h,results 5m,根据需求调整)。pool_size: 16:连接池大小,类似 Memcached 的 max_idle_conns。- 无需
consistent_hash或batch_size,Redis 内部处理。
启动后,测试查询性能。如果 Redis 内存压力大,监控 stats(用 redis-cli INFO)并调整 maxmemory。相比 Memcached,Redis 更易扩展到集群模式(如添加 Sentinel)。