You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

低成本清理DynamoDB中90天以上陈旧遥测数据方案咨询

低成本清理大型DynamoDB表中90天以上旧遥测数据

背景信息

  • 数据规模:750 GB(分布于爱尔兰、俄亥俄、北京区域)
  • 条目数量:500亿条记录
  • 示例数据结构:
{
    "deviceid": "a00a940c-b804-4806-a14f-7c713964fc65",
    "timestamp": 1661521317,
    "notifications": false,
    "payload": [
      {
        "n": "temprature",
        "v": "20"
      },
      {
        "n": "humidity",
        "v": "91"
      }
    ]
  }

低成本清理方案

1. DynamoDB TTL自动过期(首选零成本方案)

  • 核心逻辑:启用TTL功能,指定timestamp字段作为过期判定属性,DynamoDB后台会自动删除时间戳早于90天的条目,全程无需手动编写删除逻辑。
  • 成本优势:TTL自动删除操作完全免费,仅需承担数据未被删除前的正常存储费用。
  • 操作步骤:
    1. 确认timestamp存储的是秒级Unix时间戳(与示例格式一致)。
    2. 通过AWS CLI启用TTL:
      aws dynamodb update-time-to-live --table-name YOUR_TABLE_NAME --time-to-live-specification Enabled=true,AttributeName=timestamp
      
    3. 90天对应的秒数为7776000(90×24×3600),DynamoDB会自动以当前时间减去该值作为过期阈值,异步清理数据(通常48小时内完成)。

2. 批量删除+分段扫描(适合需立即清理的场景)

若TTL异步清理不符合时效要求,可采用批量删除,但需严格控制成本:

  • 核心思路:用Scan(或Query,若有合适索引)分段过滤过期数据,再通过BatchWriteItem批量删除,同时控制并发量避免读写费用飙升。
  • 成本优化要点:
    • 若表为预留容量模式,可临时切换为按需付费,仅为实际消耗的读写容量付费。
    • 扫描时用FilterExpression提前过滤过期数据,减少返回数据量:
      import boto3
      from datetime import datetime, timedelta
      
      dynamodb = boto3.resource('dynamodb')
      table = dynamodb.Table('YOUR_TABLE_NAME')
      
      # 计算90天前的Unix时间戳
      cutoff_ts = int((datetime.now() - timedelta(days=90)).timestamp())
      
      last_key = None
      while True:
          scan_params = {
              'FilterExpression': 'timestamp < :cutoff',
              'ExpressionAttributeValues': {':cutoff': cutoff_ts},
              'Limit': 100
          }
          if last_key:
              scan_params['ExclusiveStartKey'] = last_key
          
          resp = table.scan(**scan_params)
          items = resp.get('Items', [])
          
          if items:
              # 批量删除,单次最多25条
              delete_reqs = [{'DeleteRequest': {'Key': {'deviceid': item['deviceid'], 'timestamp': item['timestamp']}}} for item in items[:25]]
              table.batch_writer().batch_write_item(RequestItems={table.name: delete_reqs})
          
          last_key = resp.get('LastEvaluatedKey')
          if not last_key:
              break
      
    • 选择业务低峰时段执行操作,避免影响正常流量,部分区域还可利用低价时段进一步压缩成本。
    • 多区域表需分别在每个区域执行清理,或启用全局表同步TTL规则。

3. 导出S3后重建表(极端大规模场景最优解)

针对500亿条级别的数据,批量删除成本仍过高时,可采用此方案:

  • 步骤:
    1. 使用DynamoDB导出功能,将未过期数据导出到S3(导出费用约0.00125 USD/GB,远低于删除费用)。
    2. 删除原表(或保留作为备份)。
    3. 创建新表并启用TTL,将S3中的数据导入新表(导入操作免费)。
  • 成本优势:整体成本仅为批量删除的十分之一甚至更低,适合一次性大规模清理。

总结

  • 优先选TTL自动过期:零删除成本、操作简单,适合非紧急清理需求。
  • 需立即清理时用批量删除+分段扫描:通过控制扫描范围和并发量降低成本。
  • 极端大规模场景选导出S3重建表:是最经济的一次性清理方案。

内容的提问来源于stack exchange,提问作者SengarAshu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:55:24