从零到壹构建行为日志聚合[通俗易懂]

从零到壹构建行为日志聚合

大家好,又见面了,我是全栈君。

摘要

行为日志在这个大数据时代的作用日益重要,怎样更好的收集、存储、管理日志也是值得研究的一个问题,大型互联网公司一般都有成熟的日志聚合方案,但是每个公司尤其是中小型公司都要针对自己的应用场景来做技术选型,本文主要针对中小型公司如何以较小的成本快速构建一个行为日志聚合体系以及在建立日志聚合过程中要处理哪些问题。

关键字

日志收集,消息队列,数据仓库,生产者,消费者

原始阶段

最初公司使用日志收集的方式极其简单粗暴,数据量大的以文本文件形式存在本地磁盘,数据量小的存在各个数据库(比较重要的日志)。这种方式实现起来简单,但是存在诸多问题:查询极为不便,需要到到各服务器去查找日志;一般数据库的存储量级有限,如果要存大量数据需要水平分表,给运维和开发带来额外的负担;各个子系统的日志处理不统一,还要额外维护日志处理程序;日志分散会对后续的数据分析造成不便。所以作为互联网的分布式系统或微服务架构,日志是需要中心化管理的,需要集中统一的收集处理,才能降低开发和运维复杂度。

初级阶段

大型互联网公司应用比较多的方案是Flume+Kafka+Hadoop,当时觉得实现这个对小公司来说会增加额外的运维成本而且只有两个人在做调研。Kafka作为日志队列应该说是比较适合的,既能作为离线存储,又能用来实时计算。日志数据仓库选择了GreenPlum,原因是使用简单且高性能,因此先采用Kafka+GreenPlum方案,这样中间环节比较少。然后开始使用Kafka生产者SDK开发我们自己封装的日志发送SDK,还要使用Kafka消费者SDK开发日志投递中间件,这样从服务的日志输出到Kafka消息队列再到落地GreenPlum就完成了日志聚合过程。在考虑方案时要注意几个问题:整个方案必须支持在线扩容,无论是日志发送、消息队列、中间件、数据仓库中间哪个环节出现异常都要基本保证不丢失数据,这些服务在维护期间日志需要缓存,小团队在技术选型时尽量使用云商提供的产品从而降低运维成本。向Kafka发送数据时有两种模式:至少发一次、仅发一次,至少发一次确保数据不丢失但是可能有重复,仅发一次可能会丢失数据。我们希望尽量不丢失数据所以选择至少发一次,这样需要做去重处理,我们对每条日志做MD5缓存到Redis,Redis设置缓存时间。

演化阶段

使用Kafka+GreenPlum方案时发现一些问题:Kafka生产者SDK在日志量大的情况下占用较多CPU;Kafka生产者SDK将日志缓存到内存批量发送的,缓冲区有大小限制,这样在异常状态下可能丢失数据:Kafka修改有些配置需要重启集群,这样对线上维护就有影响了;Kafka不能同时使用公网地址和私网地址,我们有跨地区传输日志的特殊需求。基于这些考虑我们给消息队列增加了二级缓存Flume,Flume支持扇入扇出、支持各种网络协议、包含Kafka功能插件,这样我们在开发基于Flume的日志发送SDK时可以比较灵活的控制。因为我们有跨地区发送日志的情况,所以在网络不稳定时日志发送SDK需要持久化数据到本地,使用退避算法检测网络状态,网络恢复时批量发送本地日志。由于Flume支持持久化并且可以用负载均衡器实现高可用,Kafka也就能更灵活的维护。对于跨地域传输,我们通过自己建立隧道、一个负载均衡器挂接多个Flume可以实现。到此为止整个方案演变成Flume+Kafka+GreenPlum,日处理日志记录2亿条、产生100G数据。

最终阶段

GreenPlum一个表亿级数据能达到秒级返回,但是如果一个表的数据量达到几十亿级查询速度就是分钟级返回了。GreenPlum虽然有分区表,但是分区表不宜过多,过多会影响查询速度,而我们的日志是按时间记录,最适合的分区字段就是时间,时间又是无限的,这样势必造成分区问题,如果按月分区一个分区数据量过大导致查询速度慢,如果按日分区分区数太多导致查询速度慢。因此最终决定将日志迁移到Hadoop集群,Hadoop是以HDFS文件目录来做分区索引,这种模式非常适合以日期作为分区的场景。Hadoop查询一个分区的数据,速度确实会比较快,但是复杂查询需要聚合多个分区数据的时候性能比GreenPlum差很多,只有依赖于投入更多计算资源提高并行计算能力,GreenPlum适合存储报表数据以便快速查询在前端展示。最终方案演变成Flume+Kafka+Hadoop+GreenPlum,Hadoop作为行为日志数据仓库,GreenPlum作为报表数据仓库,Kafka作为实时计算和离线存储的日志消息队列。

总结

本文描述了行为日志聚合从零到壹、从量小到量大、从简单到复杂的演变过程,适合小团队参考。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107719.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RC电路知识讲解「建议收藏」

    RC电路知识讲解「建议收藏」RC电路是指由电阻R和电容C组成的电路,他是脉冲产生和整形电路中常用的电路。1.RC1.RC充电电路电源通过电阻给电容充电,由于一开始电容两端的电压为0,所以电压的电压都在电阻上,这时电流大,充电速度快。随着电容两端电压的上升,电阻两端的电压下降,电流也随之减小,充电速度变小。充电的速度与电阻和电容的大小有关。电阻R越大,充电越慢,电容C越大,充电越慢。衡量充电速度的常数t(tao)=RC…

    2025年7月31日
    4
  • linux修改用户权限与所属组_linux修改用户组的权限

    linux修改用户权限与所属组_linux修改用户组的权限如何在linux下修改组权限chmodg+rpath/file加读权限当前目录chmod-Rg+rpath/file加读权限当前目录以及子目录g-r减读权限g+w加写权限g-wg+x加执行权限g-x经常会用到的命令,记一下。1.chgrp修改文件所属组#简单使用,将文本test.txt所属组改为gourp1chgrpgourp1test.txt2.chown修改文件拥有…

    2025年10月26日
    3
  • C语言如何生成随机数

    C语言如何生成随机数生成10个100以内的随机数废话不多说直接上程序。#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intret=0;srand((unsignedint)time(NULL));for(inti=0;i<10;i…

    2022年4月18日
    33
  • 网站错误代码400_网页400错误什么意思

    网站错误代码400_网页400错误什么意思昨天S姐的同事上网冲浪,被提示:404notfound看着她充满求知欲的卡姿兰大眼睛,S姐决定本期讲讲上网冲浪时,你可能遇到的错误代码解析!No.1404无法找到文件404是大家上网冲浪时最常见的错误代码,一般出现的原因可能是:①页面被删除或不存在②网址输入有误③没插网线或没有联网做为生活中最常见的404,除了本身找不到查询页面的含义,还延伸出很多额外的意义。比如:好看的皮囊千篇一律,有趣…

    2022年9月29日
    3
  • 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]

    计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]在使用win7系统电脑的时间一长,出现的电脑故障也就会越多,这大多数都是用户自己所造成的,例如有用户的win7系统在运行过程中总是会出现严重卡顿的情况,这让许多用户都感到很难受,那么win7卡顿严重怎么解决呢?下面小编就来告诉大家win7运行卡顿严重最流畅设置方法。具体方法:1、右击【计算机】选择属性;2、在出现的面板的左侧栏选择【高级系统设置】;3、依次点击【高级】【设置】;4、默认是【让系统选…

    2025年11月1日
    3
  • Vue跨域问题终解决「建议收藏」

    Vue跨域问题终解决「建议收藏」config->index.js->dev->proxyTable{}修改proxyTable{}为:proxyTable:{‘/api’:{//虚拟目录target:’http://localhost:8081′,//后台NodeSpringboot项目的请求网址changeOrigin:true,…

    2022年9月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号