Loki | 数据过期自动删除策略设计
最近使用Loki
碰到一个比较蛋疼问题,配置日志过期时间,配置这种事情,自然是要参照官方文档了,当时就找到了这个文档,地址:
https://github.com/grafana/loki/blob/v1.5.0/docs/operations/storage/retention.md
。当我配置完成之后,启动Loki
的时候直接提示:
Retention period should now be a multiple of periodic table duration
大概中文意思是说保留时间段必须是周期表的倍数,脑海里不禁打了一个大大问号,我是按照你的demo
来的。于是,跑到issue
里面进行了一番搜索,后来就发现了这个,如下是作者的回复 大概意思是说呢,默认情况下168
小时一张表,日志保留时间应该是168
的倍数,比如:168x4
。
于是有人认为Loki
官方给出的实例具有一定的迷惑性,当然我就是这样被绊倒了。(能不能职业一点,这样的错误对于初级用户,不知道要浪费多少时间,所以啊,出了问题,强烈建议到官方issue去查找原因)
❝那么
Loki
数据保留策略是如何设计的呢? ❞
Loki
支持在基于表的数据存储中存储索引和块。使用这种存储类型时,会在一段时间内创建多个表:每个表(也称为周期表)都包含特定时间范围内的数据。这样做可以带来两个明显的好处:
- 每个表都绑定一个配置模式和版本,随着时间的推移修改了Loki的配置和版本信息,这样就可以做到多个模式和版本数据共存。在
schema_config
可以存在一个或者多个config
,每个config
中都存在一个from
字段,这样的话,就可以在不同from
时间段内使用不同模式配置信息,出现版本升级或者Loki
架构修改的时候,这个功能显得尤为重要。
- 通过这种配置当需要删除某个时间段之间的数据,就可以快速删除。数据存储系统中通常存在过期策略,而对于
Loki
是保留策略,可以在Loki
中配置保留多少天的数据,那么之前数据会被清除,Loki中默认保留所有数据,如果想要开启保留策略,必须在loki.yaml
配置文件中添加如下配置:
table_manager:
retention_deletes_enabled: true
retention_period: 336h
超出这个保留时间的表数据将被自动清理,具体保留数据策略如下图所示:
那么保留的表数量公式为:number_of_tables_to_keep = floor(retention_period / table_period) + 1
注意:Loki
的保留数据时间最小单位是24小时,所以这个保留参数的配置应该为24小时的倍数。另外一点需要注意的是Loki
虽然在设计中声明自己是多租户的,而且每个租户之间数据隔离,但在过期策略这部分却不支持按照租户设置过期策略,所以就目前来说Loki
的多租户并不是特别完善,如下图所示:
选择使用Loki
做日志存储和查询工具的原因其一节省资源、其二能够跟Grafana
监控平台无缝集成、社区非常活跃、发展速度非常快。就目前而说,它是一个轻量级的日志存储和查询工具(支持简单的日志统计),如果需要使用复杂数据分析和统计,那么建议使用EFK
。以上就是本人在使用Loki
的过程碰到一些问题,希望能够帮助到大家,谢谢!如有问题,关注公众号、加我微信,拉你进讨论群。
- Android实现滑动刻度尺效果,选择身高体重和生日
- 浅谈开源web程序后台的安全性
- Web漏洞演练平台 – ZVulDrill
- Android内存泄漏终极解决篇(上)
- 走近科学:我是如何入侵Instagram查看你的私人片片的
- 在线手写识别的多卷积神经网络方法
- 苹果发布OS X 10.9.2更新,修复SSL漏洞
- Android内存泄漏终极解决篇(下)
- 利用Volatility查找系统中的恶意DLL
- 雪人行动:利用IE10 0day漏洞的APT攻击剑指美国军方情报
- Android开发:最详细的 Toolbar 开发实践总结
- 关于yubikey对web应用的杞人之忧
- 利用旧版Android漏洞的E-Z-2-Use攻击代码已在Metasploit发布
- Android Studio你不知道的调试技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 张量的结构操作
- GitHub Actions 指南
- 面试进阶-数据库中的锁
- (译)针对 Kubernetes 工作负载的策略工具
- 又被逼着优化代码,这次我干掉了出入参 Log日志
- 想去看机会?这10道最高频的手撕代码题都会了吗?
- 你知道Python中的4种变量作用域是哪些吗?
- 图解 Python 浅拷贝与深拷贝
- 打卡群刷题总结0716——不同路径
- 原理 + 代码|手把手教你用Python实现智能推荐算法
- 机器学习必刷题-基础概念篇(1):为什么用AUC做评价指标?
- 机器学习必刷题-手撕推导篇(3):FM与softmax
- Python面试必刷题系列(4)
- SQL面试必刷题(1) Case When
- 张量的数学运算