基于ClickHouse的大数据全链路监控平台实践传媒
范东,苏宁科技集团大数据中心资深架构师,在 OLAP、OLTP 领域有着深厚的技术积累。目前主要负责数据中台和数据工具平台的架构设计及性能调优工作,在数据中台、数据集成开发工具、数据资产、数据质量和数据治理等方面拥有丰富的实战经验。
简介
ClickHouse 是一款优秀的 OLAP 分析引擎,尤其是在单表分析 、Colocate Join 方面性能表现尤为突出。
ClickHouse 之所以在众多的 OLAP 分析引擎中成为佼佼者,主要是因为它具备以下特点:列式存储、LSM-Tree 存储引擎、向量化执行引擎、异步 Merge 和 Mutation 机制、并发 MPP+ SMP 等。
目前,ClickHouse 在苏宁大数据的指标和标签的应用较多:
从技术层面来看,主要解决的场景有:高基数的数据分析、精确去重、交互式分析、多变模式查询、大宽表分析、时序化数据存储、实时聚合的物化视图等; 从业务层面来看,主要应用的场景有:新买家、老买家、复购、留存、实时用户画像、人群包圈选等。而基于 ClickHouse 的 RoaringBitmap 方案,保证了以上场景数据分析的实时和高效。在 ClickHouse 监控方面,目前市面上提供的可适配方案不多,常用的有 Prometheus +Grafana+ ClickHouse_Exporter 组合的方式,可通过提供的 Dashboards 来监控集群状况,但需要安装 Prometheus 和 ClickHouse_Exporter,不编译的话还需要安装 GO 环境和 Docker,整个框架过重,成本过高,对个性化的监控也不支持。还有一些其他监控组件如 Graphite + Grafana,在这里就不做介绍。
我们将 ClickHouse 融入苏宁全链路监控生态体系,在完善监控体系的同时,也支撑了个性化的监控,进一步拓展了全链路监控平台的深度和广度。
一、苏宁大数据全链路监控平台
1、苏宁全链路监控平台介绍
图 2-1 全链路监控架构
苏宁大数据中心数据中台有一整套完善的指标建设体系,包含了指标生命周期管理、指标分析体系以及数据快速可视化平台,数据分析时跨越可视化平台、指标服务平台及 OLAP 分析引擎三大平台,查询链路较长。如果没有一套完整的全链路监控分析平台,对于定位问题会存在较大的困难。
全链路监控整体的设计思想是将页面的每次 http 请求生成唯一的流水号 (serialId),后续每访问一次指标管理系统,生成唯一的 traceId,每次调用 OLAP 接口生成唯一的 olapId,这样 1 个流水号对应多个 traceId,关联对应后续多个 olapId,形成一个树状请求,以此得到一个完整的请求链路。
具体设计如下:
报表设计系统后端针对报表前端的每次请求生成唯一 traceId,针对请求的每一步生成层级关系的 spanId,并向指标管理系统透传 traceId 和对应的 spanId; 指标管理系统接受请求后,根据梳理的查询权重计算方式生成“查询权重”priority,在报表设计系统的 spanId 基础上继续生成调用层级关系的 spanId,并向 OLAP 透传 traceId 和对应的 spanId; Spark RDD 实现将 Druid、PostGreSQL 和 ClickHouse 中的 queryId 与 Spark worker 中的 StageID 以及 JobID 关联起来; OLAP 接受请求后,在指标管理系统的 spanId 基础上继续生成调用层级关系的 spanId,并向 OLAP 引擎层透传 traceId 和对应的 spanId; OLAP 分析引擎层,通过打通 traceId 和各自分析引擎执行路径的方式,实现跟踪各执行计划、执行路径的耗时。例如,可通过 bigQueryId 与 Druid 关联,而 PostGreSQL 和 ClickHouse 则可以通过 traceId 映射到引擎内部的方式进行关联。2、 如何将 ClickHouse 纳入全链路监控平台
ClickHouse 全链路监控覆盖范围较广,包括:查询涉及到的节点、分片、父查询和子查询的关系、在各个节点的查询耗时、请求内存使用、高峰使用内存、CPU 使用数、查询行数、MergeTree 使用状况、查询方式(TCP/HTTP)以及参与查询线程数等。
在调用 ClickHouse 提供服务查询(spark-jdbc)的时候,如何将 traceId 透传给 ClickHouse 的 query_id 呢?
实现全链路监控,主要是通过 traceId 贯穿整个链路。表 system.processes 和表 system.query_log 中的 query_id 是随机生成的,ClickHouse 的 query_id 支持自定义,可将自定义的 query_id 映射到系统自生成的 query_id 上,这样 ClickHouse 内部的监控就能与全链路打通,具体操作如下:
ClickHouse-client --port 1***5 --time --format=Null --query="select count() from aggr_member" --query_id="suning20200706“ echo 'select count() from aggr***member' | curl 'http://localhost:8**3/?query_id=suning2020&query=' --data-binary @-
二、ClickHouse 慢查询监控
1、实时慢查询监控
图 3-1 实时慢查询监控