ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

高并发系统负载均衡与实时监控的实用方案(二)

2022-01-08 23:58:11  阅读:129  来源: 互联网

标签:分析 负载 nginx 实时 kafka queue 并发 日志 Clickhouse


上一篇博文中介绍了简单的实用负载均衡与实时监控方案(tengine + rsyslog + goaccess),功能上是满足日常需要的。 但是用户的需求是没有止境的,更何况我们做技术的都有一颗追求极致的心。

        在实际场景中客户需要了解平台整体UV、PV,各功能模块PV、UV,区域PV、UV,各手机型号、应用版本的使用情况,平台使用的趋势分析,功能模块的热度分析等指标。用户端精确埋点和基于Haddop的大数据采集分析工具肯定是一个不错的方案,但是笔者喜欢钻研一些实施运维简单的轻量方案(我真不想让现场技术实施人员打扰)。 首先,做了13年Java Web开发的我,很清楚Nginx日志中蕴藏着大量的实用信息:

    1.  唯一用户: 根据 访问IP和UserAgent基本可以唯一确定一个用户(有误差比如:连接同一WIFI或移动接入点且用了相同手机型号的用户就只能算作同一个用户了)。由于笔者客户要求很高,我们在用户端的请求中统一添加了用户唯一标识的Request Header ,进行了精确匹配。实际数据对比发现,两者基本吻合。

   2. 请求所属地市: 通过开源项目的ip2region 可以轻松根据请求IP获取请求的省份、地市、运营商等信息。

    3. 手机型号:基于UserAgent 分析浏览器、操作系统、设备型号、设备品牌、设备名称(具体方法后期公布)等信息,目前也有很多开源项目。

     4. 后台服务: 我们在后期的URL中应该很容易分析出用户请求的服务。

     5. 出口流量: nginx日中记录了每个响应状态和报文大小。

     6. 引用地址: 基于Http Refferer,可以分析请求的引用地址,分析界面的分享情况

要获取这些信息,我们必须对日志进行深度解析而且还要依赖一些第三方库, 所以方案一中存储日志文件和Goaccess的方式应对这些需求有些力不从心(Goaccess存储处理结果,只是不够细致)。 所以我们要首先解决日志文件存储和分析的问题,鉴于Nginx日志数据量大的特点,我们必须选择一种功效的分析工具(能流式分析更好)和支持大数据量写入的数据库,经过各种Baidu和谷歌,最终定型为:Kafka + Flink + Clickhouse。 

第一步、要想分析日志,将日志高效输出出来是第一步,Ryslog我已经验证过了, 它本地输出到文件没得说, 对kafka支持的也非常完美,Kafka Produce的所有参数简单的配置就可以实现日志数据的MQ推送。kafka不但是个消息引擎,而且支持消息持久化,能够作为消息临时库实用。如下只是一个Rsyslog配置推送Kafka的例子

# 加载omkafka和imfile模块
module(load="omkafka")

# nginx template
template(name="nginxAccessTemplate" type="string" string="%hostname%<-+>%syslogtag%<-+>%msg%\n")

# ruleset
ruleset(name="nginx-kafka") {
    #日志转发kafka
    action (
        type="omkafka"
        template="nginxAccessTemplate"
        confParam=["compression.codec=snappy", "queue.buffering.max.messages=400000"]
        partitions.number="4"
        topic="test_nginx"
        broker="10.120.169.149:9092"
        queue.spoolDirectory="/tmp"
        queue.filename="test_nginx_kafka"
        queue.size="360000"
        queue.maxdiskspace="2G"
        queue.highwatermark="216000"
        queue.discardmark="350000"
        queue.type="LinkedList" 
        queue.dequeuebatchsize="4096"
        queue.timeoutenqueue="0"
        queue.maxfilesize="10M" 
        queue.saveonshutdown="on"
        queue.workerThreads="4"
    )
}

第二步、要从Kafka获取数据,我首先验证(Clickhouse Kafka表引擎 + 物化视图+ Clickhouse Table)方案,最终发现此方案对Clickhouse服务的性能损耗太大(Clickhouse是请来聚合分析运算的,哪能耗在这里),加之缺乏日志的初步分析能力,果断放弃。最终采用了流式分析领域火爆的Flink,通过Flink程序和ip2regionuserAgentUtil 对日志进行拆解、数据初步分析工作,最终输出到clickhouse。

第三、数据输出到clickhouse后,就可以基于sql,用您任何喜欢的方式对分析结果进行展示了(等忙过这一阵,我再推荐一款工具)。

本方案中,clickhouse就像个核武器, 笔者曾把3亿条记录大约20G的数据导入到一个单节点的Clickhouse中,不用索引的情况下,任意字段的汇总统计都是秒级的。

640?wx_fmt=gif

               忙里偷闲,深夜发文,请关注并点赞鼓励。

标签:分析,负载,nginx,实时,kafka,queue,并发,日志,Clickhouse
来源: https://blog.csdn.net/bhl120/article/details/122387561

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有