
1) 【一句话结论】
采用分层架构(元数据层+数据层),结合动态分块(256MB+Snappy压缩)、一致性哈希+虚拟节点分片、热数据三副本+冷数据纠删码冗余,通过HTTP/2+分块上传通信,旨在实现PB级存储、低延迟访问和高吞吐量。
2) 【原理/概念讲解】
系统核心是分层架构与关键工程优化,分述如下:
架构设计:
数据分片:
采用一致性哈希算法+虚拟节点(如每个物理节点对应10个虚拟节点),将对象ID哈希映射到存储节点。扩容时只需将新节点加入哈希环,数据迁移量小(类比:图书馆按书名哈希将书籍分配到不同书架,扩容时只需增加新书架,旧书架书籍无需大规模移动)。
冗余策略:
网络通信:
采用HTTP/2协议+分块上传(Multipart Upload),客户端通过REST API请求,支持长连接减少请求开销;数据层提供连接池(复用TCP连接),减少建立连接的时间;重试机制(指数退避,如首次重试1秒,第二次2秒,指数增长)处理网络波动。
3) 【对比与适用场景】
| 对比维度 | 一致性哈希+虚拟节点 | 范围分片(对象ID排序) | 三副本(热数据) | 纠删码(冷数据) |
|---|---|---|---|---|
| 定义 | 对象ID哈希映射到节点 | 对象ID排序按范围分配 | 数据写入时复制3份 | 数据编码为6+2校验码 |
| 特性 | 动态扩容易,负载均衡好 | 扩容数据迁移少,负载均匀 | 成本低,可用性高 | 节省存储空间,故障恢复慢 |
| 使用场景 | 云存储(动态扩容) | 数据有序且扩容频繁(如日志系统) | 热数据(访问频繁) | 冷数据(归档、备份) |
| 注意点 | 节点故障数据迁移多 | 节点故障数据迁移多 | 副本数少,冗余低 | 校验码计算复杂,故障恢复时间长 |
4) 【示例】
客户端上传文件“hot_video.mp4”(假设大小10GB),流程如下:
/v1/blobs?container=videos&name=hot_video.mp4),元数据服务返回分片信息:
{
"blobId": "xyz789",
"chunks": [
{"chunkId": "ch1", "location": "nodeA:9000"},
{"chunkId": "ch2", "location": "nodeB:9000"},
...
]
}
5) 【面试口播版答案】
面试官您好,针对PB级分布式对象存储需求,我设计的系统核心是分层架构与关键工程优化。首先,架构分为元数据层(管理对象元数据、命名空间,用Redis缓存热点元数据)和数据层(存储实际数据块,分块大小设为256MB并支持Snappy压缩)。数据分片采用一致性哈希算法+虚拟节点,将对象ID哈希映射到存储节点,实现负载均衡和动态扩容。冗余策略采用热数据三副本(成本可控,故障率低时足够)和冷数据纠删码(节省存储空间),平衡成本与可用性。网络通信采用HTTP/2+分块上传,支持长连接和连接池,提升高吞吐。这样整体满足PB级存储、低延迟访问和高吞吐量的需求。
6) 【追问清单】
7) 【常见坑/雷区】