题目重点:从日志源到中心存储设计可靠入口、冷热两层查询、索引与保留期限,区分本题和用户行为指标系统。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练场景是多服务应用日志,有 tenant、source、event_time、ingest_time、severity、trace_id、message 等字段;这不是题目明确 schema。
- ‘3 个月’按日历月还是固定 90 天需确认;示例只做最长 3 个月可查,不能据此决定法律保留/删除策略。
解题路线
- 采集代理按源服务批量读取日志并赋稳定 source+offset/日志 ID,压缩传输到中心入口;入口认证、大小限制、脱敏后先写耐久队列或对象存储,再确认发送端。断网时代理有有界磁盘缓冲和可观测丢弃策略。
- 热路径为最近几小时/天的低延迟排障查询:按 tenant/time/source 建索引,trace_id 精确查询可另设索引;不要把任意 message 模糊匹配说成无需全文索引。
- 冷路径保留三个月压缩原始分区、按时间/租户组织;较老日志可异步查询/恢复,给用户 job ID 与延迟预期。热转冷和过期删除以事件时间还是入库时间为准需固定,否则迟到数据会漏。
- 写入可能重试重复:查询展示可按日志 ID 去重,保留原始副本供审计;时间戳乱序查询用 event_time 排序且显示 ingest_time。权限隔离按租户/项目/敏感字段执行,查询操作本身记审计。
- 容量先算每日事件数 E×平均字节 B×保留天数,再乘索引和副本系数;采集峰值、压缩比和实际日志大小未给,不填具体集群节点数。
手动走一遍
服务 A 产生 error 日志,代理批传送但确认丢失,于是重发同一 source+offset;中心接收可保留两份原始传输记录,但检索只显示一条逻辑日志。值班人员按最近 10 分钟 trace_id 查询热索引;合规人员查两个月前同租户时间范围走冷层异步任务。
规模与取舍
写入随 E 线性;时间范围查询扫描所选时间分区和匹配索引项,不能对无索引任意全文查询承诺固定延迟。三个月原始存储约 O(E×B×D),D 为保留天数,索引和副本另计。
易错点与追问
容易失分的边界
- 直接让每个应用同步写中心数据库,中心故障拖垮业务请求。
- 只保留近期索引,却承诺三个月所有日志都同样低延迟。
- 忘了租户权限、敏感字段和查询审计。
- event_time/ingest_time 混用,迟到日志落到错误保留分区。
- 把本题当 q9 的用户点击指标聚合,只存数字而丢排障日志原文。
继续深挖
- 中心断网 30 分钟时边缘缓冲怎么定上限?
- 日志消息含 PII 如何脱敏与控制访问?
- 三个月旧日志全文搜索如何控制成本?
- 何时按 event_time,何时按 ingest_time 做 TTL?
