生产环境运行的DynamoDB如何新增作为GSI排序键的新列?
DynamoDB 新增
IDUpdatedAt字段的存量处理及搜索影响说明 存量数据IDUpdatedAt字段补充方案
- 全量错峰回填
先对生产表做全量备份避免操作风险,再通过Scan接口分批扫描全表数据,按照业务规则为每一行存量数据赋值IDUpdatedAt:如果有历史更新时间记录直接复用,无相关记录可使用行创建时间作为兜底值,最后通过BatchWriteItem接口批量更新回写,建议控制扫描和写入的吞吐量,错峰在业务低峰期执行,避免抢占线上业务的读写容量。 - 触发式增量回填
开启DynamoDB Stream,在应用访问存量旧数据的逻辑中增加判断,如果该行不存在IDUpdatedAt字段则实时补写后再返回结果,适合存量冷数据占比高、业务允许短时间内冷数据不展示在搜索结果中的场景,对线上业务性能影响最小,不需要主动执行全表扫描操作。
存量无IDUpdatedAt字段的行对搜索功能的影响
DynamoDB GSI有固定的同步规则:只有基表中同时包含GSI分区键和排序键两个字段的行,才会被自动同步到GSI中,缺少任意一个字段的行不会进入GSI,也不会触发同步报错。基于这个规则对搜索功能的影响如下:
- 若你的搜索逻辑直接查询该GSI返回结果,缺少
IDUpdatedAt字段的存量行不会出现在搜索结果中,不会抛出异常,但会出现结果数据缺失的问题。 - 若你的搜索逻辑当前仍查询基表后做内存过滤排序,GSI的存在不会对现有逻辑产生任何影响,但无法获得GSI的排序加速效果。
- 若你在GSI查询中使用
FilterExpression过滤IDUpdatedAt,无该字段的行依旧不会被GSI返回,不会影响正常查询的性能和结果格式。
上线兼容建议
如果业务要求搜索结果必须包含全量数据,可以在回填阶段做双读兼容:新搜索逻辑优先查GSI获取新数据,同时兜底查询基表补全存量旧数据,等全量数据的IDUpdatedAt字段覆盖率达到100%后,再下线兜底逻辑,正式切全量流量到GSI搜索。
内容的提问来源于stack exchange,提问作者Ankit Rohilla
相关产品推荐
相关产品推荐

