公司服务器每天生成上GB的日志文件,运维小李打开监控一看,内存占用飙到85%,CPU也时不时“冒烟”。一查原因,原来是日志收集服务在后台疯狂吃资源。这种情况在大数据场景下太常见了——日志本是用来排查问题的,结果自己倒成了系统瓶颈。
别让日志拖垮系统
很多团队一开始没把日志当回事,直接用默认配置往磁盘写。但随着业务量上升,日志量呈指数增长。比如一个电商平台,用户每点击一次商品,后端就记录一条访问日志,加上订单、支付、登录等行为,一天轻松破亿条。如果不加控制,光是日志写入和解析就能占满磁盘IO和内存。
压缩与分片:从源头减负
最直接的办法是在写入阶段就做轻量化处理。比如用gzip压缩日志文件,虽然会增加一点CPU开销,但能节省70%以上的磁盘空间。同时,按时间或大小切分日志块,避免单个文件过大导致读取困难。
filebeat.inputs:\n- type: log\n paths:\n - /var/log/app/*.log\n scan_frequency: 10s\n close_eof: true\n backoff: 1s\n max_bytes: 10485760 # 单条最大10MB\n fields:\n env: production\n fields_under_root: true
上面是Filebeat的一个配置片段,通过控制扫描频率、单条大小限制和自动关闭机制,有效降低对源系统的压力。
异步写入+缓冲队列
直接把日志往Elasticsearch里怼?小心集群被压垮。更稳妥的方式是加一层消息队列中转,比如Kafka。应用先把日志发到Kafka,再由消费程序批量导入ES。这样即使下游处理慢,也不会反向阻塞业务系统。
Kafka还能做流量削峰。大促期间日志暴增,Kafka可以暂存数据,让后端按能力逐步消化,避免瞬时高负载把数据库打挂。
冷热数据分离
不是所有日志都需要高性能存储。最近一小时的日志可能要实时查询,得放SSD;但三个月前的日志基本没人看,完全可以归档到便宜的HDD甚至对象存储里。
Elasticsearch的ILM(Index Lifecycle Management)策略就能自动完成这个过程:热阶段用高速节点,温阶段降配,冷阶段冻结并迁移。一套策略下来,存储成本能砍掉一半不止。
采样与过滤:该舍就舍
有些日志其实价值很低。比如健康检查接口每秒调用几十次,全记下来纯属浪费。可以在采集层做过滤:
filter {\n if [request] =~ "^/health" {\n drop {}\n }\n if [response_code] == 200 and [bytes] > 1024 {\n mutate {\n remove_field => ["stack_trace"]\n }\n }\n}
Logstash这段配置直接丢弃健康检查日志,并在正常响应时移除无用字段。省下的不只是存储,还有传输和索引开销。
监控自身,及时止损
最后别忘了给日志系统自己装个“仪表盘”。监控Filebeat的内存使用、Kafka堆积情况、ES索引速率。一旦发现某项指标异常飙升,马上介入调整,别等到服务卡死才动手。
某次线上事故就是因为Logstash插件内存泄漏,连续跑三天就把JVM撑爆了。后来加上告警规则,类似问题再也没复发过。