51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

佳都科技的城市大脑平台需要存储和处理海量视频数据(PB级),请设计视频数据的存储方案,并说明如何优化查询性能(如按时间、区域、事件类型检索),包括索引设计、分片策略、缓存策略。

佳都科技产品/算法/C++/java/测试/电子/电气等工程师难度:中等

答案

【一句话结论】
采用分层存储架构,结合多维度分片(时间+区域+事件)和多级索引(对象存储时间/区域索引+搜索引擎倒排索引),通过内存+SSD缓存热点数据,支撑PB级视频的高效存储与多维度查询(时间、区域、事件类型检索)。

【原理/概念讲解】
老师口吻,解释各组件与策略:

  • 对象存储(如Ceph、MinIO):作为“冷数据仓库”,存储PB级原始视频文件,具备高容量、高扩展性,适合长期存储。类比:视频的“大仓库”,存放海量视频,占用空间大但查询频率低。
  • 时序数据库(如InfluxDB、TimescaleDB):存储视频元数据(时间戳、区域ID、事件类型等),专为时间序列数据设计,支持高效的时间范围聚合与检索。类比:视频的“元数据账本”,记录每个视频的时间、位置、事件,方便按时间线查询。
  • 搜索引擎(如Elasticsearch):提供复杂多维度检索能力,通过倒排索引实现事件类型、区域、时间范围的快速匹配。类比:视频的“检索大脑”,能快速找到符合时间、位置、事件的视频。
  • 分片策略:按“时间+区域+事件”多维度切分数据,例如按天分片时间数据(如2023-01-01~2023-01-02为1个分片)、按城市ID分片区域数据(如北京、上海为独立分片)、按事件类型ID分片事件数据(如交通事故、盗窃为独立分片),查询时仅访问对应分片,减少数据扫描量。
  • 索引设计:对象存储的元数据建立时间索引(按时间戳排序)和区域索引(按城市ID分组);搜索引擎建立倒排索引(事件类型、区域、时间范围),支持“时间+区域+事件”的复杂查询。
  • 缓存策略:内存缓存(Redis)存储热点元数据(如最近24小时的视频元数据);SSD缓存热点视频片段(如最近24小时视频的前几秒),提升高频查询速度。

【对比与适用场景】

组件/策略定义特性使用场景注意点
对象存储(如Ceph)分布式文件系统,存储大文件高容量、高扩展性、高可用,适合冷数据原始视频存储(PB级)需元数据索引辅助查询,单文件大小限制(如Ceph支持大文件)
时序数据库(如InfluxDB)专为时间序列数据设计时间范围查询高效、支持聚合(如求和、计数)视频元数据(时间、区域、事件)不适合存储大文件,数据量过大时需分片
搜索引擎(如Elasticsearch)分布式全文检索引擎复杂查询(多维度)高效,支持实时索引视频检索(时间、区域、事件)需索引维护成本,索引更新延迟
时间分片按时间维度切分数据时间查询高效,按时间范围过滤按时间检索(如最近24小时)时间粒度影响查询粒度(如按天/小时)
区域分片按空间维度切分数据区域查询高效,按城市/区域过滤按区域检索(如某城市)区域划分需合理,避免数据倾斜
事件分片按事件类型切分数据事件类型查询高效,按事件类型过滤按事件类型检索(如交通事故)事件类型数量影响分片数,避免分片过多导致管理复杂

【示例】

  • 分片键设计(伪代码):
function getShardKey(videoId, timestamp, regionId, eventType) {
    return `${timestamp.substring(0,10)}-${regionId}-${eventType}`;
}
// 示例:20230101-beijing-traffic_accident
  • 查询示例(Elasticsearch请求):
{
  "query": {
    "bool": {
      "must": [
        {"range": {"timestamp": {"gte": "2023-01-01T00:00:00", "lte": "2023-01-31T23:59:59"}}},
        {"term": {"region_id": "beijing"}},
        {"term": {"event_type": "traffic_accident"}}
      ]
    }
  }
}

【面试口播版答案】
面试官您好,针对佳都科技城市大脑的PB级视频存储与查询优化问题,我的核心方案是构建分层存储架构,结合多维度分片和索引设计。首先,原始视频数据采用对象存储(如Ceph)存储,利用其高容量和扩展性;视频元数据(时间、区域、事件)则存入时序数据库(如InfluxDB)和搜索引擎(如Elasticsearch)。查询优化方面,分片策略上采用时间+区域+事件的多维度分片,比如按天分片时间数据,按城市分片区域数据,按事件类型分片事件数据,这样查询时只需访问对应分片,减少数据扫描量。索引设计上,对象存储的元数据建立时间索引和区域索引,搜索引擎建立倒排索引(事件类型、区域、时间范围),支持复杂查询。缓存策略上,使用Redis缓存热点元数据(如最近24小时的视频元数据),SSD缓存热点视频片段(如最近24小时的视频前几秒),提升查询速度。这样整体方案既能支撑PB级数据的存储,又能高效处理时间、区域、事件类型的查询。

【追问清单】

  • 问题:如何保障对象存储与元数据存储(时序数据库)之间的数据一致性?
    回答要点:采用分布式事务(如两阶段提交)或消息队列(如Kafka)异步同步,确保元数据更新后,对象存储的元数据也同步,避免查询错误。
  • 问题:缓存击穿、缓存雪崩如何解决?
    回答要点:缓存击穿用互斥锁(分布式锁,如Redis分布式锁)保证热点数据只加载一次;缓存雪崩用热点数据预加载(提前加载可能被查询的数据),或设置缓存过期时间不统一(随机化过期时间)。
  • 问题:分片粒度如何选择?
    回答要点:根据数据量和查询频率,时间分片按天/小时,区域分片按城市/区域ID,事件分片按事件类型ID,平衡查询粒度和数据量,避免分片过多导致管理复杂或分片过粗导致查询效率低。
  • 问题:实时性要求下如何优化?
    回答要点:对于实时查询,优先从内存缓存和SSD缓存获取,若缓存未命中,再从对象存储和时序数据库读取,并考虑使用CDN加速热点视频片段的访问。

【常见坑/雷区】

  • 忽略数据一致性:多存储组件间数据不一致,导致查询结果错误,需设计一致性保障机制(如事务、消息队列)。
  • 分片策略不合理:分片粒度过细或过粗,影响查询效率,需根据业务场景调整分片维度。
  • 缓存未考虑热点数据:未区分冷热数据,导致缓存命中率低,需设计多级缓存(内存+SSD),并优化缓存淘汰策略(如LRU)。
  • 未设计容灾与备份:PB级数据丢失风险高,需考虑数据冗余(如对象存储的副本机制)、备份策略(如定期备份)。
  • 未考虑索引维护成本:搜索引擎索引更新延迟可能导致查询结果滞后,需优化索引更新策略(如增量更新)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1