第十五章 设计谷歌云盘

理解问题并确定设计范围

关注以下功能:

  • 添加文件
  • 下载文件
  • 多设备同步
  • 查看文件不同版本
  • 与人共享文件
  • 文件被编辑、删除或与您共享时发送通知

高级设计

可恢复的上传

  • 发送初始请求获取可恢复的URL
  • 上传数据并且监控上传状态
  • 中断后恢复上传

API

包含了上传、下载和获取修订版本的API,都设置用户身份验证、HTTPS。同时使用安全套接字(SSL)保护客户端和后端服务器之间的数据传输。

文件存储

从简单的根据user_ID分片到了解支持同一区域和跨区域复制的Amazon S3。其会将文件夹类似的东西复制存储在多个区域中

负载均衡

给Web服务器分配均匀分布的流量

同步冲突

多个用户同时编辑如何处理冲突,可参考差异同步和对应的[演讲](https://www.youtube.com/watch? v=S2Hp_1jqpY8)

ch15-3

组件介绍

主要关注两个:

  • 通知系统:为发布/订阅模式
  • 离线备份队列:当客户端离线无法及时拉取最新更改时,备份队列会存储信息直到用户在线完成同步

设计深入研究

块服务器、元数据库、上传流程、下载流程、通知服务、节省存储空间和故障处理

块服务器

对于定期更新的大文件,避免更新整个文件:

  • 增量同步:将客户端上传的文件分割成块,使用rsync算法只更新同步的块
  • 压缩:根据文件类型使用不同的压缩算法减少数据量例如文本文件使用gzip和bzip
  1. 分割成块
  2. 使用压缩算法压缩
  3. 发送到云存储之前进行加密
  4. 使用delta同步算法增量同步到云存储

数据强一致性

特征有:

  • 缓存备份和主节点中的数据是一致的
  • 数据库写入时要让缓存无效
    关系型数据库有ACID特性,天然满足强一致性,对于NoSQL需要编程支持。

数据库设计

ch15-1

  • 用户:个人
  • 设备:用于发送或接收消息的终端
  • 个人空间:单个用户的根目录
  • 文件:最近文件的所有信息
  • 文件版本:文件历史,已有行是只读的保证历史完整性
  • 块:文件块的所有信息,可以组合得到任意版本文件

上传流

ch15-2

存在两个并行的上传流:

  • 上传文件元数据:
    1. 客户端1发送请求上传文件元数据
    2. 将元数据存在MetaData DB,并修改文件上传状态为pending
    3. 提醒通知服务存在新文件在上传
    4. 通知服务提醒其余客户端2存在文件在上传
  • 上传文件到云存储
    1. 客户端1将文件内容传输到块服务器
    2. 块服务器将其分块压缩加密传输到云存储
    3. 上传完成后,云存储触发上传完成回执,发送请求到API服务器
    4. 元数据库中对应的文件状态改为 uploaded
    5. 提醒通知服务有文件状态发生改变
    6. 通知服务通知相关客户端,有一个文件已上传完成

下载流

客户端如何得知文件已经被其他客户端添加或编辑?

  • 客户端A在线时,文件由其它客户端更改,通知服务会通知客户端A
  • 客户端离线时,更改数据会被保存到缓存中,当其再次上线时,它会拉取最新的更改
    已知更改后的拉取流程:
  1. 通知服务通知客户端,文件在其他地方发生了更改
  2. 一旦客户端知道有新的更新可用,它就会发送请求以检索元数据。
  3. API 服务器调用元数据数据库以检索更改的元数据。
  4. 元数据返回给 API 服务器。
  5. 客户端 获取元数据。
  6. 一旦客户端收到元数据,它就会发送请求以从块服务器下载块。
  7. 块服务器首先从云存储下载块。
  8. 云存储将块返回给块服务器。
  9. 客户端下载所有新块以重建文件。

通知服务

为保持文件一致性,本地执行的任何文件更改都需通知其他客户端以减少冲突。本章使用通知服务在事件发生时将数据传给用户,实现方式有两种:

  • 长轮询:Dropbox使用的技术
  • WebSocket:双向通信的持续连接
    最终选择的是长轮询,因为通信并不需要双向,其次通知发送频率低,没有突发数据。

每个客户端都与通知服务建立长连接,一旦检测到文件更改,客户端会关闭长连接强制其重新连接到元数据服务器下载最新更改。收到响应或超时后,客户端会立刻发送新请求保持连接。

节省存储空间

为了支持多版本和可靠性,同文件多版本存储在多个中心,有很大的存储压力。以下措施用于降低存储成本:

  • 删除重复数据块:在账户级别消除融于块,它们哈希值相同则内容相同
  • 智能数据备份策略:限制存储的版本数量、筛选有价值的版本、冷存储不常用数据

故障处理

  • 负载均衡器:负载均衡器之间使用心跳判断是否在线,使用次级负载均衡器接管流量
  • 块服务器故障:其他服务器接管
  • 云存储故障:S3 bucket存在跨区域多次复制
  • API服务器故障:作为无状态服务器,流量会被负载均衡到其他服务器
  • 元数据缓存服务器:同样跨节点多次复制,可启动新的服务器
  • 主节点宕机:存在协议选举新的主节点
  • 从节点宕机

总结

  • 具有强一致性、低网络带宽和快速同步的特性
  • 包含管理文件元数据和文件同步两个流
  • 使用长轮询保持客户端数据最新的通知服务

2025年7月31日阅读文档

posted @ 2025-08-01 00:47  tanch25  阅读(12)  评论(0)    收藏  举报