Skip to content

P11 如何设计分布式日志存储架构 ​

面试题:微服务/分布式系统里,日志散落在各个机器上,怎么统一收集、存储和查询?

典型架构:ELK / EFK ​

text
应用日志 → Logback/Log4j2 输出 → Filebeat/Logstash 采集 → Kafka 缓冲 → Logstash 过滤 → ES 存储 → Kibana 展示

核心组件 ​

组件作用
采集端(Filebeat/Logstash)从各节点读取日志文件/直接推送,轻量采集
缓冲层(Kafka)削峰、解耦,防止日志洪峰打垮 ES
加工层(Logstash)解析、过滤、脱敏、格式化
存储(Elasticsearch)分布式全文检索,按天/按索引分片
展示(Kibana)搜索、看板、告警

关键设计点 ​

1. 全链路追踪(TraceID) ​

分布式系统最关键的是把一次请求的日志串起来:

  • 网关/入口生成 traceId,通过 RPC 透传(Header);
  • 日志格式统一带上 traceId、userId、服务名、时间;
  • 在 Kibana 里按 traceId 一键查看整条调用链。

2. 日志规范 ​

  • 统一 JSON 格式输出,方便解析;
  • 分级(DEBUG/INFO/WARN/ERROR),线上默认 INFO;
  • 敏感信息(密码、身份证)脱敏后再落日志。

3. 存储与容量 ​

  • ES 索引按天/按月滚动,老索引自动删除或归档冷存储;
  • 控制日志保留周期(如 7~30 天);
  • 采集侧限流:单机日志量过大时降级采样。

4. 高可用与性能 ​

  • Kafka 缓冲层保证日志不丢、ES 不被冲垮;
  • 采集端异常不影响业务(异步、丢日志不阻塞业务线程);
  • 查询性能:按时间范围 + 关键词 + traceId 设计索引。

加分点 ​

  • 日志量巨大时可用 Loki(轻量、只索引标签)替代 ES;
  • 离线日志(如访问日志分析)可落到 HDFS/对象存储 + Spark 分析;
  • 统一打点 + 指标(Metrics)配合日志做故障定位。

一句话总结 ​

Filebeat 采集 → Kafka 削峰 → Logstash 加工 → ES 存储检索 → Kibana 展示,配合全链路 traceId 透传,实现分布式日志的统一收集、关联查询与快速排障。

基于 VitePress 重建