巧用缓存加速Loki查询


缓存在当下已被广泛的应用到大型业务系统当中 合理的使用缓存可有效加快应用速度、提升应用的可扩展性和降低对后端数据的性能依赖。那么对于Loki来说,它支持哪些缓存以及缓存的作用范围呢?小白今天带大家简单过下Loki中关于缓存的应用

缓存类型

cache_config是Loki的缓存配置区块,当前Loki 1.6支持的缓存主要是in-memory、memcached和redis。这三种缓存类型各有自己的场景需求,如果你的Loki是AllinOne部署话,三选一都可以。如果你的Loki是分布式的架构,那么可以选择redis作为主要缓存服务

  • 内存缓存(in-memory)
# 启动内存缓存 enable_fifocache: <boolean> # 缺省缓存过期时间 default_validity: <duration> fifocache: # 缓存最大内存占用   max_size_bytes: <int> = 10000 # 字段限制,0无限制   max_size_items: <int> | default = 0   validity: <duration> 
  • Memcached
# 启用Memcached后的后台配置 background:   #回写memcacehd的goroutines数目   writeback_goroutines: <int> | default = 10]   writeback_buffer: <int> = 10000 memcached:   # 过期时间   expiration: <duration>   batch_size: <int>   # 并发限制   parallelism: <int> | default = 100 memcached_client:   host: <string>   service: <string> | default = "memcached"   # 超时时间   timeout: <duration> | default = 100ms   # 最大空闲连接数   max_idle_conns: <int> | default = 100   update_interval: <duration> | default = 1m   consistent_hash: <bool> 
  • Redis
redis   endpoint: <string>   timeout: <duration> | default = 100ms   # 过期时间   expiration: <duration> | default = 0s   max_idle_conns: <int> | default = 80   max_active_conns: <int> | default = 0   password: <string>   enable_tls: <boolean> | default = false 

缓存作用域

  • 查询结果缓存

queryrange_config里面定义了Loki查询时关于缓存和切块的配置,缓存的相关配置如下

# 查询缓存开关,默认关闭 cache_results: <boolean> | default = false results_cache: # 缓存配置块   cache: <cache_config> 
  • 日志索引缓存

index_queries_cache_config定义Loki的索引缓存,大部分情况下可以等同于日志label的查询缓存

storage_config:   #索引缓存有效时间   index_cache_validity: <duration> | default = 5m   index_queries_cache_config: <cache_config> 

注意!index_cache_validity的时间要小于ingester_config.chunk_idle_period配置的时间。大意是日志的入到Loki后,缓存的日志索引在原始日志flush进存储前都为有效的,以保证查询的缓存索引是正确的。

  • 原始日志缓存

chunk_store_config定义Loki将原始日志写入存储阶段的配置,这里引入缓存其主要目的为增大Loki日志接收日志的吞吐量。

chunk_store_config:   # 日志写入存储前的缓存配置   chunk_cache_config: <cache_config>   # 删除重复写入的日志缓存配置   write_dedupe_cache_config: <cache_config> 

注意!对于日志chunk引入缓存,我们务必要将数据持久化,如果采用in-memory或者MemoryCache存在服务异常掉日志内容的风险,如果采用redis则最好把数据持久化打开

举个栗子

小白以redis作为Loki缓存来举个例子,让大家更直观看到关于缓存在全局配置里面的分布。

... frontend:   compress_responses: true    query_range:   split_queries_by_interval: 24h   results_cache:     cache:       redis:         endpoint: redis:6379         expiration: 1h   cache_results: true  storage_config:   index_queries_cache_config:     redis:       endpoint: redis:6379       expiration: 1h  chunk_store_config:   chunk_cache_config:     redis:       endpoint: redis:6379       expiration: 1h   write_dedupe_cache_config:     redis:       endpoint: redis:6379       expiration: 1h ...

经过小白的测试,当前引入缓存对Loki的日志查询效果还是挺明显的,效果图如下,从TP99来看,qeury_range接口的整体耗时下降还是比较明显的。

下面是redis缓存运行状态,看起来除了网络流量比较高外,其他压力也不大,完美的解决了小白的问题。

关于云原生小白

云原生小白的创号目的是将平日里离大家较远云原生应用以实用的角度展现出来,站在小白的角度来看待和使用云原生,并以每篇文章解决一个实际问题的出发点带领大家走进云原生世界。

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-1563.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档