PART1.
实时数据分析场景
为了解决实时数据分析问题,我们先后调研了TiDB、ClickHouse和DorisDB,总结如下:
1.1 TiDB
TiDB是一款同时支持OLTP与OLAP的融合型分布式数据库产品,具备水平扩缩容、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。
1.1.1 TiDB的优点
同时支持OLTP和OLAP,支持更新和删除操作,支持Flink端到端的ExactlyOnce语义和幂等操作。
1.1.2TiDB的缺点
OLAP性能相对ClickHouse和DorisDB较弱,没有预聚合功能和预计算功能,不支持向量化执行。
1.2 ClickHouse
ClickHouse是由俄罗斯Yandex公司研发的,全称是Click Stream,Data Warehouse,简称ClickHouse,是基于页面的点击事件流,面向数据仓库进行OLAP分析的数据库。
1.2.1 ClickHouse的优点
能做到毫秒级查询,高效使用CPU,同时支持按照向量进行处理数据,属于完全的列式存储系统。
写入数据非常快,非常适合大批量数据更新的操作(150MB/S)。
不依赖Hadoop底层复杂的生态系统,独立部署。
1.2.1ClickHouse的缺点
不支持事务操作,不支持真正的数据更新/删除操作。
不支持标准的SQL语言,SQL写法很个性。
几乎不支持SQL的Join操作,在做OLAP分析时,只能借助宽表。
难以实现高并发查询,不能通过扩容来提高并发能力。
不擅长(但是能做到)按照主键粒度进行行级数据查询。
1.3 DorisDB
DorisDB是鼎石科技打造的新一代企业级MPP数据库。继承了Apache Doris项目十多年研发成果。DorisDB重新定义了MPP分布式架构,集群可扩展至数百节点,支持PB级数据规模。DorisDB还打造了全新的向量化执行引擎,单节点每秒可处理多达100亿行数据,查询速度比其他产品快10—100倍!
1.3.1 DorisDB的优点
DorisDB多表关联查询性能比较好,支持各种Join操作,不仅支持大宽表查询,还支持星型和雪花型数据查询。
数据按列式存储,在做数据查询时,只访问查询涉及到的列,降低I/O消耗。
支持标准的SQL语言,可以直接对接主流的BI系统。
支持事务,可以很容易地实现数据的不丢不重。
支持常用的可视化管理工具:可以使用 Prometheus、Grafana 将监控项指标列出。
内部支持订阅 Kafka 数据流,实现直接对接 Kafka(可自动感知 Kafka 中 partition 变化,合理调度并发导入),支持对 Kafka 原始数据做二次处理(如转换,过滤等)。
1.3.2 DorisDB的缺点
DorisDB主要是用来解决PB级数据查询,如果在10PB以上建议使用Hive/Spark等工具。
不支持insert overwrite操作,可以使用truncate + insert into代替。
不适合做大规模的批处理,目前都是基于内存进行计算,负责的批处理计算会造成OOM。
PART2.
选择DorisDB建立实时分析系统
基于上面的调研考察,决定使用DorisDB建立一个实时分析系统。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。Apache Doris的分布式架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。
Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。令您的数据分析工作更加简单高效!

2.1 MySQL数据同步

可以使用Canal+Kafka的方式实时将MySQL数据同步到DorisDB。Canal是阿里开源的一款MySQL binlog同步工具,通过Canal将MySQL的数据同步到Kafka,然后通过DorisDB的Routine Load方式消费Kafka数据到DorisDB。
2.2 实时数据仓库的总体架构

基于DorisDB的实时数据仓库总体架构如下,主要分成3个部分:
2.2.1 数据源
业务DB数据(主要是MySQL,可以使用Canal+Kafka的方式将MySQL数据实时同步到DorisDB)、日志数据(APP、Web和H5小程序等埋点数据,通过Flume写入到Kafka)
2.2.2 数据计算层
采用DorisDB的Routine Load直接消费Kafka中的binlog数据。
通过Flink等流式处理工具,将日志数据写入DorisDB。
在DorisDB中按照下面的方式创建数据仓库表。
2.2.3 数据应用层
DorisDB完全兼容MySQL协议,BI或者业务系统可以直接使用MySQL Connector直接连接DorisDB进行使用。
使用DorisDB的Export将DorisDB中的数据导出到HDFS中。
2.3 实时数据仓库建设流程

DWD明细层:明细事实表、维度表和明显宽表
DWS汇总层:公共汇总、通用视图、聚合宽表
ADS应用层:业务指标、汇总结果、物化视图
BI层:通过自研的一个指标定义工具,分析人员可以快速的基于DWS构建报表,也可以衍生出一些复合指标进行二次加工。分析师也可以将取数口径中的SQL做临时修改,生成一个复杂跨主题查询SQL,来应对一些Adhoc需求场景。
PART3.
数据链路监控
我们目前使用Prometheus+Grafana框架来监控 DorisDB 实时数据仓库。其中 Node Exporter 负责采集机器层面的指标,DorisDB 也会自动以 Prometheus格式吐出 FE、BE 的服务层面的指标。另外,部署了OLAP Exporter 服务用于采集 Routine Load 相关的指标,旨在第一时间发现实时数据流导入的情况,确保实时数据的时效性。

实时生产数据预警
为了监控DorisDB的实时数据产出情况,我们设置了三种预警:
检查DorisDB 消费Kafka的任务,是否挂掉了,如果停掉自动重启,重启3次依然失败,再发通知,人为干预。
检查常规任务的执行,如果执行报错,就发通知。
检查数据源与DorisDB实时数仓ods层表,schema的对比,如果出现schema变更,就发通知人为干预。这样我们就能在白天实时了解schema的变更情况,不必要等到调度报错才发现,而且不影响线上数据产出。
PART4.
总结和展望
在业务使用中也遇到了例如任务调度相关的、导入任务配置相关的和查询相关等问题,这也在推动我们的OLAP团队更深入的了解DorisDB。我们机会在以下方面做优化处理:
推广使用物化视图来进一步提升查询的效率;
使用bitmap来支持UV等指标的精确去重操作;
使用审计日志,更方便的统计大查询、慢查询,便于驱动OLAP用户修改不合理的逻辑写法;
我们会加速更多业务向OLAP平台靠拢,以提升应用的影响力。
PART5.
DorisDB介绍
5.1 DorisDB的架构
5.1.1 FE
FE主要负责元数据的管理、存储,以及查询解析等。
管理元数据:执行SQL DDL命令,用Catalog记录库,表,分区,tablet副本等信息。
FE高可用部署:使用复制协议选主和主从同步元数据,所有的元数据修改操作,由FE leader节点完成,FE follower节点可执行读操作。元数据的读写满足顺序一致性。FE的节点数目采用2n+1,可容忍n个节点故障。当FE leader故障时,从现有的follower节点重新选主,完成故障切换。
FE的SQL layer对用户提交的SQL进行解析, 分析, 改写, 语义分析和关系代数优化, 生产逻辑执行计划。
FE的Planner负责把逻辑计划转化为可分布式执行的物理计划, 分发给一组BE。
FE监督BE, 管理BE的上下线, 根据BE的存活和健康状态, 维持tablet副本的数量。
FE协调数据导入, 保证数据导入的一致性。
5.1.2 BE
BE管理tablet副本, tablet是table经过分区分桶形成的子表, 采用列式存储。
BE受FE指导, 创建或删除子表。
BE接收FE分发的物理执行计划并指定BE coordinator节点, 在BE coordinator的调度下, 与其他BE worker共同协作完成执行。
BE读本地的列存储引擎获取数据,并通过索引和谓词下沉快速过滤数据。
BE后台执行compact任务, 减少查询时的读放大。
数据导入时, 由FE指定BE coordinator, 将数据以fanout的形式写入到tablet多副本所在的BE上。

5.2 智能CBO查询优化器
在执行 SQL 查询时,需要依次经过查询解析器、分析器、优化器、查询执行层和存储层。查询优化器的输入是逻辑的抽象语法树,输出是“最优的” 物理执行计划。查询越复杂,数据量越大,物理执行计划的好坏对查询性能影响越大,所以成熟的商业数据库都需要一个强大的、成熟的查询优化器。
CBO 优化器完整地支持了 TPC-DS 99条SQL,支持了更复杂的相关子查询;在性能上,CBO 优化器支持了更多的启发式优化规则,可以基于统计信息进行 Cost 估算,可以更准确地进行 Join 左右表调整、Join 多表 Reorder、Join 分布式方式选择,TPC-H 执行总时间是旧优化器的1/3,部分 TPC-DS 复杂查询有30到50倍的提升。
这部分说明来源于官网。
5.3 DorisDB的分区分桶机制
DorisDB支持两级分区和动态分区。首先,第一级分区对数据做Range划分,用户可以把分区作为管理目标,动态增删分区。其次,为了解决分区内的数据倾斜问题,对分区做第二级分桶,对分区内的数据做Hash划分。这种分区分桶的设计方法,可以灵活管理用户数据,比如可以设置分区的存储介质,副本数,分区的生存周期和分桶数量等等。用户可以利用分区分桶的机制实现冷热数据分离等功能。
PART6.
总结
这仅仅是工作内容的冰山一角,分享出来,希望大家多提宝贵意见。关注我们或阅读原文还有更多干货等着你~




