尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

我搭建ELK日志系统的实战踩坑总结

我搭建ELK日志系统的实战踩坑总结 我搭建ELK日志系统的实战踩坑总结前阵子接了个企业内网运维的项目客户是一家中型互联网公司的技术负责人。他们线上服务器集群大概有50多台涵盖了Nginx、MySQL还有几个Java微服务但问题排查全靠SSH连上去翻日志。说实话这效率低得离谱有一次凌晨三点因为一个接口超时运维被电话惊醒在几百个日志文件里翻了一小时才找到根因。客户就希望我能搭一套统一的日志管理平台把分散的日志集中起来能搜索、能告警、能可视化。这需求听起来挺标准ELK栈Elasticsearch Logstash Kibana就是干这个的。我接手时心里其实有点打鼓因为之前虽然看过文档但真正在生产环境落地还是第一次。项目周期定在两周时间紧我得尽快出个能用的方案。从单机到集群的架构抉择一开始我琢磨着50台服务器单机Elasticsearch应该能扛住吧试了一圈发现这想法太天真了。Elasticsearch对内存和磁盘IO要求很高单机版在写入高峰期容易OOM内存溢出而且没有高可用节点挂了整个日志系统就瘫痪了。项目实战决策当时摆在我面前有两个方案。方案A是直接用Logstash作为唯一的日志处理中心所有服务器把日志发给LogstashLogstash处理后写入ES。方案B是引入Filebeat作为轻量级采集器部署在每台业务服务器上先做初步过滤和缓冲再转发给Logstash或ES。我选了方案B。理由很实际Logstash是JVM应用资源消耗大如果在50台机器上都跑Logstash运维成本太高。Filebeat基于Go语言内存占用只有几十MB适合做边缘采集。而且Filebeat有Shipper模式能断点续传即使网络抖动丢失了数据重启后也能从上次位置继续发送这对生产环境太重要了。配置Filebeat的时候我遇到了一个坑。我在filebeat.yml里配置了多个input打算同时采集Nginx和Java应用的日志。结果部署后发现Nginx的日志能正常写入但Java应用的日志一直丢包。排查了半天发现是tail_files: true这个配置的问题。默认情况下Filebeat会从文件末尾开始读取对于正在写入的新日志没问题但如果日志文件被轮转logrotate了旧文件里的内容就会被跳过。我当时觉得这样就行结果发现错了。解决方案是在input配置里加上start_position: beginning让Filebeat从文件开头读取。但这又带来了另一个问题全量扫描历史日志会让ES瞬间压力倍增。我最终的折中方案是只对Nginx访问日志开启全量扫描Java应用日志保持从末尾开始因为Java应用的日志通常是按天轮转且我们只关心最近几天的问题。yamlfilebeat.inputs:type: logenabled: truepaths:/var/log/nginx/access.logstart_position: beginningfields:service: nginxtype: logenabled: truepaths:/app/logs/*.logstart_position: endfields:service: java-appElasticsearch索引管理与告警配置日志写进ES只是第一步真正的挑战在于如何管理这些数据。50台服务器的日志每天大概产生20GB左右的数据。如果不管控几个月后ES的磁盘就会爆满而且查询速度会越来越慢。我引入了ILMIndex Lifecycle Management索引生命周期管理。这是ES 7.x之后非常强大的功能可以自动管理索引的滚动、热温冷分层以及删除。我配置了一个策略索引在创建后的第30天从热节点迁移到冷节点减少热节点压力第60天删除。这样既保留了足够的历史数据用于排查又控制了存储成本。有意思的是在配置Kibana告警时我踩了一个不小的坑。客户希望当错误日志ERROR级别的突增超过阈值时能发邮件告警。我在Kibana里创建了Watch设置条件是“过去5分钟内ERROR日志数量大于100”。结果部署后告警频繁误报。排查发现原因是日志的采集是有延迟的。Filebeat到Logstash再到ES整个链路有几十秒到一分钟的延迟。而我的Watch查询的是实时数据导致在日志涌入的高峰期比如定时任务执行时数据还没完全同步但查询已经触发了。我调整了策略将时间窗口从“过去5分钟”改为“过去10分钟”并且增加了一个静默期避免重复告警。jsonPUT _ilm/policy/logs-policy{policy: {phases: {hot: {actions: {rollover: {max_size: 50gb,max_age: 7d}}},delete: {min_age: 60d,actions: {delete: {}}}}}}部署完成后我在Kibana里搭建了几个核心Dashboard。一个是Nginx状态监控展示QPS、响应时间分布和Top 10错误URL另一个是Java应用异常聚合按异常类型分组方便开发同学快速定位问题。客户看到这些视图时脸上终于有了笑容说这比之前翻日志强太多了。说实话搭建ELK系统最难的从来不是安装软件而是根据实际业务场景调整配置。比如Filebeat的缓冲策略、ES的索引设计、Logstash的filter优化每一个环节都需要反复测试。这个项目让我深刻体会到生产环境的稳定性往往藏在这些细节里。本文基于实际项目经验整理欢迎在评论区交流技术问题。
返回列表