Reddit 媒体元数据存储架构升级
Reddit 最近将其媒体元数据存储整合到一个新的架构中,使用了 AWS Aurora Postgres。此前,Reddit 的媒体元数据分散在多个系统中,包括直接从 AWS S3 获取。新架构简化了元数据检索,能够处理每秒超过 10 万次请求,并且在 p90 延迟低于 5ms。
背景与需求
Reddit 平台上有数十亿包含不同类型媒体内容的帖子,如图片、视频和嵌入的第三方媒体。随着用户行为的变化,Reddit 预计未来几年上传的媒体内容将会增加。
媒体元数据的定义与作用
Reddit 的高级软件工程师 Jianyi Yi 解释了媒体元数据的重要性:
- 媒体元数据 为媒体内容提供了额外的上下文、组织和可搜索性。
Reddit 的媒体元数据主要分为两类:
- 帖子模型中的媒体数据:例如视频缩略图、播放 URL、比特率和多种分辨率。
- 直接与媒体资产生命周期相关的元数据。
由于平台的有机发展,媒体元数据存储在不同的系统中,导致存储格式不一致、查询模式多样、缺乏审计和内容分类。在某些情况下,甚至需要查询或下载 S3 存储桶对象来获取相应的元数据。
新架构的选择与设计
Reddit 决定创建一个统一的系统来管理媒体元数据,并选择了 AWS Aurora Postgres 作为数据存储解决方案,而不是 Apache Cassandra。尽管两者都符合 Reddit 的需求,但 Postgres 提供了更好的即席调试和更灵活的查询模式。
可扩展性设计
为了应对未来增长(预计到 2030 年媒体元数据将达到 50TB),工程师们采用了表分区技术来支持扩展性。他们使用 pg_partman 和 pg_cron 扩展进行分区管理,并以帖子 ID 作为分区键。由于帖子 ID 单调递增,Postgres 可以缓存最近分区的索引,从而减少磁盘 I/O,进一步提高了批量查询的执行时间。
数据存储优化
所有媒体元数据字段以 序列化 JSONB 格式 存储,将表转换为键值存储,简化了查询逻辑,避免了连接操作,并进一步提高了读取性能。通过这些优化,元数据存储在每秒 10 万次请求下的读取延迟分别为 2.6ms (p50)、4.7ms (p90) 和 17ms (p99)。
数据迁移的挑战与解决方案
项目的最大挑战是数据迁移。工程师们采用了多阶段方法:
- 双写与数据回填:启用双写并从旧数据源回填数据。
- 双读与问题检测:启用双读并比较输出,以检测和解决任何问题。
- 逐步切换:逐步切换到新数据存储,同时监控性能和扩展性问题。
在迁移过程中,团队使用 Apache Kafka 消费者从源数据库流式传输数据变更事件,并报告数据不一致,以帮助工程师分析数据问题。
总结
Reddit 通过整合媒体元数据存储到 AWS Aurora Postgres,显著简化了元数据管理并提高了系统性能。新架构通过分区、JSONB 存储和多阶段迁移策略,成功应对了数据量大、查询复杂和迁移困难的挑战,为未来的扩展和优化奠定了基础。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。