Reddit 将媒体元数据从 S3 和其他系统迁移到 AWS Aurora Postgres

Reddit 媒体元数据存储架构升级

Reddit 最近将其媒体元数据存储整合到一个新的架构中,使用了 AWS Aurora Postgres。此前,Reddit 的媒体元数据分散在多个系统中,包括直接从 AWS S3 获取。新架构简化了元数据检索,能够处理每秒超过 10 万次请求,并且在 p90 延迟低于 5ms

背景与需求

Reddit 平台上有数十亿包含不同类型媒体内容的帖子,如图片、视频和嵌入的第三方媒体。随着用户行为的变化,Reddit 预计未来几年上传的媒体内容将会增加。

媒体元数据的定义与作用

Reddit 的高级软件工程师 Jianyi Yi 解释了媒体元数据的重要性:

  • 媒体元数据 为媒体内容提供了额外的上下文、组织和可搜索性。
  • Reddit 的媒体元数据主要分为两类:

    1. 帖子模型中的媒体数据:例如视频缩略图、播放 URL、比特率和多种分辨率。
    2. 直接与媒体资产生命周期相关的元数据

由于平台的有机发展,媒体元数据存储在不同的系统中,导致存储格式不一致、查询模式多样、缺乏审计和内容分类。在某些情况下,甚至需要查询或下载 S3 存储桶对象来获取相应的元数据。

新架构的选择与设计

Reddit 决定创建一个统一的系统来管理媒体元数据,并选择了 AWS Aurora Postgres 作为数据存储解决方案,而不是 Apache Cassandra。尽管两者都符合 Reddit 的需求,但 Postgres 提供了更好的即席调试和更灵活的查询模式。

可扩展性设计

为了应对未来增长(预计到 2030 年媒体元数据将达到 50TB),工程师们采用了表分区技术来支持扩展性。他们使用 pg_partmanpg_cron 扩展进行分区管理,并以帖子 ID 作为分区键。由于帖子 ID 单调递增,Postgres 可以缓存最近分区的索引,从而减少磁盘 I/O,进一步提高了批量查询的执行时间。

数据存储优化

所有媒体元数据字段以 序列化 JSONB 格式 存储,将表转换为键值存储,简化了查询逻辑,避免了连接操作,并进一步提高了读取性能。通过这些优化,元数据存储在每秒 10 万次请求下的读取延迟分别为 2.6ms (p50)4.7ms (p90)17ms (p99)

数据迁移的挑战与解决方案

项目的最大挑战是数据迁移。工程师们采用了多阶段方法:

  1. 双写与数据回填:启用双写并从旧数据源回填数据。
  2. 双读与问题检测:启用双读并比较输出,以检测和解决任何问题。
  3. 逐步切换:逐步切换到新数据存储,同时监控性能和扩展性问题。

在迁移过程中,团队使用 Apache Kafka 消费者从源数据库流式传输数据变更事件,并报告数据不一致,以帮助工程师分析数据问题。

总结

Reddit 通过整合媒体元数据存储到 AWS Aurora Postgres,显著简化了元数据管理并提高了系统性能。新架构通过分区、JSONB 存储和多阶段迁移策略,成功应对了数据量大、查询复杂和迁移困难的挑战,为未来的扩展和优化奠定了基础。

阅读 22
0 条评论