Facebook 如何扩展其社交图谱存储?TAO
· 阅读需 2 分钟
面临的挑战是什么?
在 TAO 之前,使用缓存旁路模式
社交图谱数据存储在 MySQL 中,并缓存于 Memcached 中
三个问题:
- Memcached 中的列表更新操作效率低。无法追加,只能更新整个列表。
- 客户端必须管理缓存
- 难以提供 ==读后写一致性==
为了解决这些问题,我们有三个目标:
- 高效扩展的在线数据图服务
- 优化读取(其读写比为 500:1)
- 低读取延迟
- 高读取可用性(最终一致性)
- 写入的及时性(读后写)
数据模型
- 具有唯一 ID 的对象(例如用户、地点、评论)
- 两个 ID 之间的关联(例如标签、喜欢、作者)
- 两者都有键值数据以及时间字段
解决方案:TAO
-
高效扩展并减少读取延迟
-
写入及时性
- 写透缓存
- 领导/跟随缓存以解决雷鸣般的拥挤问题
- 异步复制
-
读取可用性
- 读取故障转移到备用数据源
TAO 的架构
- MySQL 数据库 → 持久性
- 领导缓存 → 协调对每个对象的写入
- 跟随缓存 → 提供读取但不提供写入。将所有写入转发给领导。
读取故障转移