Loading... 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 持久化。 ```yaml 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;添加密码和超时等优化。 ```yaml 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_hash` 或 `batch_size`,Redis 内部处理。 启动后,测试查询性能。如果 Redis 内存压力大,监控 stats(用 redis-cli INFO)并调整 maxmemory。相比 Memcached,Redis 更易扩展到集群模式(如添加 Sentinel)。 最后修改:2025 年 12 月 23 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏