要对 Nginx 日志作分析,需要解决两个核心问题:
- 日志收集
- 日志分析
传统方案
传统方案有两种,一种是大数据领域的方案,一种是运维领域的方案。
运维领域常见的方案是使用 ELK 全家桶, 通过 Logstash 收集,直接写入 ElasticSearch, 配合web插件 Kibana 完成交互分析部分。
这套架构缺点也很明显:
- 每个节点要独立部署logstash
- ElasticSearch 实时写入会极大的影响读取
- ElasticSearch 分析能力有限
第二种是大数据解决方案,使用 flume 收集日志,使用 Kafka作为数据队列,使用 Spark/flink 消费Kafka 将日志写入对象存储。最后,再接一套完整的数据分析工具。
这套架构缺点也比较明显:
- 使用的组件很多,每个组件都有比较大的运维压力。
- 需要借助大数据相关分析工具,可能需要熟悉大数据体系的东西。
JuiceFS Byzer 双剑合并方案
日志收集部分,只需要将对象存储通过 JuiceFS 挂载成服务器本地目录,然后直接将 Nginx 日志写入到那个目录即可。
相比传统方案:
- 配置,运维简单,组件只要一个JuiceFS 就可以直接完成数据实时收集到对象存储/HDFS
- 非常的低碳环保,不需要数据在各个系统倒腾,比如先写到本地,再发送到Kafka,然后再通过流应用收集等等。
大家唯一可能担心的是,Nginx 直接写 JuiceFS 影响NGINX 的正常运行,有两方面可以帮大家减少一些顾虑:
- JuiceFS 本身是一个高可用的服务,支持本地写缓存异步上传等特性,而且经过广泛的生产验证。
- 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/> 日志分析完成,请查收邮件!</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 就可以完成数据的收集和分析,具有如下有点:
- 两个产品都有很好的横向扩展性,云原生,简单易用,支持海量大数据分析
- 整套方案只需要 JuiceFS 和 Byzer,运维压力小
- JuiceFS 可以轻松收集数据,低碳环保
- Byzer 具有强大的分析能力,简单易用,具备完成数据加载,处理,投递等各种能力,也包括AI方面的能力,还提供了易用的开发界面(Byzer-notebook)