基于Lua+Kafka+Heka的Nginx Log实时监控系统

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

背景

在我们的系统架构中,Nginx作为所有HTTP请求的入口,是非常重要的一层。每天产生大量的Nginx Access Log,闲置在硬盘上实在是太浪费资源了。所以,能不能把Nginx日志利用起来,实时监控每个业务的访问趋势、用户行为、请求质量和后端异常呢,这就是本文要探讨的主题。


目的

1. 错误码告警(499、500、502和504);
2. upstream_response_time超时告警;
3. request_time超时告警;
4. 数据分析;

关于错误和超时监控有一点要考虑的是收到告警时,要能够快速知道是哪个后端服务节点出现了问题。


在这之前,我们都是通过随机进入一个Nginx节点tail log才能定位到,效率有些低。


架构

废话不多说,先上架构图。整体架构没太复杂的地方,随便画了一张,莫笑话我~

0?wx_fmt=jpeg


日志采集

这部分结合lua-resty-kafka使用Lua扩展将数据按照一定格式拼接后写入Kafka集群。Nginx+Lua的性能就不用多说了,这样一来完全可以关掉Nginx本身的日志开关,减少磁盘消耗;


消息队列

我们数据分析组的同事在这之前就已经建立Kafka集群,无需再搞一套消息队列服务。另外一个很重要的点是,我们不希望日志数据取完就删掉了,运维组除了要做监控告警之外,数据组也要读取数据做分析。因此,如Redis此类的消息队列就直接被我们pass掉了;


异常监控计算

这部分使用Heka来做,Heka使用Go语言编写,内置丰富的插件可以满足大部分的需求。若不满足需求,可以使用Go或者Lua自行开发扩展。之前使用过Logstash做业务日志收集,但它有时的CPU占用实在太吓人,不敢再在业务机上使用,并且感觉扩展不方便。就我们目前的应用来看,Heka的性能和资源占用还是很不错的。

可以使用Filter做计算,有错误时向Heka消息流中写入告警消息,SMTPOuter匹配到告警消息后通过自定义的Encoder定制好邮件内容后再发送。


可视化

Heka层一方面做异常监控,另一方面使用Message Matcher Syntax匹配异常数据写入到Elasticsearch, 再架设一个Kibana。我们在收到告警邮件后,就可以进入Kibana后台查看异常的Log。


不足

1. 邮件告警机制需要优化, 我们目前的设置是每分钟检查一次,发现错误就会一直告警。之后可以优化为发现异常时告警一次,异常结束时再发一次汇总邮件;
2. Heka服务管理和进程监控需要优化,支持自动重启,不然进程挂了都不知道;
3. Heka配置接入配置中心并支持自动重启(目前的配置主要是各业务的告警阀值,需要进入机器修改);

总结

整个开发过程还是比较顺利的,唯一比较耗时的是熟悉Heka的整个消息处理的流程和机制,以及如何开发扩展。另一个比较坑的是Heka的错误提示不全和调试不方便,有时完全靠猜,不过好在它本身并没有多复杂,有些问题看一看源代码就明白了。

关于消息队列的选择,前面已经提到我们已有Kafka集群就直接拿来用了。如果仅仅做异常监控,不需要消息留存, 倒可以考虑使用Redis之类轻量些的消息队列, Kafka未免有些重了。



原文发布时间为:2015-08-10

本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“BigDataDigest”微信公众号

相关文章
|
7天前
|
消息中间件 存储 Kafka
Kafka日志处理:深入了解偏移量查找与切分文件
**摘要:** 本文介绍了如何在Kafka中查找偏移量为23的消息,涉及ConcurrentSkipListMap的查询、索引文件的二分查找及日志分段的物理位置搜索。还探讨了Kafka日志分段的切分策略,包括大小、时间、索引大小和偏移量达到特定阈值时的切分条件。理解这些对于优化Kafka的性能和管理日志至关重要。
17 2
|
10天前
|
应用服务中间件 nginx
Nginx命令配置到系统环境变量
Nginx命令配置到系统环境变量
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
|
15天前
|
消息中间件 存储 Java
深度探索:使用Apache Kafka构建高效Java消息队列处理系统
【6月更文挑战第30天】Apache Kafka是分布式消息系统,用于高吞吐量的发布订阅。在Java中,开发者使用Kafka的客户端库创建生产者和消费者。生产者发送序列化消息到主题,消费者通过订阅和跟踪偏移量消费消息。Kafka以持久化、容灾和顺序写入优化I/O。Java示例代码展示了如何创建并发送/接收消息。通过分区、消费者组和压缩等策略,Kafka在高并发场景下可被优化。
72 1
|
10天前
|
应用服务中间件 开发工具 nginx
Ngnix09目录结构分析,使用tree工具可以Ngnix目录中以一个树的方式呈现出来,yum install -y tree,tail -f nginx/logs/access.log
Ngnix09目录结构分析,使用tree工具可以Ngnix目录中以一个树的方式呈现出来,yum install -y tree,tail -f nginx/logs/access.log
|
10天前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
12天前
|
SQL 数据库
支付系统32-------支付宝支付-----支付成功异步通知----更新订单状态记录支付日志
支付系统32-------支付宝支付-----支付成功异步通知----更新订单状态记录支付日志
|
12天前
|
消息中间件 NoSQL Kafka
基于Kafka的nginx日志收集分析与监控平台(3)
基于Kafka的nginx日志收集分析与监控平台(3)
|
12天前
|
消息中间件 监控 Kafka
基于Kafka的nginx日志收集分析与监控平台(2)
基于Kafka的nginx日志收集分析与监控平台(2)
|
12天前
|
消息中间件 负载均衡 应用服务中间件
基于Kafka的nginx日志收集分析与监控平台(1)
基于Kafka的nginx日志收集分析与监控平台(1)