HTAP应该是一种需求 而不是一种产品

article/2025/9/25 2:51:14

作者石臻臻, CSDN博客之星Top5Kafka Contributornacos Contributor华为云 MVP ,腾讯云TVP, 滴滴Kafka技术专家 LogiKM PMC(改名KnowStreaming)


LogiKM(改名KnowStreaming) 是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不够的同学,可以联系我,当你导师带你参与开源!

文章目录

    • HTAP数据库面临的问题
      • 迁移风险大成本高
      • 无法获得多样源的优势
      • 性能不达标
    • SPL实现HTAP需求
      • 平滑迁至HTAP
      • 还可以更快
      • 也可以更简单
    • SPL资料

HTAP(Hybrid Transaction and Analytical Process,混合事务和分析处理)自2014年明确提出以后成为了很多数据库厂商努力的方向。其实HATP并不新鲜,早年RDB刚兴起时本来就是用一个数据库同时做事务和分析,但随着数据规模不断变大再直接基于业务库做分析就会影响业务,这时数据仓库出现了,将业务数据导入数据仓库来专门应对分析需求,同时与业务库隔离,这样不仅可以更好地服务分析场景,又不会对业务系统产生影响,这是“合久必分”的阶段。但是由于数据仓库将历史数据与实时数据分开了,有时经常还会采用异构数据库(或大数据平台),如果要分析实时全量数据(T+0)就非常困难了,而T+0又是很多及时性业务必须的,这就造成了“数据仓库之殇”。为了解决这个问题,能不能把AP和TP在一个数据库内同时满足呢?于是HTAP再次登场了,这又到了“分久必合”的阶段。

但我们知道,AP和TP两个场景有显著不同,前者涉及的数据量很大,并且计算逻辑复杂,但并发量往往不大,没有数据一致性要求,甚至经常为了使用方便可以不满足范式;后者恰恰相反,数据量不大且数据处理逻辑简单,但并发量很大,有数据强一致性要求。从功能上讲,TP数据库本来就能执行SQL,也本来就具有一定的AP功能。当初之所以要把TP和AP分开,就是因为巨大数据量时,继续采用偏向TP的技术就不能高效地处理AP的需求(比如AP要求高性能需要使用列存,但TP为了写入更新便利需要使用行存),TP和AP的这些巨大差异就决定了这两个场景不能采用一个技术体系来同时满足,而这件事到现在并没有实质性地改变。

即使如此,还是有一些厂商尝试在同一引擎中同时满足TP和AP的需求,实现上有几种方式。一种是采用多副本的方式,其中某一个副本(可能使用列存)专门用来满足AP的需求;一种是采用行列混合存储,行存和列存各一份,二者之间自动转换;还有一种方式可以不区分行列存储,通过单一存储引擎支撑TP和AP场景,常见的是某些内存数据库。这类HTAP数据库在实现上会优先满足TP的需要,在此基础上再发展AP的功能,因此在满足AP需求时相对一般专用的AP产品往往会有很大差距。

另一种HTAP数据库的做法是在底层仍然将两个场景分离,以“模块化”的方式来设计存储,业务数据产生后就会被复制两份(不考虑副本的情况),一份仍然使用行存用于交易,一份复制使用列存用于分析。相应的存储和计算再借助原本在TP和AP领域已经成熟的技术进行封装和优化,同时设计统一的对外访问接口,底层的差异对应用层完全透明,这样就形成了可用的HTAP产品。

HTAP数据库面临的问题

迁移风险大成本高

无论采用哪种方式设计HTAP数据库,在应用时都会碰到一个问题,如果原来的业务数据库不是(大概率)采用HTAP数据库就要涉及数据库迁移,这将面临巨大的风险和成本。不仅要考量数据类型差异导致的数据结构迁移过程中需要进行改造和处理,还会涉及视图、存储过程以及复杂SQL的改造等,还有在迁移工程中遇到的种种问题要解决,可谓坑多且深。由此带来的业务影响可能会带来极大价值损耗。

无法获得多样源的优势

此外,现代业务系统不仅涉及RDB,还有MongoDB、InfluxDB等NoSQL,以及各种自己封装的业务数据源,种类很多五花八门。这些数据源要迁移到新数据库就没那么简单了,像MongoDB 数据转存到RDB会发现实现很困难。MongoDB 中的很多数据类型和集合之间的关系在RDB中并不存在,比如嵌入式的数据结构、数组和哈希等集合类型、多对多关系的实现。这些问题并不是简单通过数据迁移就能解决的,需要在迁移之前先对部分数据结构进行重构,这需要事先投入相当多的人工和时间成本去梳理业务并设计目标数据组织方式。即使最后花费很大代价把业务数据源迁移到HTAP上,原来那些多样性数据源自身的优势却又丧失了,得失之间有时甚至很难权衡是否值得。

性能不达标

我们知道,数据计算性能和数据组织密不可分,在AP类场景中通常要使用列存来发挥计算优势,但只有列存是远远不够的,有些复杂计算需要针对计算特点专门设计数据存储形式(比如有序存储、数据类型转换、预计算等)。而这些对性能要求高的复杂计算在AP类场景中并不少见,但无论采用何种方式的HTAP,简单“自动化”地行存转列存并不能实现相对“个性化”的效果,性能往往无法达标。这个道理也很简单,天下没有什么都好的事儿,你想融合就必须容忍在某一或某些方面的不足。

迁移风险大、成本高、有损失、性能还可能不达标,考虑到这些问题,我们不禁会问:HTAP数据库这个技术路线对吗?

说到这里我们再回头看一下HTAP的目的,为什么要用HTAP?

其实就是为了进行全量数据实时查询统计,也就是T+0!

如果数据仓库等相关技术能搞定这个问题,那自然也就不需要HTAP了。不过很遗憾,数据仓库仍然延用了关系数据库的封闭体系,数据要先入库才能计算,而且入库又有较强约束。这些导致数据仓库无法很好实现跨数据源尤其是异构和非关系型数据源的混合计算,很难实现T+0的目标。

但集算器SPL可以。

SPL实现HTAP需求

集算器SPL(Structured Process Language),一个专门面向结构化数据计算的开源计算引擎和程序语言。除了提供了丰富的计算类库使其拥有不依赖数据库的独立计算能力外,SPL可以对接多种数据源并完成多源混合计算,从而轻松完成跨数据源的T+0查询。

SPL通过与现有系统融合的方式实现HTAP,这样原有系统的改动很小,TP部分几乎不动,甚至原有的AP数据源也可以继续工作,逐步使用SPL接管AP业务。SPL部分或全部接管AP业务后,历史冷数据使用SPL高性能文件存储,原来针对业务库到数据仓库的ETL过程可以直接移植到SPL上。冷数据量大且不再变化使用SPL高性能文件存储可以获得更高地计算性能;热数据量小仍然存放在原有TP数据源中,SPL直接读取计算,由于热数据量并不大,直接基于TP数据源查询也不会对其造成太大影响,访问时间也不会太长。再利用SPL的冷热数据混合计算能力,就可以获得针对全量数据的T+0实时查询。我们只要定期将变冷的数据固化到SPL的高性能存储中,原数据源只需要保持少量近期新产生的热数据即可。这样不仅实现了HTAP,而且还是高性能的HTAP,且对应用架构冲击很小。

平滑迁至HTAP

现代信息系统中建设数据仓库等专门服务分析场景已然十分常见,加之数据源种类繁多,将这些数据都迁移到一处代价太大了,对于这点前文我们已经分析过。如果能在现有架构的基础上增加跨数据源的实时混合计算能力,就相当于插上了HTAP的翅膀,在不改变现有架构的情况下快速实现HTAP的需求,而这正是SPL的强项。

SPL支持多种数据源,RDB、NoSQL以及RESTful等都可以直接使用,还可以解析JSON/XML等类型数据,可以对接Elasticsearch、Kafka等数据源,此外传统/新兴数据仓库、大数据平台等也可以直接取数计算。

在对接的同时可以针对任意多种数据源进行混合计算,这样实时数据从生产库中读与取自历史库/数据仓库/大数据平台的冷数据混合计算就可以实现T+0全量实时数据查询。这样原有应用架构几乎不用变动(尤其是生产库)就可以获得HTAP(架构层面)期望的效果,成本极低。

使用SPL在现有架构上输出HTAP能力还有一个好处是可以充分保留原有数据源的优势。NoSQL仍然可以继续使用而不必强行将结构拉成RDB的形式,自己封装的数据访问与交互接口也不必费心去迁就新数据库,原来的优势与个性化仍然保持,风险很低的同时价值几乎没有损耗。

还可以更快

在分析侧也一样,基于SPL也可以继续使用原本建设好的分析平台。但如前所述,分析场景面临的数据量大且计算逻辑复杂,尤其需要高性能。SPL还提供了高性能计算机制,可以全面接管原来分析侧(AP)的业务实现高性能数据计算。

我们知道,高性能计算涉及两方面,一个是数据组织方式即数据存储,另一个是算法,这二者密不可分,很多高性能算法需要将数据组织成相应格式(如有序)才能发挥作用。SPL提供了自有的高性能存储机制,直接采用文件系统。将数据存储特定格式的文件中,不仅可以获得更高的IO存取效率以及文件系统灵活的管理能力,还可以充分利用自有格式的列存、有序、压缩、并行分段等数据存储优势,从而高效地发挥高性能算法效力。

而在算法方面,SPL提供了十分丰富的高性能算法库。遍历复用、有序归并、外键预关联、标签位维度、并行计算等,都已经封装好,可以直接使用,配合SPL的存储机制就能获得高性能。而且这其中有很多算法都是SPL独创的,在业内也是首次提出。

如果简单地将TP中的行存转换成SPL中的列存,工作量也非常低。但为了获得高性能,常常还需要精心设计存储方式,这时,将会有一定量的ETL动作,但这个工作与原来从业务系统ETL数据到数据仓库基本是一样的,并不会更复杂,而且这个工作对于高性能是少不了的。和一般HTAP数据库很难实施经过有效设计的存储相比,SPL将冷热数据分离后可以从容不迫地像以前TP/AP分离时那样实施更高效的存储组织,这样更能将TP和AP双边的性能发挥到极致。相对大幅的性能提升,数据组织的工作往往是值得的。

在实战中,使用SPL存储和算法提升数倍数十倍性能的案例很多。比如在某保险公司车险保单跑批的案例( 开源 SPL 优化保险公司跑批优从 2 小时到 17 分钟 )中,使用SPL将计算时间从2小时缩短到17分钟。这里使用SPL接管存储后再利用SPL特有的遍历复用技术(在对大数据的一次遍历过程中实现多种运算)有效地减少外了存访问量,同时将涉及对一个大表进行三次关联和汇总的运算只需要遍历一次(SQL要将大表遍历三次),并在关联运算上采用了不同的算法,因此获得了巨大的性能提升。

还有在 开源 SPL 将银行手机账户查询的预先关联变成实时关联 的案例中,使用SPL将原本只能预关联的手机账户查询变成实时关联,同时服务器数量从6台降为1台。这里充分利用了SPL的有序存储机制,一次性读取整个账户数据时可以有效减少硬盘时间(物理存储连续),再借助区分维表和事实表的外键实时关联技术使用单机就能完成实时关联查询,性能提升明显,硬件需求也降低了许多。

也可以更简单

基于SPL的HTAP,并不止于T+0和高性能。

数据计算(主要指OLAP场景)一向有两个难点,跑得慢(性能)和写得简单(开发效率)。前者我们说过了,后者使用SPL还可以获得很大改善。

现在我们处理数据还主要基于SQL(其他高级语言太麻烦),但SQL仍然有很多不好描述的运算,这个原因主要是SQL的理论限制,这里我们不多说,感兴趣的小伙伴可以阅读这篇文章: 写着简单跑得又快的数据库语言 SPL

鉴于SQL在复杂计算方面的描述能力(开发效率)太差,SPL并没有沿用SQL体系,而是基于新的理论重新设计了一套敏捷计算语法,基于这个语法再实施计算尤其复杂计算会更有优势,写法也更简单。

我们可以通过电商系统中常见的漏斗运算来感受一下SPL的简洁性。

SQL(oracle)实现:

with e1 as (select gid,1 as step1,min(etime) as t1from Twhere etime>= to_date('2021-01-10', 'yyyy-MM-dd') and etime<to_date('2021-01-25', 'yyyy-MM-dd')and eventtype='eventtype1' and …group by 1
),
with e2 as (select gid,1 as step2,min(e1.t1) as t1,min(e2.etime) as t2from T as e2inner join e1 on e2.gid = e1.gidwhere e2.etime>= to_date('2021-01-10', 'yyyy-MM-dd') and e2.etime<to_date('2021-01-25', 'yyyy-MM-dd') 
and e2.etime > t1and e2.etime < t1 + 7and eventtype='eventtype2' and …group by 1
),
with e3 as (select gid,1 as step3,min(e2.t1) as t1,min(e3.etime) as t3from T as e3inner join e2 on e3.gid = e2.gidwhere e3.etime>= to_date('2021-01-10', 'yyyy-MM-dd') and e3.etime<to_date('2021-01-25', 'yyyy-MM-dd') 
and e3.etime > t2and e3.etime < t1 + 7and eventtype='eventtype3' and …group by 1
)
selectsum(step1) as step1,sum(step2) as step2,sum(step3) as step3
frome1left join e2 on e1.gid = e2.gidleft join e3 on e2.gid = e3.gid

SPL实现:

AB
1=["etype1","etype2","etype3"]=file("event.ctx").open()
2=B1.cursor(id,etime,etype;etime>=date("2021-01-10") && etime<date("2021-01-25") && A1.contain(etype) && …)
3=A2.group(id).(~.sort(etime))=A3.new(~.select@1(etype==A1(1)):first,~:all).select(first)
4=B3.(A1.(t=if(#==1,t1=first.etime,if(t,all.select@1(etype==A1.~ && etime>t && etime<t1+7).etime, null))))
5=A4.groups(;count(~(1)):STEP1,count(~(2)):STEP2,count(~(3)):STEP3)

oracle的 SQL 写出来要三十多行,理解起来有相当的难度。而且这段代码和漏斗的步骤数量相关,每增加一步数就要再增加一段子查询。这种SQL,写出来就已经不易,性能优化更是无从谈起。

相比之下,SPL 就简单得多,处理任意步骤数都是这段代码。

好了,说到这里各位看官应该了解了,SPL并不是一个HTAP数据库,而是提供了一种新思路来满足HTAP的需要。HTAP数据库很热,厂商的宣传口号很容易让我们陷入只能使用一种数据库来解决HTAP问题的藩篱而不自知。但只要我们再多想一点就会发现,HTAP是一种合理的业务需求,满足它或许并不需要一种新数据库,而是能够解决问题的新技术和架构,而SPL提供了这种可能。

SPL资料

  • SPL下载
  • SPL源代码

http://chatgpt.dhexx.cn/article/xdGx0RoJ.shtml

相关文章

009、体系架构之HTAP

HTAP HTAP技术传统的HTAP解决方案HATP的要求TiDB的HTAP架构TiDB的HTAP特性使用场景 MPP HTAP技术 传统的HTAP解决方案 HATP的要求 可扩展性 分布式事务分布式存储 同时支持OLTP与OLAP 同时支持行存和列存OLTP与OLAP业务隔离 实时性 行存与列存数据实时同步 TiDB的HTAP架构 …

什么是HTAP 阿里云上实现

讲师介绍 梁成辉&#xff08;城璧&#xff09;&#xff0c;阿里数据库事业部技术专家&#xff0c;阿里分布式数据层中间件TDDL、云产品分布式关系型数据库服务DRDS技术负责人。曾多次担任数据层稳定性负责人并保障双十一TDDL & DRDS的稳定性&#xff0c;目前主要聚焦在DRD…

浅谈 HTAP 混合技术和金融业应用场景

近年来&#xff0c;随着大数据应用场景的快速普及与多样化发展&#xff0c;传统的数据处理方案已愈发难以满足海量数据实时分析的数据处理需求。针对上述挑战&#xff0c;混合事务/分析处理&#xff08;Hybrid Transaction and Analytical Process&#xff0c;HTAP&#xff09;…

聊聊 HTAP 的前世今生

随着现代社会大型实时分析应用的逐渐流行&#xff0c;关系型数据库已经难以处理高并发的事务请求。商业层面上&#xff0c;当全球进入数字化时代&#xff0c;数字化技术渗透到各行各业&#xff0c;同时产生了海量数据&#xff0c;数据的存储和应用是企业决策的重要依据之一&…

深入浅出理解什么是HTAP

关于HTAP HTAP(Hybrid Transactional/Analytical Processing)混合事务 / 分析处理。这里的HTAP就是常见的比较经典的OLAP和OLTP的处理场景的结合体。即可解决OLTP在线事务处理场景,还可以解决OLAP在线分析场景。Gartner也认为HTAP数据库将成为数据库领域的一个重要的发展趋…

《穿越计算机的迷雾》第二版再版说明

《穿越计算机的迷雾》2018年已经再版&#xff08;第2版&#xff09;。 转载于:https://www.cnblogs.com/leec/p/8099391.html

《穿越计算机的迷雾》第一版说明

&#xfeff;&#xfeff; 这 本书已经出版&#xff0c;并在实体书店和网上书店铺货。需要的朋友可以上网搜索并购买。 如果你关心这本书&#xff0c;就请移步到 http://www.tianya.cn/publicforum/content/it/1/502390.shtml 。这是我最早发帖的地方&#xff0c;欢迎大家到这…

《穿越计算机的迷雾》读书笔记二

振荡器 电子二极管 电子三极管 触发器 跑马灯 寄存器

《穿越计算机的迷雾》读书笔记九

对于每个扇区来说,真正用于存储用户数据的地方是在扇区头之后&#xff0c;一般有512字节。 指令集: 1.算术运算指令和逻辑运算指令 2.数据传送指令 3.处理器状态控制指令

《穿越计算机的迷雾》读书笔记四

通常&#xff0c;一个能保存很多二进制数的东西叫做存储器。 所有的存储器都有一个共同特点,那就是它们通常都只有一个口。 取数译码器 一条完整的指令总是以操作码开始&#xff0c;后面跟着操作数。

《穿越计算机的迷雾》读书笔记八

中断的意思是在做一件事情的时候临时打了个岔&#xff0c;中途去做另外一件事情&#xff0c;然后再回来。 键盘上的所有按键都被当成字符看待 键盘是为正在运行的软件服务。 显卡 灰度图像 三枪三束显示器 液晶

《穿越计算机的迷雾》读书笔记三

计算机为什么会自动工作(计算)?这种"自动"本质上是怎么发生的&#xff1f; 用继电器制造逻辑门。 电子管 晶体管 脉冲&#xff0c;计数器 多个触发器可以构成一个寄存器 在逻辑电路里,大家共用的公共线路称为总线。

读书笔记-穿越计算机的迷雾

一本了解计算机的入门书&#xff0c;想学“计算机组成与原理”的时候看到的。还有一本书也值得看&#xff1a;《编码的奥秘》 收获 逻辑学 让我意识到逻辑学的重要性&#xff0c;有空可以了解他&#xff0c;当时学离散数据没有认真学&#xff0c;现在都忘了。 逻辑电路的由…

《穿越计算机的迷雾》读书笔记六

运算器 指令集 规律 计算机之所以有用,仅仅是因为我们只让它干有规律的事情。 ROM(只读存储器)

穿越计算机的迷雾--读书笔记三

第五章&#xff1a;从逻辑学到逻辑电路&#xff08;计算机的基本电路&#xff09; 逻辑学 &#xff1a; 生活逻辑学举例 两种推理方法&#xff1a;类比推理和归纳推理 逻辑学来由及定义 两种逻辑&#xff1a;演绎逻辑(联言全真则真和选言一真则真)和形式逻辑 思维分类&…

穿越计算机的迷雾--读书笔记五

第十三章&#xff1a;集成电路时代&#xff08;计算机配件的进一步发展&#xff09; 电子管和晶体管时代&#xff1a; 要造计算机的困难&#xff08;资金和体积&#xff09;&#xff0c;和电子管比晶体管的优势&#xff1a;传输速度更快&#xff0c;介绍字节&#xff08;换算和…

穿越计算机的迷雾--读书笔记二

读书笔记二 第三章&#xff1a;怎样才能更让机器做加法&#xff08;计算机的基本计算法则&#xff09; 我们是怎样用十进制做加法的&#xff1a;十进制法则(满十进一) 用二进制做加法其实更简单&#xff1a;二进制法则&#xff08;满二进一&#xff09; 使用全加器来构造加法…

穿越计算机的迷雾

电子的基本知识 1.的基本构成单位----原子是由电子、中子和质子三者共同组成&#xff0c;中子不带电&#xff0c;质子带正电&#xff0c;电子带负电&#xff0c;原子对外不显电性&#xff0c;相对于电子和中子组成的原子核&#xff0c;电子的质量极小&#xff0c;质子的质量大…

《穿越计算机的迷雾》读书笔记一

全加器 尽管从表面上看,计算机很神奇,但掩盖不了它实质上只是一种普通电器的事实。 继电器 逻辑学的任务就是总结抽象思维的规律和特点。 逻辑学的任务就是寻找获得真理的方法。 非门 与门 或门 异或