
1) 【一句话结论】:采用分层混合数据库架构,结合时序数据库(如InfluxDB)、宽表数据库(如ClickHouse)、文档数据库(如Elasticsearch),通过数据管道(Kafka)统一接入,并引入数据血缘与元数据管理,同时通过Exactly-Once语义和事务保障数据一致性,满足实时查询与离线分析需求。
2) 【原理/概念讲解】:首先,异构数据(结构化日志、非结构化文本、时序数据)需分场景存储。时序数据库(如InfluxDB)专为时间序列设计,支持高写入和低延迟时序查询(类比:设备心跳的实时监控,需快速获取最新状态)。宽表数据库(如ClickHouse的星型模式)用列式存储和维度建模,高效处理结构化日志的聚合查询(类比:按列存储所有用户行为,查询时只读取相关列,避免全表扫描)。文档数据库(如Elasticsearch)基于倒排索引,支持非结构化文本的全文检索(类比:给文本内容建索引,快速匹配关键词)。数据管道(Kafka)作为消息队列,解耦数据源与存储,保证数据可靠传输(类比:快递中转站,数据先到Kafka再分发)。同时,引入数据血缘管理,通过元数据表记录数据源、转换规则、存储位置,实现数据追溯;通过Kafka的Exactly-Once语义(事务日志+幂等消费)和各数据库的事务支持(如InfluxDB的transaction API),保障数据一致性。
3) 【对比与适用场景】:
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时序数据库(如InfluxDB) | 专为时间序列数据设计的数据库 | 高写入速率、毫秒级时序查询、支持聚合函数 | 实时监控(设备心跳、用户活跃度)、时序数据存储 | 不适合结构化日志的复杂关联查询 |
| 宽表数据库(如ClickHouse星型模式) | 列式存储的宽表模型数据库 | 高效聚合查询、支持复杂SQL、可扩展 | 离线分析(用户行为聚合、用户画像)、结构化日志存储 | 写入延迟较高,适合批处理 |
| 文档数据库(如Elasticsearch) | 基于倒排索引的文档存储 | 全文检索、高并发查询、支持JSON文档 | 非结构化文本(用户评论、日志文本)、搜索应用 | 不适合结构化数据的复杂关联查询 |
| 数据管道(Kafka) | 高吞吐量消息队列 | 解耦数据源与存储、保证数据可靠传输 | 统一数据接入、确保数据一致性 | 需配置分区和副本,避免数据丢失 |
| 元数据管理 | 记录数据血缘的元数据系统 | 数据源-转换规则-存储位置映射 | 数据追溯、数据质量监控 | 需与存储系统集成,实时更新 |
4) 【示例】:假设数据源包括APP日志(结构化,如用户ID、事件类型、时间戳)、网页点击日志(结构化,如用户ID、页面URL、时间戳)、设备日志(时序,如设备ID、心跳时间、在线时长)、用户评论(非结构化,如文本内容、时间戳)。
user_action_fact存储事件类型、时间、用户ID等;维度表user_dim、device_dim、time_dim存储用户属性、设备信息、时间维度)。设备日志写入时序数据库(InfluxDB),存储设备ID、心跳时间、在线时长等时序数据。用户评论写入Elasticsearch,存储文本内容和时间戳。metadata记录数据源(如“app_log”)、转换规则(如“Flink转换结构化日志”)、存储位置(如“ClickHouse事实表”),实现数据追溯。SELECT device_id FROM influxdb_device_log WHERE time >= now() - 1m GROUP BY device_id);查询用户行为聚合,从ClickHouse宽表模型中,通过SQL(如SELECT user_id, COUNT(event_type) FROM user_action_fact WHERE time >= now() - 1h GROUP BY user_id)获取用户活跃度。5) 【面试口播版答案】:面试官您好,针对360用户行为分析系统的异构数据存储需求,我设计的是分层混合数据库架构。核心思路是:实时数据用时序数据库(如InfluxDB)存储时序数据(设备心跳、用户活跃度),支持毫秒级查询;结构化日志用宽表模型(如ClickHouse的星型模式),通过事实表和维度表聚合数据,支持离线分析;非结构化文本用Elasticsearch,处理网页日志、用户评论等,支持全文检索。数据通过Kafka统一接入,保证数据一致性。同时引入数据血缘管理,记录数据源到存储的映射,便于追溯;通过Kafka的Exactly-Once语义(事务日志+幂等消费)和各数据库的事务支持(如InfluxDB的transaction API),保障数据写入原子性。离线分析时,从宽表和Elasticsearch抽取数据,用Spark进行用户画像构建,比如聚合用户行为、设备信息、文本内容,生成用户画像。这样既满足实时查询需求,又支持离线深度分析。
6) 【追问清单】:
7) 【常见坑/雷区】: