1) 【一句话结论】
核心是构建“分布式存储+多级索引+CDN分层”架构,通过对象存储存储原始视频、元数据用NoSQL管理、检索结合时间与倒排索引、传输分片+CDN缓存,实现百万级视频的高效存储、快速检索与CDN分发。
2) 【原理/概念讲解】
老师口吻解释关键概念:
- 数据模型:视频实体包含原始文件路径、元数据(时间戳、关键词、标签)和缩略图。元数据是检索的核心,比如时间戳用于时间检索,关键词/标签用于内容检索。类比:视频像“一本书”,元数据是“书的目录、标签”,方便快速定位。
- 存储方案:底层用对象存储(如S3)存储原始视频,因对象存储适合海量非结构化数据、高扩展性;上层用分布式文件系统(如Ceph)做冗余与扩展,保证高可用。元数据存储在NoSQL(如MongoDB)中,因NoSQL支持灵活文档结构,适合元数据多字段存储。类比:对象存储是“仓库”,分布式文件系统是“仓库的货架”,元数据是“仓库的库存清单”。
- 检索策略:时间检索用时间分片索引(如按天分片),每个时间片存储对应时间范围内的视频ID,快速定位时间范围;关键词/标签检索用倒排索引,将关键词映射到视频ID列表,结合搜索引擎(如Elasticsearch)实现全文检索,提升效率。类比:时间索引像“时间日历”,倒排索引像“关键词字典”,检索时先查日历定位时间,再查字典找关键词,快速找到视频。
- 传输优化:视频分片(如按10分钟分片),将大视频拆成小片段,降低单次传输压力,提升CDN缓存效率;CDN边缘节点缓存热门视频,减少回源请求,动态路由选择最优路径(如根据用户地理位置选最近CDN节点)。类比:视频分片像“切蛋糕”,CDN缓存像“放在冰箱的热门蛋糕”,传输时先从冰箱拿,不够再切蛋糕。
3) 【对比与适用场景】
| 方案类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|
| 存储方案-对象存储 | 基于对象存储模型,通过Key-Value存储文件 | 高扩展性、高可用、适合海量非结构化数据 | 视频原始文件存储 | 需要元数据管理 |
| 存储方案-分布式文件系统 | 分布式架构,提供文件系统接口 | 高并发读写、数据冗余 | 视频缩略图、元数据文件 | 管理复杂度 |
| 检索策略-倒排索引 | 存储关键词到文档ID的映射 | 检索速度快,支持多关键词 | 关键词/标签检索 | 构建成本高 |
| 检索策略-时间索引 | 按时间范围分片存储索引 | 时间范围检索高效 | 时间检索 | 时间粒度依赖分片 |
4) 【示例】
- 存储流程:
上传视频到对象存储(如S3),生成视频ID(如vid_001);
元数据写入MongoDB:{video_id: "vid_001", timestamp: "2023-01-01 10:00", keywords: ["游戏", "竞技"], tags: ["FPS"], thumbnail: "thumb_001.jpg"};
Elasticsearch构建倒排索引:{"游戏": ["vid_001"], "竞技": ["vid_001"]};
时间索引按天分片:2023-01-01分片存储包含vid_001的视频ID。
- 检索示例:用户查询“游戏”标签且时间在2023-01-01到2023-01-31的视频:
- 查询Elasticsearch倒排索引,得到候选视频ID列表:
["vid_001"];
- 查询时间索引,过滤2023-01-01到2023-01-31的时间片,确认
vid_001在该范围内;
- 从对象存储获取
vid_001对应的原始视频文件。
5) 【面试口播版答案】
“面试官您好,针对百万级游戏视频的存储与检索系统,我的核心方案是采用“分布式存储+多级索引+CDN分层”架构。首先数据模型上,视频实体包含原始文件路径、元数据(时间戳、关键词、标签)和缩略图,元数据存入MongoDB,原始视频用对象存储(如S3)存储。存储方案上,底层用对象存储存储原始视频,上层用分布式文件系统(如Ceph)做冗余,元数据用NoSQL管理。检索策略上,时间检索用时间分片索引(按天),关键词/标签用Elasticsearch的倒排索引,结合全文检索提升效率。传输优化上,视频分片(按10分钟),CDN边缘节点缓存热门视频,动态路由选择最优路径。这样能实现海量存储、快速检索和高效传输。”
6) 【追问清单】
- 问题1:如何处理视频的版本更新?
回答要点:通过对象存储的版本号机制,或元数据中的版本字段,确保旧版本不丢失,新版本可快速检索。
- 问题2:检索时的性能瓶颈如何优化?
回答要点:增加索引分片(如时间索引按小时分片),使用缓存(如Redis)缓存热门检索结果,减少数据库/搜索引擎压力。
- 问题3:存储成本如何控制?
回答要点:对象存储按需付费,冷热数据分离(热数据存对象存储,冷数据存低成本存储如HDFS),视频分片降低存储成本。
- 问题4:缩略图生成与存储的优化?
回答要点:缩略图生成用异步任务(如Celery),缩略图存储在CDN边缘节点,与视频同步缓存。
- 问题5:多租户场景下的隔离?
回答要点:通过租户ID作为前缀(如tenant_a/vid_001),或使用独立数据库/索引,确保数据隔离。
7) 【常见坑/雷区】
- 坑1:忽略元数据管理,导致检索效率低(如仅存储视频文件,无法按时间/关键词检索)。
- 坑2:未考虑CDN与存储协同,传输优化不足(如直接从对象存储回源,未用CDN缓存;未分片视频导致传输延迟)。
- 坑3:检索策略单一(如仅用倒排索引,时间检索效率低;或仅用时间索引,无法支持关键词检索)。
- 坑4:存储方案未考虑扩展性(如仅用对象存储,元数据存储瓶颈)。
- 坑5:未考虑容灾与备份(如对象存储未启用多区域复制,数据丢失风险高)。