日志系列--计量日志处理方案

使用云服务最大好处是按量付费,无需预留资源,因此各云产品都有计量计费需求。这里我们介绍一种基于日志服务计量计费方案,该方案每天处理千亿级计量日志,被众多云产品使用:

计量日志生成计费结果过程

计量日志记录了用户涉及计费的项目,后台计费模块根据计费项和规则进行运算,产生最后账单。例如如下原始访问日志记录了项目(Project)使用情况:

microtime:1457517269818107 Method:PostLogStoreLogs Status:200 Source:10.145.6.81 ClientIP:112.124.143.241 Latency:1968 InFlow:1409 NetFlow:474 OutFlow:0 UserId:44 AliUid:1264425845278179 ProjectName:app-myapplication ProjectId:573 LogStore:perf UserAgent:ali-sls-logtail APIVersion:0.5.0 RequestId:56DFF2D58B3D939D691323C7

计量计费程序读取原始日志,根据规则生成用户在各维度使用数据(包括流量、使用次数、出流量等):

让我们看下几个计量日志计费场景:

  • 电力公司:每10秒会收到一条日志,记录该10秒内每个用户ID下该周期内功耗、峰值、均值等,每天、每小时和每月给用户提供账单
  • 运营商:每隔10秒从基站收到时间段内某个手机号码的动作(上网、电话、短信、VoIP),使用量(流量),时长等信息,后台计费服务统计出该区间内消耗资费
  • 天气预测API服务:根据用户调用接口类型、城市、查询类型、结果大小等对用户请求进行收费

要求与挑战

既要算对,又要算准是一件要求很高的事情,系统要求如下:

  • 准确可靠:多算用户吃亏,少算我们吃亏
  • 灵活:支持补数据等场景,例如一部分数据没有推过来,当需要修正时可以重新计算
  • 实时性强:能够做到秒级计费,对于欠费场景快速切断

其他需求(Plus):

  • 账单修正功能:在实时计费失败时,我们可以通过理想计费进行对账
  • 查询明细:支持用户查看自己消费明细

现实中还有两类不小的挑战:

  • 不断增长数据大量:随着用户以及调用上升,数据规模会越来越大,如何保持架构的弹性伸缩
  • 容错处理:计费程序可能有Bug,如何确保计量数据与计费程序独立

这里我们讨论一种阿里云基于日志服务开发计量计费方案,该方案已在线上稳定运行多年,从未出现过一粒算错,延迟等情况,供单价参考

系统架构

以阿里云日志服务的LogHub功能为例:

  1. 使用LogHub进行计量日志实时采集与计量程序对接:LogHub 支持的30+种API和接入手段,接入计量日志非常容易
  2. 计量程序每隔固定时间消费LogHub中步长数据,在内存中计算结果生成计费数据
  3. (附加)对明细数据查询需求,可以将计量日志配置索引查询
  4. (附加)将计量日志推送至OSS、MaxCompute进行离线存储,进行T+1等对账与统计

实时计量程序内部结构:

  1. 根据LogHub读取接口GetCursor功能,选定某个时间段日志(例如10:00-11:00)Cursor
  2. 通过PullLogs接口消费该时间段内数据
  3. 在内存中进行数据统计与计算,拿到结果,生成计费数据

    (我们可以以此类推,把选择时间计算逻辑修改为1分钟,10秒钟等)

性能分析:

  • 假设有10亿条/天计量日志,每条长度为200字节,数据量为200GB
  • LogHub 默认SDK或Agent都带压缩功能,实际存储数据量为40GB(一般至少有5倍压缩率),一个小时数据量为40/24 = 1.6GB
  • LogHub读取接口一次最大支持读1000个包(每个包最大为5MB),在千兆网条件下2秒内即可读完
  • 加上内存中数据累计与计算时间,对1小时计量日志进行汇总,不超过5秒

数据量大如何解决,例如一天十万亿

在一些计费场景下(例如运营商、IoT等)计量日志量会很大(例如十万亿,数据量为2PB/Day),折算压缩数据后一小时有16TB,以万兆网络读取需要1600秒,已不能满足快速出账单需求。

这里一般使用2种手段:

1. 控制产生的计费数据量

我们对于产生计量日志程序进行改造(例如Nginx),先在内存中做了聚合,每隔1分钟Dump一次该时间段聚合的汇总计量日志结果。这样数据量就和总体的用户数相关了:假设Nginx该时间段内有1000个用户,一个小时数据点也才1000 200 60 = 12GB(压缩后为 240 MB)

5. 将计量日志处理并行化

LogHub下每个日志库可以分配不同Shard(分区),我们可以分配3个分区,3个计量消费程序。为了保证一个用户计量数据总是由一个消费程序处理,我们可以根据用户ID Hash到固定Shard中。例如杭州市西湖区用户写在1号Shard,杭州上城区用户数据写在2号Shard,这样后台计量程序就可水平扩展。

其他问题

1.补数据怎么办?

LogHub 下每个Logstore可以设置生命周期(1-365天),如果计费程序需要重新消费数据,在生命周期内可以任意根据时间段进行计算。

2. 计量日志散落在很多服务器(前端机)怎么办

  1. 使用Logtail Agent实时采集
  2. 使用机器标示定义一套动态机器组弹性伸缩

3. 查询明细需求如何满足

对LogHub中数据可以创建索引,支持实时查询与统计分析,例如我们想调查有一些特别大的计量日志:

Inflow>300000 and Method=Post* and Status in [200 300]

在对Loghub中数据打开索引后,即可实时实时查询与分析

也可以在查询后加上统计分析:

Inflow>300000 and Method=Post* and Status in [200 300] | select max(Inflow) as s, ProjectName group by ProjectName order by s desc

4. 存储日志并进行T+1对账

日志服务提供LogHub中数据投递功能,支持自定义分区、自定义存储格式等将日志存储在OSS/MaxCompute上,利用E-MapReduce、MaxCompute、HybridDB、Hadoop、Hive、Presto、Spark等进行计算。

时间: 2024-09-17 03:43:10

日志系列--计量日志处理方案的相关文章

日志系列--程序日志处理挑战与方案

程序日志(AppLog)有什么特点? 内容最全:程序日志是由程序员给出,在重要的地点.变量数值以及异常都会有记录,可以说线上90%以上Bug都是依靠程序日志输出定位到 格式比较随意:代码往往经过不同人开发,每个程序员都有自己爱好的格式,一般非常难进行统一,并且引入的一些第三方库的日志风格也不太一样 有一定共性:虽然格式随意,但一般都会有一些共性的地方,例如对Log4J日志而言,会有如下几个字段是必须的: 时间 级别(Level) 所在文件或类(file or class) 行数(Line Num

日志系列--账单日志的统计分析

简介 成交账单是电商公司的核心数据,是一系列营销和推广活动最终的转化成果.这些数据包含了很多有价值的信息:从这些数据出发,可以描绘出用户画像,为下一步的营销提供方向.账单数据还能提供货物的受欢迎程度,为下一步备货提供准备. 账单信息以日志的形式保存在阿里云日志服务上,日志服务能够提供快速的查询和SQL统计,在秒级别计算上亿条日志.本文将以几个例子来讲解如何挖掘有用信息. 一个完整的成交账单,包含了货物的信息(名称.价格).成交的价格信息(成交的价格.支付手段.优惠信息).交易对手的信息(会员信息

日志系列-常见处理方案

什么是日志数据? "日志是一种简单的不能再简单的存储抽象".它是一个只能增加的,完全按照时间排序的一系列记录.日志(时间序列数据)看起来如下: 我们可以给日志末尾添加记录,并且可以从左到右读取日志记录.每一条记录都指定了一个唯一的有一定顺序的日志记录编号. 日志顺序由"时间"来确定,从图上可以看到日志从右到左的时间顺序,新产生的事件被记录,过去的事件渐渐远去,但它记录了什么时间发生了什么事情,这无论对于计算机.人类.还是整个世界而言,是认知与推理的基础. 日志数据有

Listen Software解决方案 “How To” 系列5:日志文件

解决  Listen Software解决方案 "How To" 系列5:日志文件 用实例管理器创建数据库(Oracle9i中已废除,故略去) 创建开发环境(略去)  日志文件  所有有关日志文件 重设日志选项 完成一个完整冷备份 1)创建一个数据库原形,在所有数据库文件的头部放入一个新的scn. 2)重设日志序列号到1 3)如果存在,重新格式化联机重做日志  无意恢复联机重做日志 当恢复数据库时,可能偶然地恢复联机重做日志.这将迫使完成一个不完全恢复而不是完全恢复.  状态和位置: 

【大数据新手上路】“零基础”系列课程--日志服务(Log Service)采集 ECS 日志数据到 MaxCompute

随着公司业务的增多,云服务器 ECS 上的日志数据越来越多,存储开销越来越大,受限于日志的大小和格式,分析的速度非常缓慢,导致海量数据在沉睡,不知道发挥作用,如何能将这些数据进行归集.提炼和智能化的处理始终是一个困扰.通过日志服务投递日志数据到MaxCompute便可以让用户按照不同的场景和需求.以不同的方式复用数据,充分发挥日志数据的价值. 使用日志服务投递日志数据到MaxCompute具有如下优势: 使用非常简单.用户只需要完成2步配置即可以把日志服务Logstore的日志数据迁移到MaxC

减肥日志系列之一

减肥日志系列之一 截止到2015-04-28为止,我的减肥计划进行到了第三周. 这三个星期,我每天中午不吃饭,晚饭不吃肉等荤菜.为了看看减肥效果,今天吃完晚饭,我拿出酒店房间里配备的体重秤,称量结果是,比我立志减肥那天的体重降了1.6 KG.现在体重83.4 KG. 乖乖,这个结果让我又喜又急. 喜的是,毕业至今14年,体重一直处于稳定上升.现在经过自己的努力和坚持,体重终于在下降了,这是自己努力的结果,也是对自己有效管理的正面预期的回报!终于可以体重下降了,终于可以让自己对自己有些信心了,我还

Apache日志查看与日志格式配置参数详解

一.定义日志格式 很久以前,日志文件只有一种格式,这就是"公共格式",许多人已经习惯于使用这种格式.随后出现了定制日志格式,而且看起来定制日志格式更很受欢迎,即使公共日志格式本身也重新用定制日志格式定义.本文介绍的就是如何随心所欲地定制日志文件的格式.如何让日志文件记录自己想要的信息. 定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令,默认httpd.conf文件提供了关于这两个指令的几个示例. LogFormat指令定义格式并为格式指定一个名字,以后

MYSQL启用日志,查看日志,利用Mysqlbinlog工具恢复MySQL数据库

MYSQL启用日志 [root@jianshe99]# whereis my.ini [root@jianshe99]# vi /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Default to using old password format for compatibility with mysql 3.x # clients (those using the

.NET Core的日志[3]:将日志写入Debug窗口

定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志消息.如果需要使用DebugLogger来写日志,我们需要将它的提供者DebugLoggerProvider注册到LoggerFactory上.由于定义在Debug类型中的所有方法都是针对Debug编译模式的,所以在只有针对Debug模式编译的应用中使用DebugLogger才有意义.这里将的"De