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

标签: lua kafka heka | 发表时间:2015-07-20 10:06 | 作者:ronin47
出处:http://www.iteye.com

背景

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

目的

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

关于错误和超时监控有一点要考虑的是收到告警时,要能够快速知道是哪个后端服务节点出现了问题。
在这之前,我们都是通过随机进入一个Nginx节点tail log才能定位到,效率有些低。

架构

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

架构图

日志采集

这部分结合 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未免有些重了。

原文地址: http://mlongbo.com/2015/NginxLog%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F/



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [lua kafka heka] 推荐:

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

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

kafka监控之kafka-run-class.sh

- - 开源软件 - ITeye博客
kafka自带了很多工具类,在源码kafka.tools里可以看到:. 这些类该如何使用呢,kafka的设计者早就为我们考虑到了,在${KAFKA_HOME}/bin下,有很多的脚本,其中有一个kafka-run-class.sh,通过这个脚本,可以调用其中的tools的部分功能,如调用kafka.tools里的ConsumerOffsetChecker.scala,.

闲扯kafka mq

- - 开源软件 - ITeye博客
本文主要讲解关于kafka mq的设计思想及个人理解. 关于kafka的详细信息,大家可以参考官网的文献 http://kafka.apache.org/documentation.html这是一篇相当不错的文章,值得仔细研读. 第一个问题:消息队列(Message Queue)是干嘛用的. 首先,要对消息队列有一个基本的理解.

Kafka优化

- - ITeye博客
配置优化都是修改server.properties文件中参数值. 1.网络和io操作线程配置优化. # broker处理消息的最大线程数. # broker处理磁盘IO的线程数. 一般num.network.threads主要处理网络io,读写缓冲区数据,基本没有io等待,配置线程数量为cpu核数加1.

Kafka Connect简介

- - 鸟窝
Kafka 0.9+增加了一个新的特性 Kafka Connect,可以更方便的创建和管理数据流管道. 它为Kafka和其它系统创建规模可扩展的、可信赖的流数据提供了一个简单的模型,通过 connectors可以将大数据从其它系统导入到Kafka中,也可以从Kafka中导出到其它系统. Kafka Connect可以将完整的数据库注入到Kafka的Topic中,或者将服务器的系统监控指标注入到Kafka,然后像正常的Kafka流处理机制一样进行数据流处理.

kafka consumer group offset

- - 开源软件 - ITeye博客
     kafka0.9及以前版本kafka offset 保存在zookeeper, 因频繁读写zookeeper性能不高;从0.10开始,主题分区offset存储于kafka独立主题中.     管理监控kafka主题及分区offset至关重要,原网上很开源流行工具KafkaOffsetMonitor、kafka-manager,旧版offset保存于zookeeper,kafka consumer无相应API,从kafka0.10.1.1以后提供相应API读取主题分区offset(也可以调用KafkaClient API,kafka管理API由scala语言编写).

5本Lua免费电子书

- sospartan - 读写网 ReadWriteWeb
在最新的编程语言排名中,Lua超过了JavaScript进入了前十名──许多人使用Lua进行“魔兽世界”的脚本编写. 所以,在本周的免费资源推荐中我们找到了一些免费的学习Lua的电子书,无论你想使.

Lua 下实现抢占式多线程

- Coder(码农) - 云风的 BLOG
Lua 5.2 的开发进度可以回溯到 2010 年 1 月. 漫长的流程到今天已经快两年过去,终于等到了 beta 版. 我十分期待它可以在 2011 年内正式发布. 在这几经折腾的两年里,许多新特性企图挤进 5.2 版,又最终被否决. 当我们审视改进列表,似乎看不到太多耳目一新的东西. 但如果仔细阅读一下源代码,就会发现,大部分地方都重新实现过了,以配合这些表面上看起来不大的修改.

编写高性能的Lua代码

- - 九点 科技
Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏. 像《魔兽世界》的插件,手机游戏《大掌门》《神曲》《迷失之地》等用Lua来写游戏逻辑. 所以大部分时候我们不需要去考虑性能问题. Knuth有句名言:“过早优化是万恶之源”. 其意思就是过早优化是不必要的,会浪费大量时间,而且容易导致代码混乱.

nginx+lua+memcache实现灰度发布

- - 开源软件 - ITeye博客
灰度发布在百度百科中解释:. 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式. AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面 来. 灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度.