实时入库不用愁,HStore 帮分忧
本文分享自华为云社区《直播回顾 | 实时入库不用愁,HStore帮分忧》,作者:汀丶。
海量数据时代,如何实现数据实时入库与实时查询?GaussDB(DWS) HStore 表为数据高效存储与查询提供了哪些助力?本期《数仓实时入库利器—HStore 表原理与应用实践详解》的主题直播中,我们邀请到华为云 EI DTSE 技术布道师马俊松,针对 GaussDB(DWS)HStore 表与开发者和伙伴朋友们展开交流互动。通过 4 部分内容帮助开发者快速了解 HStore 表。
GaussDB(DWS)表存储类型演进
传统的数据存储类型有行存储和列存储,GaussDB(DWS) 基于列存储格式设计和实现了全新的 HStore 表,同时提供高效的并发插入、更新入库,以及高性能实时查询。
行存储:数据以行为单位存储在数据块中,适用于传统 OLTP 场景,数据需要进行频繁的增删改查,数据量不会很大。行存储的优点是:点查性能好,更新效率高。实时并发入库使用行存表,能获得较好的并发更新入库性能,但分析查询性能与空间压缩往往不及预期。
列存储:为了解决行存表的分析查询性能问题以及空间压缩问题,GaussDB(DWS)自研了列存储,适用于传统 OLAP 场景,数据量大,更新删除少。列存储能带来很好的空间压缩与批量查询性能提升,对于一些涉及多表关联的分析类复杂查询、数据不经常更新的表,推荐使用列存表。实时并发入库使用列存表,能获得较好的分析查询性能与数据压缩,但无法支持小批量入库。
列存表带 Delta:为了解决小批量入库问题,GaussDB(DWS)自研了列存表带 Delta,适用于 OLAP 场景的小批量数据入库,导入后主要做查询分析业务,更新删除少。实时并发入库使用带 Delta 的列存表,能避免小批量入库的小 CU 问题,但基本无法支持并发更新入库。
HStore 表:虽然列存表带 Delta 解决了小批量入库产生的小 CU 问题,但是没有解决同一个 CU 上的并发更新产生的锁冲突问题。而实时入库的场景下,需要将 insert+upsert+update 操作实时并发入库,数据来源于上游的其他数据库或者应用,同时要求入库后的数据要能及时查询,且对于查询的效率要求很高。
目前的列存表由于锁冲突的原因无法支持并发 upsert/update 入库,导致这些有需要的局点只能使用行存表,但是行存表因为格式的天然劣势,在 AP 查询场景下一方面性能较慢,另一方面由于压缩差导致占用了大量的磁盘空间,对用户产生额外成本。GaussDB(DWS)中的 HStore 表, 在使用列存储格式尽量降低磁盘占用的同时,支持高并发的更新操作入库以及高性能的查询效率。面向对于实时入库和实时查询有较强诉求的场景,同时拥有处理传统 TP 场景的事务能力。
GaussDB(DWS)几种表类型对比
HStore 表的解决方案
对于实时入库场景,数据通过 Kafka、Flink 导入到 DWS 中,同时下游实时应用,对数据入库的操作进行实时查询。入库后的数据支持热转冷,可以存储到 obs 上,进一步为客户节约成本,也支持外表导入,导入通过 ORC/Parquet/text 等格式,导出进行 AI 挖掘等操作。HStore 表相当于同时满足上游的并发入库,以及下游的实时查询。
HStore 表的技术特点
完整的事务一致性
支持全面的事务能力,数据插入或者更新提交后即可见不存在时延,保证数据 ACID 一致性。
全面的功能支持
提供和当前列存一样全面的功能和语法支持。
查询性能好
多表关联等复杂 AP 查询场景下,更完善的分布式查询计划与分布式执行器带来的性能优势,支持复杂的子查询和存储过程。
支持主键等传统索引能力去重和加速点查,也支持分区、全局字典、局部排序等方式进一步加速 AP 查询。
入库快
彻底解决列存 CU 锁冲突问题,支持高并发的更新入库操作,典型场景下,并发更新性能是之前的百倍以上。
高压缩
数据在 MERGE 进入列存主表后,按列存储具有天然的压缩优势,能极大地节省磁盘空间与 IO 资源。
HStore 的 Delta 表与列存老 Delta 表的对比
HStore 表的使用实践
当前 HStore 表提供了视图,可以用来观察 Delta 表的给类型元组数量以及 Delta 的膨胀情况。同时也提供了函数可以对 Delta 表做轻量清理以及全量清理。
关于压缩效率验证、并发更新入库验证、查询性能验证操作,感兴趣的开发者可以观看直播视频,学习后操作一下。
HStore 表的使用注意事项
参数设置
HStore 依赖后台常驻线程对 HStore 表进行 MERGE 清理操作,才能保证查询性能与压缩效率,所以使用 HStore 表务必设置相关 GUC,推荐的配置如下:
并发同一行
当前 HStore 并发更新同一行仍然是不支持的,其中同一行上并发 update/delete 操作会先等锁然后报错,同一行上的并发 upsert 操作会先等锁然后继续执行。由于等待开销也是会影响业务的入库性能,甚至可能产生死锁,所以需要在入库时保证不会并发更新到同一行或者同一个 key。
索引相关
索引会占用额外的空间,同时带来的点查性能提升有限,所以 HStore 表只建议在需要做 Upsert 或者有点查(这里指唯一性与接近唯一的点查) 的诉求下创建一个主键或者 btree 索引。
MERGE 相关
由于 HStore 表依赖后台 autovacuum 来将操作 MERGE 到主表,所以入库速度不能超过 MERGE 速度,否则会导致 delta 表的膨胀,可以通过控制入库的并发来控制入库速度。同时由于 Delta 表本身的空间复用受 oldestXmin 的影响,如果有老事务存在可能会导致 Delta 空间复用不及时而产生膨胀。
UPSERT 性能
HStore 表虽然相比普通列存,并发 upsert 入库性能得到了很大提升,但相比行存还是有差距,大概只有行存的 1/3。所以在不追求压缩率以及批量查询性能、只追求单点查询性能的场景下,还是推荐行存表入库。
欢迎感兴趣的开发者观看直播回放,了解详细信息。更多关于 GaussDB(DWS)产品技术解析、数仓产品新特性的介绍,请关注 GaussDB(DWS)论坛,技术博文分享、直播安排将第一时间发布在 GaussDB(DWS)论坛。
论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html
直播回放链接:https://bbs.huaweicloud.com/live/DTT_live/202308021630.html
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/09c7849c339e978068cf02bf9】。文章转载请联系作者。
评论