如何使用开源 Byzer 和 JuiceFS 做实时Nginx日志分析

2022-07-21 14:13:54 浏览数 (1)

要对 Nginx 日志作分析,需要解决两个核心问题:

  1. 日志收集
  2. 日志分析

传统方案

传统方案有两种,一种是大数据领域的方案,一种是运维领域的方案。

运维领域常见的方案是使用 ELK 全家桶, 通过 Logstash 收集,直接写入 ElasticSearch, 配合web插件 Kibana 完成交互分析部分。

这套架构缺点也很明显:

  1. 每个节点要独立部署logstash
  2. ElasticSearch 实时写入会极大的影响读取
  3. ElasticSearch 分析能力有限

第二种是大数据解决方案,使用 flume 收集日志,使用 Kafka作为数据队列,使用 Spark/flink 消费Kafka 将日志写入对象存储。最后,再接一套完整的数据分析工具。

这套架构缺点也比较明显:

  1. 使用的组件很多,每个组件都有比较大的运维压力。
  2. 需要借助大数据相关分析工具,可能需要熟悉大数据体系的东西。

JuiceFS Byzer 双剑合并方案

日志收集部分,只需要将对象存储通过 JuiceFS 挂载成服务器本地目录,然后直接将 Nginx 日志写入到那个目录即可。

相比传统方案:

  1. 配置,运维简单,组件只要一个JuiceFS 就可以直接完成数据实时收集到对象存储/HDFS
  2. 非常的低碳环保,不需要数据在各个系统倒腾,比如先写到本地,再发送到Kafka,然后再通过流应用收集等等。

大家唯一可能担心的是,Nginx 直接写 JuiceFS 影响NGINX 的正常运行,有两方面可以帮大家减少一些顾虑:

  1. JuiceFS 本身是一个高可用的服务,支持本地写缓存异步上传等特性,而且经过广泛的生产验证。
  2. NGINX 的日志输出是使用异步 IO 来实现的,即使 JuiceFS 出现暂时性的抖动,也基本不影响 NGINX 的正常运行(restart 或 reload 可能会受影响)

数据分析部分,则可以使用 Byzer 来进行分析。Byzer 可以直接读取 JuiceFS 里的日志数据,然后使用 可编程SQL语法 在 Byzer 专属的 Byzer-notebook产品进行分析。

Notebook界面是这样的:

下面是一个实际的 Byzer 代码 分析 Nginx 日志的例子(简单统计,把产生的统计结果作为邮件发送):

代码语言:javascript复制
load text.`/data/nginx/logs/access_log*` as nginxTable;

-- 日志文件的清洗和统计
select 
  access_host,access_page,count(1) as access_freq 
from (
    select split(value,' ')[2] as access_host,split(value,' ')[7] as access_page 
    from (select * from nginxTable where value is not null)
  )
where 
  access_host !="-"
group by access_host,access_page 
order by access_freq desc
limit 10 as accessTable;

set saveDir="/tmp/access";
set savePath="/tmp/access.csv";

-- 保存PV统计数据为CSV格式的文件
save overwrite accessTable as csv.`${saveDir}` where header="true";

-- 因为在分布式环境运行,我们的文件会按照分区个数保存为多个文件,这里我们进行合并
!hdfs -getmerge /tmp/access/tmp/access.csv;

set EMAIL_TITLE = "Byzer网站访问日志分析"; 
set EMAIL_BODY = '''<div>Hi All,<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日志分析完成,请查收邮件!</div><br/><hr/><div>Thanks,<br/>The Byzer Org</div>''';
set EMAIL_TO = "userAccountNumber@qq.com, userAccountNumber@163.com";

-- 发送附件邮件到指定邮箱
run command as SendMessage.``
where method="mail"
and content="${EMAIL_BODY}"
and from = "userAccountNumber@qq.com"
and to = "${EMAIL_TO}"
and subject = "${EMAIL_TITLE}"
and contentType="text/html"
and attachmentContentType="text/csv"
and attachmentPaths="${savePath}"
and smtpHost = "smtp.qq.com"
and smtpPort="587"
and `properties.mail.smtp.ssl.enable`= "true"
and `userName`="userAccountNumber@qq.com"
and password="***"
;

总结

用户仅仅需要使用 JuiceFS 和 Byzer 就可以完成数据的收集和分析,具有如下有点:

  1. 两个产品都有很好的横向扩展性,云原生,简单易用,支持海量大数据分析
  2. 整套方案只需要 JuiceFS 和 Byzer,运维压力小
  3. JuiceFS 可以轻松收集数据,低碳环保
  4. Byzer 具有强大的分析能力,简单易用,具备完成数据加载,处理,投递等各种能力,也包括AI方面的能力,还提供了易用的开发界面(Byzer-notebook)

0 人点赞