日志数据清理服务 - Nebula.Juno
Nebula.Juno 是一个通用的数据表清理服务,它主要解决了以下问题:
- 日志表越来越大,需要清理【较老】的数据。
- 有可能一天就产生大量数据,所以需要及时清理。
- 避免人工执行大量DELETE语句产生大量数据库锁,影响业务系统稳定运行,甚至拖死数据库。
- 支持SaaS的多租户模式
针对第1个问题,Juno的解决方法是:
- 可以为要清理的数据表指定一个时间(多少小时前),在这个时间之前的数据将会被清理和归档。
- 不同的数据表可以指定不同的时间
- 也可以设置一个全局默认设置的时间,方便多表时简化配置
针对第2个问题,Juno的解决方法是:
- 一个小时检查一次有没有数据要清理
- 可以为每个表指定一个最小的清理行数,避免频繁执行这个复杂的操作,也可以减少归档文件数量
针对第3个问题,Juno的解决方法是:
- 整个清理操作分批次进行,进一步保证锁能快速释放,不影响数据库及业务系统运行。
- 批次的行数可配置,可具体到表,也可指定一个全局默认值。
针对第4个问题,Juno的解决方法是:
- 允许在一个配置文件指定多个数据库,以及它们包含的多张数据表
- 引入一个特殊的名称 [tenants] 表示所有租户数据库
如何配置?
以下是一个配置示例
{
// 清理多少小时之前的数据
"HoursAgo": 48,
// 每次清理记录的最大条数,如果超过这个数量,将拆分成多次执行清理和归档。
"BatchRows": 1000,
// 要清理的数据库:指定要处理哪些数据库以及它们的表
"Databases": [
{
// 数据库连接名,需要事先在配置服务中注册。
"DbName": "Nebula.Db",
// 在这个数据库中要清理的表定义集合
"Tables": [
{
// 要清理的数据表名
"TableName": "TableX",
// 日期字段名,用于判断记录是否要清理
"TimeFieldName": "CreateTime"
}
]
},
{
// 特殊值:[tenants] = 所有租户库
"DbName": "[tenants]",
"Tables": [
{
"TableName": "table1",
"TimeFieldName": "CreateTime"
},
{
"TableName": "table2",
"TimeFieldName": "CreateTime",
// 下面这2个字段不使用顶层的默认值
"HoursAgo": 24,
"BatchRows": 5000
}
]
}
]
}
使用限制
- 数据表必须有一个日期字段,并创建索引