基于Rsyslog+Kafka+Flink+Clickhouse的高性能日志采集、分析、汇聚存储方法

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

基于Rsyslog+Kafka+Flink+Clickhouse的高性能日志采集、分析、汇聚存储方法_第1张图片

        在实际场景中客户需要了解平台整体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程序和ip2region、userAgentUtil 对日志进行拆解、数据初步分析工作,最终输出到clickhouse。

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

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

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

你可能感兴趣的:(理论与实践,微服务,负载均衡,运维)