天天看点

数据库与对象存储S3如何保持一致性背景介绍实现细节如何解决S3的脏数据问题

目录

  • 背景介绍
  • 实现细节
  • 如何解决S3的脏数据问题

背景介绍

工作上实现了一个需求:需要将文件上传到S3(对象存储),并在数据库保存文件上传访问地址及其他相关数据。功能看似比较简单,但是发现有一些问题值得考虑。

实现细节

文件上传有新增、更新、删除操作,需要与数据库保持一致。S3的文件操作是没有事务保证的,但是数据库有事务,这就会存在很多问题。

数据库与对象存储S3如何保持一致性背景介绍实现细节如何解决S3的脏数据问题

由于文件上传和数据库新增都在一个事务中,如果S3上传失败,那么整个事务都会回滚,因此不存在数据库的脏数据,但是可能存在上传完文件后可能服务器同时宕机了,也有可能上传多个文件,一个成功,一个失败,也有可能保存数据库失败了,因此,S3可能已经上传成功了,由于S3没有任何事务保证而数据库有事务保证,因此就在S3上形成了脏数据。

同理,先保存数据库,再上传文件到S3中也是一样的,也有可能存在S3上传完成之后服务器立马宕机的情况或以上类似其他情况,都可能导致S3上存在脏数据。

总结一句话:数据库可以通过事务保证没有脏数据库,但是S3存储无法保证。

如何解决S3的脏数据问题

首先,S3一定要预留足够的存储空间,防止由于脏数据导致无法正常上传文件,此外还要一个定时任务,定时对比数据库中的记录和S3的数据,如果S3中的记录在数据库中不存在,那么需要在S3中删除该文件,还需注意文件上传时间,防止因为刚上传的文件还没有来得及保存到数据库中导致被误删,所以一般不要删除当天上传的文件。根本原因是S3和数据库无法同事在一个事务中,因此无法保证强一致性,只能保证最终一致性。

总结:

  • 使用定时任务(对比数据库与S3中的记录)删除S3中的脏数据,避免删除当天上传到S3上的文件,防止误删。
  • S3预留足够空间