既要、又要!NJet 支持不落盘的 Web 服务访问记录分析报表了!
nginx 向云原生演进,All in OpenNJet!
1. 背景需求
访问日志是目前 web server,proxy 最常用的问题跟踪、统计分析的源头。所以尽管由于 IO,产生访问日志对系统的的影响很大(据客户的实际反馈,因打开访问日志,系统性能有 50%以上的损耗),但在正式的上线环境中应该尽量打开访问日志。然后,产生的日志作为源头,会被输出到 ES 等统一的日志平台进行分析处理,或被各式各样的日志分析工具进行分析。比如一款开源的基于 c 编写的日志分析工具 goaccess,就可以既在命令行下使用,也提供 HTML 格式的报表。
其产生的报表可以有命令行的:
或 html 格式的:
以上图片来源于:https://goaccess.io/
当然,NJet 针对落盘影响性能这个问题也做了很多优化,比如:
动态配置访问日志,仅仅在某个具体的访问 url,仅仅在分析故障阶段打开,并在分析定位完成后尽快关闭;
动态输出日志到远端,避免磁盘 IO 的影响。但这个优化是减少了 IO,也少输出了记录,影响了用户分析自己的网站的完整性。
在分析了 goaccess 的代码后,我们觉得,可以把 NJet 和 goaccess 结合起来,由 NJet 直接把访问记录提供给 goaccess,复用 goaccess 经历社区需求验证的分析报表。这样即提供了丰富的分析报表,又避免了 IO 对性能的影响。
2. 实现简介
2.1 架构设计
goaccess 原使用基于堆内存的 hash 存储报表数据,修改为共享内存存储。NJet 的工作进程在一个 HTTP 请求完成后,直接产生符合 goaccess 要求的统计信息计入共享内存中。
同时 goaccess 作为一个单独的 CoPilot 嵌入 NJet 中,并对外提供数据的实时更新。
运维人员通过 NJet 的统一的控制面端口访问,获得实时的报表。
2.2 相关指令
name: 共享内存的名字。
size: 共享内存大小。
例如: access_log_zone abc 1m
;
days: 统计日志保存的天数。
例如: access_log_zone_valid 3
;
2.3 配置文件变更
2.3.1 数据面
njet.conf 中需要 在 main 节新增加 CoPilot 配置,及加载 so:
在 html 节增加 zone 相关的配置
2.3.2 控制面
在 njet_ctr 中新增加 goaccess 报表的访问路径
2.3.3 goaccess.conf
3. 测试
在如下的测试场景中,NJet 部署在机器 i192.168.40.139,其监听 8080,控制面端口 8081
conf/goaccess.conf
测试结果:
在访问 server(8080)一段时间后,可以通过控制面端口(http://192.168.40.139:8081/report/report.html)查看报表信息
其他说明
CoPilot,控制面、数据面等概念请参考用户指南中 NJet 架构说明
感谢 goaccess 提供的丰富访问日志报表
由于不再处理日志文件,报表页面展现的某些数据是无效的,如日志分析的字节数等。
本功能在 3.0.1 起支持
目前统计数据尚没有持久化,重启会丢失,会在下一个版本中解决
NJet 应用引擎通过内核重构实现了独特的运行时 动态配置加载 能力,是 新一代高性能 Web 应用引擎 。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。
版权声明: 本文为 InfoQ 作者【通明湖】的原创文章。
原文链接:【http://xie.infoq.cn/article/ecfdcdf0c7e9c45585735ba4c】。文章转载请联系作者。
评论