第十五章 设计谷歌云盘
理解问题并确定设计范围
关注以下功能:
- 添加文件
- 下载文件
- 多设备同步
- 查看文件不同版本
- 与人共享文件
- 文件被编辑、删除或与您共享时发送通知
高级设计
可恢复的上传
- 发送初始请求获取可恢复的URL
- 上传数据并且监控上传状态
- 中断后恢复上传
API
包含了上传、下载和获取修订版本的API,都设置用户身份验证、HTTPS。同时使用安全套接字(SSL)保护客户端和后端服务器之间的数据传输。
文件存储
从简单的根据user_ID分片到了解支持同一区域和跨区域复制的Amazon S3。其会将文件夹类似的东西复制存储在多个区域中
负载均衡
给Web服务器分配均匀分布的流量
同步冲突
多个用户同时编辑如何处理冲突,可参考差异同步和对应的[演讲](https://www.youtube.com/watch? v=S2Hp_1jqpY8)

组件介绍
主要关注两个:
- 通知系统:为发布/订阅模式
- 离线备份队列:当客户端离线无法及时拉取最新更改时,备份队列会存储信息直到用户在线完成同步
设计深入研究
块服务器、元数据库、上传流程、下载流程、通知服务、节省存储空间和故障处理
块服务器
对于定期更新的大文件,避免更新整个文件:
- 增量同步:将客户端上传的文件分割成块,使用rsync算法只更新同步的块
- 压缩:根据文件类型使用不同的压缩算法减少数据量例如文本文件使用gzip和bzip
- 分割成块
- 使用压缩算法压缩
- 发送到云存储之前进行加密
- 使用delta同步算法增量同步到云存储
数据强一致性
特征有:
- 缓存备份和主节点中的数据是一致的
- 数据库写入时要让缓存无效
关系型数据库有ACID特性,天然满足强一致性,对于NoSQL需要编程支持。
数据库设计

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

存在两个并行的上传流:
- 上传文件元数据:
- 客户端1发送请求上传文件元数据
- 将元数据存在MetaData DB,并修改文件上传状态为pending
- 提醒通知服务存在新文件在上传
- 通知服务提醒其余客户端2存在文件在上传
- 上传文件到云存储
- 客户端1将文件内容传输到块服务器
- 块服务器将其分块压缩加密传输到云存储
- 上传完成后,云存储触发上传完成回执,发送请求到API服务器
- 元数据库中对应的文件状态改为 uploaded
- 提醒通知服务有文件状态发生改变
- 通知服务通知相关客户端,有一个文件已上传完成
下载流
客户端如何得知文件已经被其他客户端添加或编辑?
- 客户端A在线时,文件由其它客户端更改,通知服务会通知客户端A
- 客户端离线时,更改数据会被保存到缓存中,当其再次上线时,它会拉取最新的更改
已知更改后的拉取流程:
- 通知服务通知客户端,文件在其他地方发生了更改
- 一旦客户端知道有新的更新可用,它就会发送请求以检索元数据。
- API 服务器调用元数据数据库以检索更改的元数据。
- 元数据返回给 API 服务器。
- 客户端 获取元数据。
- 一旦客户端收到元数据,它就会发送请求以从块服务器下载块。
- 块服务器首先从云存储下载块。
- 云存储将块返回给块服务器。
- 客户端下载所有新块以重建文件。
通知服务
为保持文件一致性,本地执行的任何文件更改都需通知其他客户端以减少冲突。本章使用通知服务在事件发生时将数据传给用户,实现方式有两种:
- 长轮询:Dropbox使用的技术
- WebSocket:双向通信的持续连接
最终选择的是长轮询,因为通信并不需要双向,其次通知发送频率低,没有突发数据。
每个客户端都与通知服务建立长连接,一旦检测到文件更改,客户端会关闭长连接强制其重新连接到元数据服务器下载最新更改。收到响应或超时后,客户端会立刻发送新请求保持连接。
节省存储空间
为了支持多版本和可靠性,同文件多版本存储在多个中心,有很大的存储压力。以下措施用于降低存储成本:
- 删除重复数据块:在账户级别消除融于块,它们哈希值相同则内容相同
- 智能数据备份策略:限制存储的版本数量、筛选有价值的版本、冷存储不常用数据
故障处理
- 负载均衡器:负载均衡器之间使用心跳判断是否在线,使用次级负载均衡器接管流量
- 块服务器故障:其他服务器接管
- 云存储故障:S3 bucket存在跨区域多次复制
- API服务器故障:作为无状态服务器,流量会被负载均衡到其他服务器
- 元数据缓存服务器:同样跨节点多次复制,可启动新的服务器
- 主节点宕机:存在协议选举新的主节点
- 从节点宕机
总结
- 具有强一致性、低网络带宽和快速同步的特性
- 包含管理文件元数据和文件同步两个流
- 使用长轮询保持客户端数据最新的通知服务
2025年7月31日阅读文档
浙公网安备 33010602011771号