海量数据分析更快、更稳、更准!GaussDB(for MySQL) HTAP只读分析特性详解
1. 引言
HTAP(Hybrid Transactional/Analytical Processing)这个词相信大家近经常会听到,它能够同时支撑在线事务处理(On-Line Transactional Processing, 简称OLTP) 和在线数据分析 (On-Line Analytical Processing, 简称 OLAP)。令人惊喜的是,ClickHouse 作为近年来炙手可热的大数据分析系统可以通过MaterializeMySQL 引擎挂载为 MySQL 的从库,作为 MySQL 的 "协处理器"面向 OLAP 场景提供高效数据分析能力,这对解决异构数据库之间数据共享问题提供了新的途径。我们可以充分发挥 ClickHouse 的分析性能,结合 TP 类引擎如 MySQL 等提供 HTAP 能力。然而实际应用场景中 ClickHouse 仍然面临一些挑战,因此 GaussDB(for MySQL)的HTAP只读分析应运而生,除了拥有 ClickHouse 本身的性能外,GaussDB(for MySQL)的HTAP只读分析在 MaterilizeMySQL引擎的性能和稳定性等方面具有更的表现,为提供更快更准的数据分析保驾护航。
2. 背景
大数据时代的到来,数据量急剧增长的同时用户结构也越来越多样化,这些用户处理数据时发现,仅仅是创建一个可视化报表需要经过数据的抽取 (Extract), 转换 (Transform) 和装载 (Load), 整个周期可能长达数日甚至数周。事实上,ETL 模式的优点在于能够结合数据湖等处理多源数据,低成本处理海量数据且生态较完善,当然缺点也十分明显,传统的数据仓库和数据湖等无法支持大量实时并发的更新,数据分析时效性较低。除此之外,ETL 模式应对变化的能力也相对较弱,如上游数据源发生变化(例如表结构的变化等),整个数据链的处理过程都需要做相应的修改,增加了数据维护的难度。
如何追求实时分析呢?答案是 HTAP。HTAP 可以支持大量并发的更新且数据同步时延通常在在秒级或毫秒级,有效避免传统解决方案中数据抽取,转换和装载等繁琐步骤,极大提升数据处理的时效性。
3.性能-ClickHouse
- ClickHouse
ClickHouse 是 Yandex 公司开源的面向 OLAP 的分布式列式数据库,具有实时查询、完备的DBMS、高效数据压缩压缩,支持批量更新及高可用等特性。此外,ClickHouse 拥有非常完善的SQL支持以及开箱即用等许多特点。在官方公布的基准测试对比中,ClickHouse 对手。
- Row Store & Column Store
MySQL 存储采用的 Row Store,表中数据按照 Row 为逻辑存储单元在存储介质中连续存储。这种存储方式适合随机的增删改查操作,对于按行查询较为友好。但如果选择查询的目标只涉及一行中少数几个属性,Row 存储方式也不得不将所有行全部遍历再筛选出目标属性,当数据表很宽(表的属性很多)时,查询效率通常较低。尽管索引等优化方案在 OLTP 应用场景中能够提升一定效率,但是在面对海量数据背景的 OLAP 场景仍然显得有些力不从心。
ClickHouse 则采用的是 Column Store,表中数据按照 Column 为逻辑存储单元在存储介质中连续存储。这种存储方式适合采用 SIMD(Single Instruction Multiple Data) 并发处理数据,恰恰弥补了 RowStore 存储方式的缺陷,尤其在大宽表(属性很多)的时候,查询效率明显提升。此外,列存方式相邻数据类型相同,因此天然适合数据压缩,从而达到的数据压缩比。
- Performance
下表是 Yandex 公司官方公布的性能测试数据,数据集 100 million,从上至下的三条数据分别表示:Cold Cache,Second Round,Third Round 的查询响应时间,可以看出 ClickHouse 的性能各大数据库引擎,相比于MySQL而言,性能甚至高达600多倍。
注:以下实验数据均为单节点:2 * Intel (R) Xeon (R) CPU E5-2650 v2 @ 2.60GHz; 128 GiB RAM; mdRAID-5 on 8 6TB SATA HDD; ext4.
4. 巨人肩膀上的 GaussDB(for MySQL) HTAP只读分析
尽管 ClickHouse 拥有如此的性能,但实践生产过程中仍然面临一些困境。比如存在数据类型不支持,全量复制性能问题等方面的挑战。此外也有一些与引擎本身设计有关的性能问题:比如 FINAL 去重导致的查询性能问题等,给用户使用过程带来一些不好的体验。
- 全量并行复制
Materialize MySQL 引擎通过消费 BinLog 的方式来订阅 MySQL 数据。数据同步过程分为三个步骤,首先是检验源端 MySQL 参数是否符合规范,然后是全量和增量复制阶段。ClickHouse 数据同步的全量复制过程是单线程的,在数据量较大时复制时延较高。GaussDB(forMySQL) HTAP只读分析对全量复制进行了并行化处理,优化后的复制性能平均提升 8-10 倍,对实际生产实践是十分有意义的。
- MVCC & Snapshot
MaterializeMySQL 引擎在 DDL 转化过程中默认增加了2个隐藏字段:_sign (-1删除,1插入/更新) 和 _version (数据版本)。下方是同一张表在 MySQL 和 ClickHouse 里的 DDL:
Create Table: CREATE TABLE `runoob_tbl` (
`runoob_id` int unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`runoob_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
---------------------------------------------------------------
ATTACH TABLE _ UUID '14dbff59-930e-4aa8-9f20-ccfddaf78077'
(
`runoob_id` UInt32,
`_sign` Int8 MATERIALIZED 1, /// _sign 字段
`_version` UInt64 MATERIALIZED 1 /// _version 字段
相关文章