
1) 【一句话结论】采用分层存储架构(对象存储为核心存储层、CDN为边缘缓存层、本地节点为热点缓存层),结合多副本高可用机制与负载均衡策略,在保证高可用、低延迟的同时,通过对象存储的按需付费、边缘节点共享等手段控制成本。
2) 【原理/概念讲解】分布式文件存储的核心是“分而治之”,将大文件拆分为对象(如S3的Object模型),每个对象有唯一ID,存储在分布式节点上。高可用需通过多副本(如3副本)+跨区域复制实现,避免单点故障。低延迟则依赖分层缓存:本地节点缓存热点视频(如最近一周访问量高的课程),CDN边缘节点缓存区域内的热门视频,用户请求优先从本地/边缘获取。负载均衡采用一致性哈希+动态权重调整,将请求分发到负载低的节点,同时结合请求频率(热点数据优先分配更多资源)。
类比:对象存储就像一个“分布式仓库”,每个视频是“货物”,仓库分布在多个节点(高可用);CDN是“区域快递点”,把热门货物放在离用户近的地方(低延迟);本地缓存是“用户家门口的快递柜”,最近访问的货物放在柜子里(热点缓存)。
3) 【对比与适用场景】
存储架构对比:
| 架构类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 对象存储(如S3) | 基于对象的分布式存储,通过Key-Value模型存储数据 | 高扩展性、多副本、按需付费 | 大文件存储(视频)、非结构化数据 | 需要客户端API操作,不适合小文件频繁读写 |
| 块存储(如Ceph) | 基于块的分布式存储,提供高性能I/O | 高性能、高并发、自愈 | 需要直接I/O的应用(如数据库) | 配置复杂,成本较高 |
缓存策略对比:
| 策略 | 定义 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| LRU(最近最少使用) | 移除最近最久未使用的缓存项 | 简单高效,适合热点数据 | 可能误判(如“伪共享”),冷启动慢 | 本地缓存、边缘缓存(默认) |
| LFU(最不经常使用) | 移除访问频率最低的缓存项 | 更准确反映访问频率 | 计算复杂度较高 | 热点数据缓存(如视频) |
| 最小使用时间(MUT) | 移除使用时间最长的缓存项 | 适合时间敏感数据 | 需要记录时间戳 | 时效性强的缓存(如直播) |
4) 【示例】以用户请求“课程A-视频1.mp4”为例,流程如下:
伪代码(请求处理流程):
def handle_video_request(video_id):
# 1. 检查本地缓存(边缘节点)
if local_cache.has(video_id):
return local_cache.get(video_id)
# 2. 查找对象存储节点(一致性哈希)
storage_node = consistent_hash.get_node(video_id)
# 3. 从对象存储获取数据
video_data = storage_node.get(video_id)
# 4. 缓存到本地和边缘
local_cache.set(video_id, video_data)
edge_cache.set(video_id, video_data, ttl=3600) # 边缘缓存1小时
return video_data
5) 【面试口播版答案】
“面试官您好,我设计的分布式文件存储系统采用分层架构:核心层用对象存储(如MinIO)存储视频,通过多副本实现高可用;边缘层用CDN(如阿里云CDN)缓存区域内的热门视频,降低延迟;本地节点缓存最近访问的热点视频。负载均衡采用一致性哈希+动态权重,将请求分发到负载低的节点,同时结合访问频率调整权重。这样既保证了高可用、低延迟,又通过对象存储的按需付费和边缘节点共享降低了成本。”
6) 【追问清单】
7) 【常见坑/雷区】