1.清理快照方案选型:

1.使用阿里云提供的DTS服务。未采用,原因是该服务价格成本较高

2.使用任务编排的跨库SQL,将历史数据同步过去。由于该任务每次会将复制范围内的数据查出来,因数据量较大会报慢sql警告,影响线上数据库吞吐量

3.数据数据归档+任务编排,在夜间的业务低峰期进行按月份的数据归档(方便出问题后进行数据恢复),数据会归档至廉价的OSS进行备份存储,待数据归档完成后跑任务编排进行数据的硬删除,操作期间需关注数据库的CPU/内存使用率,以及IOPS(每秒I/O的次数)

2.归档进度

任务iD 时间范围 数据数量(条) 执行
982276 ~2020-02-07 11:07:41 104,204 1
987926 2020-02-07 11:07:40~2020-03-01 2,740,087 1
988963 2020-03-01~2020-04-01 2,972,159 1
989486 2020-04-01~2020-05-01 4,576,500 1
990053 2020-05-01~2020-06-01 4,423,192 1
1001771 2020-06-01~2020-07-01 3,582,377 1
1006296 2020-07-01~2020-07-15 1,468,383 1
1006629 2020-07-15~2020-08-01 1,795,105 1
1014309 2020-08-01~2020-08-15 1,681,431 1
1028061 2020-08-15~2020-09-01 1,970,644 1
1020231 2020-09-01~2020-09-15 1,605,406 1
1020665 2020-09-15~2020-10-01 3,162,828 1
1028508 2020-11-01~2020-11-24 4,800,932 1
1029411 2020-11-24~2020-12-01 5,956,095 1

3.删除历史快照记录导致线上故障

事故现象: C端下单报错,快照ID为0

事故定级: 事故责任人:孙彬 事故时间:2021-04-29 事故原因:清理历史快照表数据导致C端个别商品无法下单

影响范围:C端无法下单

排查过程: 2021-04-29 10:01 接到C端开发(邱立波)反馈,商品取快照id拿到是0

2021-04-29 10:20 韩永恺、孙彬、吴文全、刘旺杰 商定解决方案

2021-04-29 10:58 商品拿到无法下单数据进行修复

2021-04-29 11:08 数据修复完成

解决方案:

手动触发相关商品快照生成

后续Action:

创建备份库实例,将已归档至OSS的数据恢复至备份库,商品修改查询快照代码,同时查备份库

4.复盘:

1.订单查询的快照应该由订单域自己来维护,不然库存和价格也都要对订单域进行相关字段对快照维护

2.快照表设计有缺陷,维护了太多无关的字段,导致单条记录过大,并且没有进行分库分表,导致单表的数据量过亿(15个月的数据,500G),从而影响整个库的查询性能

3.在快照表清理的方面决策太过草率,没有实际结合业务场景,仅凭经验主义就删除了最早7个月的历史数据,没有考虑过部分动销商品可能价格从没变动过,因而只在商品创建时生成了一条快照记录

4.接到故障反馈后,第一时间从日志捞取问题数据,进行数据修复,重新生成对应商品的快照数据,保证线上出现问题的相关商品可以正常下单;与此同时协同DBA及TL商定解决方案

方案一:调整代码,增加备份数据的数据源,直接使用阿里云的DAL对OSS进行SQL查询未在主库查到的快照数据,由于性能问题PASS

方案二:增加数据源的思路不变,使用新的数据库实例,将归档数据还原,当天紧急发布上线,已解决该问题

5.后续操作:

1.写脚本检查3个月内变更的动销商品是否在主库中存在快照记录,如果不存在则从备份库中获取相关快照记录插入至主库快照表,(新的备份库实例4核8G,每个G每天的存储成本约在50~100RMB)

2.推动订单域进行快照方案的进行,商品后续不对快照进行维护