一、前言

广告业务监控中,我们经常碰到多维度的数据储存和查询分析需求,比如,我们可能需要基于秒级粒度去统计某个接口 TP999 耗时,或者需要基于秒级粒度去统计微博广告在各个场景下的请求量,再或者我们需要基于分钟粒度去展示广告收入的日环比和周同比。同时,随着微博广告流量的日益增长,微博广告监控指标越来越多,我们的监控指标引擎承载的压力也越来越大。

那么,在这些复杂多变的流量洪峰下,如何更灵活快速地去查看我们的系统指标性能呢?

这里假设您已经拥有了一个高可用的分布式 ClickHouse 集群,下面我将通过三个业务监控需求用例,来为您介绍在微博广告业务百亿流量下,我们如何通过 ClickHouse 的数据抽样和物化视图功能,来快速灵活地可视化我们的监控指标。

二、性能指标 TP999

耗时是反馈我们系统性能的一个重要指标。以前我们会通过预聚合的方式来计算一个接口的平均耗时,这种方式会降低对监控指标引擎的查询压力,但是却容易掩盖我们系统的性能问题。

比如一个接口的耗时持续出现在 [ 0-10 ]ms 和 [ 90 -100 ]ms 两个区间,但是计算出来的平均值却是在 50ms 左右。我们以为系统是正常的,因而忽略去排查那些耗时在 [ 90-100 ]ms 请求。

所以现在我们开始将平均耗时修改成 TP999、TP99 这样的方式来计算我们的接口耗时。我们能更容易地跟踪我们系统的性能,但是却增加了我们监控指标引擎的查询压力。

我们需要把我们的每一条请求都储存在一张明细表中,好在 ClickHouse 的高性能读写和横向扩展能力,让我们依然可以很快地去查询接口的 TP999 耗时。ClickHouse 为何如此之快,这里就先不赘述了,后期,我会通过一篇文章来介绍。

同时我们还可以通过 ClickHouse 的抽样功能来辅助降低引擎查询压力。这里需要注意的是,只有在创建表结构时开启抽样查询功能,才能执行抽样查询 SQL 。

那么如何开启抽样查询功能呢,其实很简单,比如我们想以 datetime 维度进程抽样展示,只要在您的建表语句中包含 SAMPLE BY intHash64(datetime) ,同时,在您的主键中,也就是 ORDER BY 里面,必须包含抽样的字段。完成的建表语句如下:

CREATE TABLE default.ods_nginx_access_logON CLUSTER clickhouse( date Date, datetime DateTime, host String, port String, status String, cost_time UInt32, request_number UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/ods_nginx_access_log', '{replica}') PARTITION BY date ORDER BY (date, intHash64(datetime), host, port, status) SAMPLE BY intHash64(datetime) SETTINGS index_granularity = 8192;

ReplicatedAggregatingMergeTree 是多副本的聚合 MergeTree 引擎,从而保存数据的高可用性。

此时,我们就可以对该表的数据,以 datetime 字段进行抽样查询,比如,我们要抽样查询 10% 的数据,就可以在 SELECT 查询语句中加上 SAMPLE 0.1。完整的查询 SQL 如下:

SELECT datetime, quantile(0.999)(cost_time)FROM default.ods_nginx_access_logSAMPLE 0.1GROUP BY datetimeORDER BY datetime

SQL 在 ClickHouse 中执行结果如下:

三、基于物化视图和聚合表引擎的多维度查询

在上面的例子中,由于 TP999 的特殊要求,我们只能基于明细表来查询,虽然做了抽样,但是查询的数据依然可能很大。那么在多维度查询的场景下,我们可以通过物化视图和聚合表引擎,按照指定的时间粒度和维度指标预聚合我们的查询指标,从而降低查询的压力。

聚合表引擎 AggregatingMergeTree 会根据我们指定的时间粒度和维度指标预聚合我们的监控数据,再通过与物化视图的结合,实时的将明细表中的数据聚合到一张物化视图表中,而不是等我们查询时才聚合生成的数据。因此,在查询性能上会带来很大的提升,降低查询对监控数据引擎的压力。

那么,在多维度查询前,我们需要基于我们指定的时间粒度和维度指标创建一张物化视图聚合表。这里我们创建一张以 host,port,status 三个维度聚合统计每秒钟请求数的物化视图聚合表,以 datetime 作为抽样字段。建表语句如下:

CREATE MATERIALIZED VIEW default.dw_nginx_access_log_1s ON CLUSTER clickhouse ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{layer}-{shard}/dw_nginx_access_log_1s', '{replica}')  PARTITION BY date  ORDER BY (date, intHash64(datetime), host, port, status)  SAMPLE BY intHash64(datetime) SETTINGS index_granularity = 8192 AS SELECT  date,  datetime,  host,  port,  status,  sumState(request_number) AS request_number FROM default.ods_nginx_access_log GROUP BY date, datetime, host, port, status;

sumState 是一个聚合函数,主要用于 AggregatingMergeTree 表引擎中,用于在聚合过程中保存指定字段的聚合状态。

此时,这张物化视图聚合表 dw_nginx_access_log_1s 就在实时聚合明细表 ods_nginx_access_log 中的数据了,我们可以通过下面这条 SQL 查询监控数据:

SELECT datetime, host, port, status, sumMerge(request_number) AS request_numberFROM default.dw_nginx_access_log_1sGROUP BY datetime, host, port, statusORDER BY datetime

sumMerge 聚合函数用于合并 sumState 聚合状态,完成聚合并返回聚合结果。

当我们需要在 Grafana 中展示我们的监控指标时,我们就可以根据上面的查询 SQL 稍加修改,来展示我们的指标。比如,我们想在 Grafana 上展示各个主机的 QPS,就可以通过下面的 SQL 来完成:

SELECT (intDiv(toUInt32(datetime), $interval) * $interval) * 1000 AS t, groupArray((host,request_number)) AS groupArrFROM( SELECT datetime, host, sumMerge(request_number) AS request_number FROM default.dw_nginx_access_log_1s GROUP BY datetime, host)GROUP BY tORDER BY t

SQL 在 ClickHouse 中执行结果如下:

分主机 QPS 监控图效果如下:

四、请求量的日环比和周同比监控

在微博广告的监控需求中,经常需要对一些指标进行历史走势对比监控,如下图所示:

ClickHouse 对于这种展示需求也能够轻松实现,具体 SQL 如下:

1、今日 QPS SQL

SELECT(intDiv(toUInt32(datetime), $interval) * $interval) * 1000 AS t, sumMerge(request_number) AS " 今日 QPS"FROM default.dw_nginx_access_log_1sGROUP BY t,ORDER BY t

2、昨日 QPS SQL

SELECTt + 86400000,count() AS " 昨天 QPS"FROM( SELECT (intDiv(toUInt32(datetime), $interval) * $interval) * 1000 AS t, count() FROM default.dw_nginx_access_log_1s WHERE (datetime >= toDateTime($from - 86400)) AND (datetime < toDateTime($to - 86400)) GROUP BY tORDER BY t)

3、七日 QPS SQL

SELECTt + 86400000 * 7,count() AS " 七日 QPS"FROM(SELECT(intDiv(toUInt32(datetime), $interval) * $interval) * 1000 AS t,count()FROM default.dw_nginx_access_log_1sWHERE (datetime >= toDateTime($from - 86400 * 7)) AND (datetime < toDateTime($to - 86400 * 7))GROUP BY tORDER BY t)

五、总结

ClickHouse 优秀的读写处理性能,丰富强大的函数支持,以及灵活的 SQL 查询,支撑了微博广告监控系统的百亿流量请求和复杂业务需求。

它不仅集成了 Graphite、Druid、ElasticSearch 等时序数据库、分析引擎的优势,同时也扩展了它们的不足,拓展了我们监控系统能力的广度和深度,给我们监控运维带来了极大的便利。

当我们面对一个复杂的系统,我们依然可以从容的展示系统内部各个环节的性能和业务指标。

clickhouse 物化视图_再谈clickHouse:微博基于 ClickHouse 监控百亿流量下的指标相关推荐

  1. redis 亿级查询速度_亿级流量系统架构之如何保证百亿流量下的数据一致性(上)...

    欢迎关注头条号:石杉的架构笔记 周一至周五早八点半!精品技术文章准时送上!!! 目录 一.前情提示 二.什么是数据一致性? 三.一个数据计算链路的梳理 四.数据计算链路的bug 五.电商库存数据的不一 ...

  2. ClickHouse 物化视图在微信的实战

    前言 ClickHouse广泛用于用户和系统日志查询场景中,借助腾讯云提供基础设施,微信也在分阶段逐步推进clickhouse的建设和应用,目前作为基础建设的一部分,主要针对于OLAP场景,为业务方提 ...

  3. clickhouse 物化视图使用详解

    前言 视图这个概念大家并不陌生,在mysql中,视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据.作为一个select语句保存在数据字典中的.通过视图,可以展现基表(用来创建视图的表 ...

  4. ClickHouse 物化视图

    像通常的计算一样,强大的能力意味着至少有一点复杂性.这篇由两部分组成的文章通过准确解释物化视图的工作原理来填补空白,以便即使是初学者也可以有效地使用它们.我们将提供几个详细的示例,您可以根据自己的用途 ...

  5. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

  6. Clickhouse物化视图详解

    文章目录 物化视图 1 概述 1.1 物化视图与普通视图的区别 1.2 优缺点 1.3 基本语法 1.4 创建物化视图的限制 1.5 物化视图的数据更新 2 案例实操 2.1 准备测试用表和数据 2. ...

  7. Clickhouse物化视图

    一.概念 clickhouse的物化视图是一种查询结果的持久化,给我们带来了查询效率的提升.用户查询效果和查表没有区别,其本质就是一张表,一张时刻在预计算的表,创建的过程用了一个特殊引擎: 注:使用c ...

  8. clickhouse物化视图优缺点_ClickHouse 适用场景

    Clickhouse是一个用于联机分析处理(OLAP)的列式数据库管理系统(columnar DBMS). 传统数据库在数据大小比较小,索引大小适合内存,数据缓存命中率足够高的情形下能正常提供服务.但 ...

  9. Clickhouse 物化视图 MATERIALIZED VIEW

    MATERIALIZED VIEW 物化视图物化视图支持表引擎,数据的保存形式由表的引擎决定.创建语法: CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db. ...

最新文章

  1. AI让硬件说话,这就是未来物联网
  2. 【BZOJ】4259: 残缺的字符串 FFT
  3. Swift之深入解析协议Protocol的底层原理
  4. D3DCOLOR与D3DXCOLOR
  5. Drupal 自定义主题实体 Theming Custom Entities
  6. 初中计算机职称答辩,晋升中学语文高级教师职称答辩内容举例
  7. 打开端口_打印机ip及端口设置
  8. 根据语句自动生成正则表达式
  9. 深入剖析Redis高可用集群架构原理
  10. QT学习回顾(二)界面布局及其控件设计
  11. html数据如何分页显示,简单的html数据分页控件封装
  12. 计算机关机又自动重启,电脑关机后自动重启是什么原因?Win10关机变重启原因及解决方法...
  13. html制作一个视频播放器,H5 打造属于自己的视频播放器(HTML 篇)
  14. 牛牛找工作--网易2019实习生招聘编程题
  15. 九宫格一共有多少4个相连的点?(C5H4)
  16. 《桃花源记》--歪解
  17. 深圳 IT 男打人后疯狂凡尔赛,还教育民警,这回把 IT 人的脸都丢尽了……
  18. 【百度地图循环标记多个点,点击显示对应详情】
  19. matlab读.h5文件
  20. 淘宝API学习之道:淘宝TOP之API接口接入教程

热门文章

  1. android:一个容易被遗忘的强大工具
  2. Android: app不被系统kill掉
  3. 5年IT从业的感悟和未来百万年薪畅想
  4. 设置php语言,PHP语言之php-fpm 基本设置与启动
  5. VS2019如何修改字体大小
  6. acm竞赛java很少_ACM比赛中JAVA的应用
  7. echarts echarts.js:440 Uncaught TypeError: Cannot read properties of null (reading ‘toFixed‘)
  8. 笨办法学python在线阅读_『笨办法』学Python 3
  9. 正态分布的概率密度函数python_python绘制正态分布及三大抽样分布的概率密度图像...
  10. centos删除文件不释放_Linux运维知识之linux centos下彻底删除文件 解决删除文件文件夹硬盘空间不释放不减少...