跳到主要内容

日志数据清理

概述

在 HAP 私有部署系统中,一些“日志”类数据是长久保留在 MongoDB 中的,对于一些使用场景可能造成这类数据量庞大,占用较多数据库存储空间。

你可以在 MongoDB 中通过 show dbs 命令查看各库大小,再通过统计表大小的命令找到占用存储空间大的表。

我们提供了日志数据清理方案,根据设定的规则,可以将相关表中的数据物理删除。

操作前必读

清理操作是物理删除,对应数据永久丢失。一旦完成,对应时间段内的日志数据将无法恢复,也无法在系统界面上查看。

影响范围:

  • mdworkflow 库可清理的表主要影响范围:

    • 工作流执行历史
    • 审批流历史
    • 中断运行中流程:如果清理的数据中包含尚未完成的审批流或工作流,这些流程将因数据丢失而中断,无法继续执行。
  • mdworksheetlog 库可清理的表主要影响范围:

    • 工作表行记录日志
  • mdintegration 库可清理的表主要影响范围:

    • 集成中心历史请求日志
  • mdservicedata 库可清理的表主要影响范围:

    • 应用行为日志
    • 使用分析日志

数据清理白名单

归属库表名表用途简述
mdworkflowwf_instance主流程执行历史关联数据
mdworkflowwf_subInstanceActivity子流程执行历史关联数据
mdworkflowwf_subInstanceCallback子流程执行历史关联数据
mdworkflowwf_instanceExtends工作流执行历史关联数据
mdworkflowcode_catch存储代码块节点在运行中产生的临时数据
mdworkflowhooks_catch存储接收到的 Webhook 数据
mdworkflowwebhooks_catch存储工作流节点"发送API请求"获取到的数据
mdworkflowapp_multiple_catch存储获取多条数据节点中勾选“直接获取”后存储的数据
mdworkflowcustom_apipackageapi_catch存储调用 API 集成接口返回的响应数据
mdworksheetlogwslog*存储对应月份的工作表行记录日志
表名格式为 wslog+日期(例如 wslog202409)
mdintegrationwf_instance集成中心-请求日志
mdintegrationwf_instance_relation集成中心-请求日志关联数据
mdintegrationwebhooks_catch集成中心-请求日志中“查看详情”对应的日志数据
mdintegrationcode_catch集成中心-请求日志中“查看详情”对应的日志数据
mdintegrationjson_catch集成中心-请求日志中“查看详情”对应的日志数据
mdintegrationcustom_parameter_catch集成中心-请求日志中“查看详情”对应的日志数据
mdservicedataal_actionlog*存储对应月份的应用行为日志
表名格式为 al_actionlog+日期(例如 al_actionlog202409)
mdservicedataal_uselog存储“使用分析”功能的日志数据

数据清理操作建议

以下是针对不同类型数据的具体清理方法和注意事项。

按月归档的日志表

此方法适用于按月自动创建的日志表。

  • 适用表:

    • mdworksheetlog 库下所有以 wslog 开头的表
    • mdservicedata 库下所有以 al_actionlog 开头的表
  • 操作方法: 对于这类按月归档的表,最直接高效的清理方式是使用 drop 命令删除整个表。此操作速度极快,并能立即释放表所占用的全部磁盘空间。

  • 操作示例: 以下命令将删除 mdworksheetlog 库中 2024 年 1 月的工作表日志。

    use mdworksheetlog;
    db.wslog202401.drop();

工作流执行历史数据

清理工作流(及关联审批流)的执行历史时,涉及以下四个核心数据表:

  • wf_instance
  • wf_subInstanceActivity
  • wf_subInstanceCallback
  • wf_instanceExtends

这四个表会有数据紧密关联,共同构成了一条完整的流程记录。因此,在执行清理操作时,必须将它们视为一个不可分割的整体。

您需要对这四个表应用完全相同的删除规则(例如,按相同的时间范围删除),并确保操作同步完成。任何不一致的清理都会破坏数据完整性,可能导致历史流程查询异常或引发未知的系统问题。

缓存数据表 (以_catch 结尾)

这些表分布在 mdworkflowmdintegration 库中,主要用于存储工作流和集成任务执行过程中的临时缓存数据。您可以根据实际需求,对这些表进行独立的、选择性的清理。

潜在风险与影响:

在清理这些表之前,请务必了解以下潜在影响:

  • 影响运行中的流程:清理 mdworkflow 库下的缓存表,可能会导致尚未执行完毕的工作流因找不到依赖数据而失败。以 webhooks_catch 表为例,它用于暂存接收到的 Webhook 事件。如果在关联的工作流执行完毕前清除了该表中的事件数据,那么这个正在运行的流程就会因找不到依赖数据而中断或失败。

  • 影响日志详情查看:清理 mdintegration 库下的缓存表,将导致集成中心“请求日志”中的“查看详情”功能中的日志数据为空,因为其所需的详细数据已被删除。

操作建议:

根据您对上述风险的接受程度,可以选择以下两种清理方式:

  • 按条件清理

    如果需要确保业务连续性,建议使用数据清理工具,按时间范围等条件删除旧的缓存数据。

  • 直接删除整表

    如果业务上可以接受上述风险(例如,确认无运行中流程,且不再需要查看旧日志详情),可以直接 drop 整个缓存表,这是回收磁盘空间最快的方式。

使用分析日志

mdservicedata 库中的 al_uselog 表存储了产品“使用分析”功能的数据。

由于前端页面仅支持查询最近一年的数据,因此建议定期清理一年之前的数据,以减少不必要的存储占用。

配置数据清理任务

  1. 下载镜像(离线包下载

    docker pull nocoly/hap-archivetools:1.0.4
  2. 创建 config.json 配置文件,以删除工作流执行历史为例:

    [
    {
    "id": "1",
    "text": "描述",
    "start": "2023-05-31 16:00:00",
    "end": "2023-06-30 16:00:00",
    "src": "mongodb://root:password@192.168.1.20:27017/mdworkflow?authSource=admin",
    "archive": "",
    "table": "wf_instance",
    "delete": true,
    "batchSize": 500,
    "retentionDays": 0,
    "concurrencyLimit": 100
    },
    {
    "id": "2",
    "text": "描述",
    "start": "2023-05-31 16:00:00",
    "end": "2023-06-30 16:00:00",
    "src": "mongodb://root:password@192.168.1.30:27017/mdworkflow?authSource=admin",
    "archive": "",
    "table": "wf_subInstanceActivity",
    "delete": true,
    "batchSize": 500,
    "retentionDays": 0,
    "concurrencyLimit": 100
    },
    {
    "id": "3",
    "text": "描述",
    "start": "2023-05-31 16:00:00",
    "end": "2023-06-30 16:00:00",
    "src": "mongodb://root:password@192.168.1.30:27017/mdworkflow?authSource=admin",
    "archive": "",
    "table": "wf_subInstanceCallback",
    "delete": true,
    "batchSize": 500,
    "retentionDays": 0,
    "concurrencyLimit": 100
    },
    {
    "id": "4",
    "text": "描述",
    "start": "2023-05-31 16:00:00",
    "end": "2023-06-30 16:00:00",
    "src": "mongodb://root:password@192.168.1.30:27017/mdworkflow?authSource=admin",
    "archive": "",
    "table": "wf_instanceExtends",
    "delete": true,
    "batchSize": 500,
    "retentionDays": 0,
    "concurrencyLimit": 100
    }
    ]
    • 根据上述配置文件格式,调整或添加配置内容,以清理你所需的数据表
    • 注意,配置文件中指定的时间是世界时区 (UTC)
      • UTC: 2023-05-31 16:00:00
        • 转为东八区时间 (UTC+8): 2023-06-01 00:00:00
      • UTC: 2023-06-30 16:00:00
        • 转为东八区时间 (UTC+8): 2023-07-01 00:00:00

    参数说明:

    "id": "任务标识ID",
    "text": "自定义描述",
    "start": "指定删除的数据起始时间,UTC 时区,删除大于等于这个时间的数据(retentionDays 值大于0则此配置自动失效)",
    "end": "指定删除的数据结束时间,UTC 时区,删除小于这个时间的数据(retentionDays 值大于0则此配置自动失效)",
    "src": "来源库连接地址",
    "archive": "目标库连接地址(如果值为空,则不归档只按照设定的规则进行删除)",
    "table": "数据表",
    "delete": "默认为true,在当次归档任务完成后,并且校验记录数量正确时清理来源库已归档数据,不需要删除则改为 false",
    "batchSize": "单次批量插入以及批量删除条数",
    "retentionDays": "默认值为0。大于0时代表删除多少天前的数据,并开启定时删除任务模式,start与end指定的日期自动失效,默认每24h执行一次",
    "concurrencyLimit": "并发操作限制,值通常默认保持100即可"
  3. 启动归档服务,在 config.json 文件所在目录下执行

    docker run -d -it -v $(pwd)/config.json:/usr/local/MDArchiveTools/config.json  -v /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime nocoly/hap-archivetools:1.0.4

    其他事项:

    • 若清理程序与 HAP 单机模式运行在同一台服务器,可在 docker run 命令中添加 --network script_default 参数,使清理程序能通过 Docker 内部网络访问 MongoDB。此时,config.json 配置文件中 src 源库的连接地址需填写为 mongodb://sc:27017/dbname

    • 资源占用: 程序运行期间,会对来源库、目标库及程序所在机器产生一定的资源占用压力,建议在业务空闲期间执行。

    • 日志查看:

      • 后台运行(默认): 使用 docker ps -a 找到容器ID,然后执行 docker logs 容器ID 查看日志。

      • 前台运行: 去掉 -d 参数,日志会实时输出到终端,方便观察进度。

    • 定时任务:

      • 设置执行间隔: 可以通过自定义 ENV_ARCHIVE_INTERVAL 变量修改执行间隔,单位毫秒,默认值86400000。
    • 回收磁盘空间:当通过清理工具删除数据后,已删除数据所占用的磁盘空间不会立即释放,但通常会相同表被复用。