题目
设计一个支持 PB 级日志的实时分析系统
信息
- 类型:问答
- 难度:⭐⭐⭐
考点
分布式系统设计,实时数据处理,容错机制,存储优化,查询性能
快速回答
设计要点:
- 分层架构:日志采集层(Fluentd/Filebeat)→ 消息队列层(Kafka/Pulsar)→ 流处理层(Flink/Spark)→ 存储层(Elasticsearch/Cassandra)→ 查询层
- 实时处理:使用流处理引擎实现窗口聚合和实时告警
- 存储优化:冷热数据分层存储 + 列式压缩(Parquet/ORC)
- 容错机制:Exactly-once 语义 + 副本策略 + 自动故障转移
- 查询加速:预聚合 + 倒排索引 + 缓存机制
1. 系统架构设计
核心组件:
- 采集层:轻量级Agent(Filebeat/Fluentd)支持断点续传
- 传输层:Kafka(分区+副本)保障高吞吐,保留策略:
log.retention.bytes=1TB - 处理层:Flink实现窗口计算(示例代码):
DataStream<LogEntry> stream = env .addSource(kafkaSource) .keyBy(LogEntry::getServiceId) .timeWindow(Time.seconds(30)) .aggregate(new ErrorCountAggregator()); - 存储层:
- 热数据:Elasticsearch(倒排索引)
- 冷数据:S3 + Parquet格式(压缩比10:1)
- 查询层:Presto/Trino统一查询接口
2. 关键挑战解决方案
| 挑战 | 解决方案 |
|---|---|
| 数据丢失 | Kafka ACKS=all + Flink Checkpointing |
| 热点写入 | 动态分区键(服务ID+时间戳哈希) |
| 长尾查询 | 异步IO + 结果分页(Search After) |
| 存储成本 | ZSTD压缩 + TTL自动清理 |
3. 容错机制设计
三级保障:
- 生产者:本地队列 + 重试策略(指数退避)
- 处理层:Flink Savepoint(版本兼容)
- 存储层:ES分片副本(
index.number_of_replicas=2)
4. 性能优化实践
- 写入优化:批量提交(
batch.size=32KB) - 索引优化:禁用
_all字段 + 合理分片数(数据量/50GB) - 查询优化:
- 预计算高频指标(错误率/延迟P99)
- 路由过滤:
GET /logs-2023*/_search?preference=_shards:2
5. 常见错误
- ❌ 单点故障:未设置Kafka ISR最小副本数
- ❌ 配置错误:ES堆内存超过32GB(引发指针压缩失效)
- ❌ 资源争抢:未隔离写入和查询资源
6. 扩展知识
- 数据湖架构:Delta Lake事务日志
- 新兴技术:Apache Pinot实时OLAP
- 成本控制:基于访问频率的自动降档(S3 Intelligent-Tiering)