日志数据清理服务 - Nebula.Juno

Nebula.Juno 是一个通用的数据表清理服务,它主要解决了以下问题:

  1. 日志表越来越大,需要清理【较老】的数据。
  2. 有可能一天就产生大量数据,所以需要及时清理。
  3. 避免人工执行大量DELETE语句产生大量数据库锁,影响业务系统稳定运行,甚至拖死数据库。
  4. 支持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
                }
            ]
        }
    ]
}




使用限制

  • 数据表必须有一个日期字段,并创建索引