http://tech.uc.cn/?p=2866
背景
UAE(UC App Engine)是一个UC内部的PaaS平台,总体架构有点类似CloudFoundry,包括:
- 快速部署:支持Node.js、Play!、PHP等框架
- 信息透明:运维过程、系统状态、业务状况
- 灰度试错:IP灰度、地域灰度
- 基础服务:key-value存储、MySQL高可用、图片平台等
这里它不是主角,不作详细介绍。
有数百个Web应用运行在UAE上,所有的请求都会经过UAE的路由,每天的Nginx access log大小是TB级,如何实时监控每个业务的访问趋势、广告数据、页面耗时、访问质量、自定义报表和异常报警?
Hadoop可以满足统计需求,但秒级的实时性不能满足;用Spark Streaming又有些大材小用,同时我们也没有Spark的工程经验;自写分布式程序调度比较麻烦并且要考虑扩展、消息流动;
最后我们的技术选型定为Storm:相对轻量、灵活、消息传递方便、扩展灵活。
另外,而由于UC的各地集群比较多,跨集群日志传输也会是其中一个比较大的问题。
技术准备
基数计数(Cardinality Counting)
在大数据分布式计算的时候,PV(Page View)可以很方便相加合并,但UV(Unique Visitor)不能。
分布式计算的情况下,几百个业务、数十万URL同时统计UV,如果还要分时段统计(每分钟/每5分钟合并/每小时合并/每天合并),内存的消耗是不可接受的。
这个时候,概率的力量就体现了出来。我们在Probabilistic Data Structures for Web Analytics and Data Mining可以看到,精确的哈希表统计UV和基数计数的内存比较,并不是一个数量级的。基数计数可以让你实现UV的合并,内存消耗极小,并且误差完全在可接受范围内。
可以先了解LogLog Counting,理解均匀哈希方法的前提下,粗糙估计的来由即可,后面的公式推导可以跳过。
具体算法是Adaptive Counting,使用的计算库是stream-2.7.0.jar。
实时日志传输
实时计算必须依赖于秒级的实时日志传输,附加的好处是可以避免阶段性传输引起的网络拥堵。
实时日志传输是UAE已有的轻量级的日志传输工具,成熟稳定,直接拿来用了,包括客户端(mca)和服务器端(mcs)。
客户端监听各个集群的日志文件的变化,传输到指定的Storm集群的各台机器上,存储为普通日志文件。
我们调整了传输策略,使得每台Storm机器上的日志文件大小大致相同,所以Spout只读取本机数据即可。
数据源队列
我们并没有用Storm常用的队列,如Kafka、MetaQ等,主要是太重了…
fqueue是一个轻量的memcached协议队列,把普通的日志文件转为memcached的服务,这样Storm的Spout就可以直接以memcached协议逐条读取。
这个数据源比较简单,它不支持重新发射(replay),一条记录被取出之后就不复存在,如果某个tuple处理失败或超时,则数据丢失。
它比较轻量,基于本地文件读取,做了一层薄的缓存,并不是一个纯内存的队列,它的性能瓶颈在于磁盘IO,每秒吞吐量跟磁盘读取速度是一致的。但对于我们这个系统已经足够,后续有计划改成纯内存队列。
架构
通过上面的技术储备,我们可以在用户访问几秒后就能获取到用户的日志。
整体架构也比较简单,之所以有两种计算bolt,是基于计算的均匀分布考虑。业务的量相差极大,如果仅按业务ID去进行fieldsGrouping,计算资源也会不均衡。
- spout将每条原始日志标准化,按照URL分组(fieldsGrouping,为保持每台服务器计算量的均匀),派发到对应的stat_bolt上;
- stat_bolt是主要的计算Bolt,将每个业务的URL梳理并计算,如PV、UV、总响应时间、后端响应时间、HTTP状态码统计、URL排序、流量统计等;
- merge_bolt将每个业务的数据合并,如PV数,UV数等。当然,这里的UV合并就用到了前面提到的基数计数;
- 自写了一个简单的Coordinator协调类,streamId标记为”coordinator”,作用:时间协调(切分batch)、检查任务完成度、超时处理。原理跟Storm自带的Transactional Topolgoy类似。
- 实现一个Scheduler通过API获取参数,动态调整Spout、Bolt在各服务器的分布,以便灵活分配服务器资源。
- 支持平滑升级Topology:当一个Topology升级的时候,新Topology和旧Topology讲同时运行,协调切换时间,当新的Topology接管了fqueue之后,过河拆桥,杀死旧的Topology。
注意点:
- Storm机器尽量部署在同一个机柜内,不影响集群内的带宽;
- 我们的Nginx日志是按小时切分的,如果切分的时间不准确,在00分的时候,就可以看到明显的数据波动,所以,尽量使用Nginx module去切日志,用crontab发信号切会有延迟。切日志这种10秒级的延迟,在大尺度的统计上没有问题,秒级的统计时波动却很明显;
- 堆太小会导致woker被强制杀死,所以要配置好-Xmx参数;
自定义项
- 静态资源:静态资源过滤选项,通过Content-Type或后缀筛选特定的静态资源。
- 资源合并:URL合并,比如RESTful的资源,合并后方便展示;
- 维度与指标:通过ANTLR v3做语法、词法分析,完成自定义维度和指标,并且后续的报警也支持自定义表达式。
其他
我们还用其他方式实现了:
- 业务的进程级(CPU/MEM/端口)监控
- 业务依赖的服务,如MySQL/memcached等的监控
- 服务器的磁盘/内存/IO/内核参数/语言环境/环境变量/编译环境等监控
相关推荐
本文介绍的是基于Storm的Nginxlog实时监控系统。Hadoop的缺点也和它的优点同样鲜明——延迟大,响应缓慢,运维复杂。被人广受诟病,但是 有需求就有创造,在Hadoop基本奠定了大数据霸主地位的时候,很多的开源项目...
基于ELK的nginx-qps监控解决方案 在现代网络架构中,监控和日志分析是非常重要...基于ELK的nginx-qps监控解决方案提供了一个强大的监控和日志分析平台,帮助我们实时了解nginx的性能状态,并快速响应故障和性能瓶颈。
: 项目基于storm的实时nginx日志监控,通过读取nginx的日志文件access.log来收集nginx服务器的状态,并在一定时间内,统计访问ip的国家地址、指定时间内所有访问次数、访问的状态码、访问的站点、访问者使用的系统、...
在我们的案例中,Grafana将与Loki集成,通过图形化界面展示Nginx日志,使我们能够实时监控和分析服务器状态。 Docker Compose是Docker的一个工具,允许我们定义和运行多容器的Docker应用程序。在提供的`docker-...
使用命令行: $ ./prometheus-nginxlog-exporter \ -format="<FORMAT>" \ -listen-port=4040 \ -namespace=nginx \ [PATHS-TO-LOGFILES...] 使用配置文件: $ ./prometheus-nginxlog-exporter -config-file /path/...
nginx_log_analysis是一个Nginx日志实时分析系统,目前已经在折800旗下的全部Nginx代理上运行,每天负责数十亿日志的实时分析。整个传输操作在log执行阶段,对请求的响应时间没有影响。如果对Ngx_Lua开发有兴趣的...
在运行过程中,为了确保系统稳定和优化性能,监控Nginx的运行状态至关重要。GoAccess是一个开源的实时Web日志分析工具,专为Nginx等服务器设计,能够帮助管理员快速分析、统计并可视化服务器的日志数据。 GoAccess...
本操作手册主要介绍如何使用 Keepalived 监控 Nginx 进程,实现系统的负载均衡。 一、Keepalived 的监控机制 Keepalived 本身只是监控自身的进程是否挂掉,如果机器并没有挂机,只是 Nginx 挂了,那么 Keepalived ...
Nginx 的日志系统是其核心组件之一,为我们提供了对服务器性能、访问情况和错误信息的跟踪和监控。今天,我们将深入探讨 Nginx 的 error_log 和 Access_log 分析。 error_log 和 access_log 是 Nginx 中两个最重要...
基于nginx负载均衡的集群聊天系统,其中技术点有网络方面、数据库方面、线程安全方面;功能点有添加好友、单人聊天、群组聊天等 基于nginx负载均衡的集群聊天系统,其中技术点有网络方面、数据库方面、线程安全方面...
Prometheus,作为流行的开源监控系统和时间序列数据库,是实现这一目标的理想工具。本文将详细介绍如何利用Prometheus来细化Nginx的监控。 首先,我们要了解Prometheus的基本工作原理。Prometheus通过HTTP抓取目标...
总之,`access.log`是Nginx服务器的重要组成部分,它提供了宝贵的服务器运行数据,通过有效的日志分析,我们可以更好地理解用户行为,优化网站性能,以及确保系统的稳定性和安全性。`access.log.zip`压缩文件的解压...
一、基于nginx+lua完成商品详情页访问流量实时上报kafka的开发 ==================================== 在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka 这样的话,storm才能去消费kafka中的...
当前,这在基于Debian和RedHat的linux系统上有效。 经过测试的平台是: Ubuntu 16.04 CentOS的7要求无特殊要求; 请注意,此角色需要root用户访问权限,因此可以在具有全局角色的剧本中运行它:yes角色变量可以传递...
"基于PHP Nginx高负载查询打印系统的构建——以高等教育自学考试通知单打印系统为例" 摘要:本文介绍了基于PHP Nginx高负载查询打印系统的构建,以高等教育自学考试通知单打印系统为例。该系统使用PHP和Nginx技术...
Nginx日志自动归档备份shell脚本log
本文档从nginx性能监控分析的角度说明了nginx应该做哪些性能监控,从哪些角度进行性能监控和性能分析。
5. **日志处理**:通过Lua对请求日志进行实时分析,提供实时监控和报警功能。 ### 三、Lua脚本的编写与执行 1. **Nginx配置中的Lua**:在Nginx配置文件中,使用`location`块定义 Lua 脚本的入口点,例如`content_...