GaussDB技术解读系列:高级压缩之OLTP表压缩

8月16日,第14届中国数据库技术大会(DTCC2023)在北京国际会议中心顺利举行。在GaussDB“五高两易”核心技术,给世界一个更优选择的专场,华为云数据库GaussDB首席架构师冯柯对华为云GaussDB数据库的高级压缩技术进行了详细的解读。

GaussDB高级压缩全景

高级压缩是面向业务全场景的数据库压缩解决方案,适用的场景主要分两类。第一类是存储类,主要为业务提供容量控制,减少业务扩容的概率和成本;第二类是传输类,主要是面向跨Region、跨AZ的业务场景如何去匹配业务的网络带宽的现实条件,为业务提供更稳定的SLA保证。这里面又有很多细分的场景,TP、AP都有。

3.png

这里面有非常多的挑战,一是压缩算法怎么设计,二是怎么做冷热判定。我们在整个存储类的压缩里用的都是选择性压缩,基于系统自动发现数据的冷热,只压缩业务中相对比较冷的数据,不去碰相对热的数据。包括实现业务的零侵入、和存储引擎的结合,有很多技术挑战。

典型场景和目标设计

不同的场景对于压缩算法,包括压缩率、业务影响、业务侵入容忍度是不一样的。这里要介绍的,是我们第一个发布的OLTP表压缩的技术细节。讲这个之前,先讲一下OLTP表压缩究竟解决的是什么样的客户场景,这决定了我们整个技术目标。

有两个典型场景是我们在真实业务中碰到的。第一个场景,客户的业务来自于IBM小机,整个单库容量达到几十个TB,容量比较大。业务如果迁移到开放平台,比较大的问题是单体容量太大,整个运维窗口的时间比较长。我们有不同的选择,可以选择大家说的拆库,也就是分表分库,但拆库意味着需要做整个分布式改造,对有些业务来讲是很多年的存量的关键业务,这种改造方式整个风险是非常高的。第二个选择可以用压缩,压缩可以减少容量,但客户在业务设计的开始并没有做冷热分离,比如没有把用户的数据基于时间维度做分片,如果用压缩,客户首要的诉求是能否做到压缩对业务的影响足够低,其次才是压缩率,这是第一个典型场景。

第二个典型场景,客户业务基于分布式集群部署,容量增长得非常快,已经超过一个PB,并且还在不断增长。对于客户来讲,这是非常大的问题,需要定期做扩容。使用压缩同样可以帮助客户减少扩容的频率、变更的风险。但问题是一样的,客户数据同样没有做冷热分离,是面向扩展性来设计的,比如基于用户ID号进行分片,让不同用户的负载能够平均分配给不同的数据节点。由于没有做冷热分离,如果要用压缩,能否做到压缩对于业务的影响足够低,其次才是压缩率。这也是我们看到的非常典型的OLTP压缩的场景。

我们对这两个场景进行了分析,推导出三个基本的设计目标。首先,整个压缩方案必须是零侵入的,不能假设业务的已有数据分布,不能说建一个分区,数据一定能区分冷热,因为业务没有这样的条件。不能对业务的数据分布、逻辑模型有任何的假设,方案必须是零侵入的。第二,如果业务开启压缩,对业务的影响应该是极低的,我们定义至少10%,甚至5%,这是非常重要的。第三才是合理的压缩率,2:1或3:1,如果没有压缩率,做这些事情的价值就不存在了。这三个基本目标也决定了我们后面整个技术方案的设计和工程落地。

关键挑战一:如何判定业务的冷热数据?

确定完目标,有三个比较关键的问题需要解决。一是怎么判定业务的冷热数据,二是判定完之后怎么和现有的压缩引擎结合,对压缩后的数据有效地存储,第三点才是怎么实现有竞争力的压缩算法。

我们做冷热判定,首先是确定判定的粒度。可以按照表、分区、块来判定,也可以按照行来判定。判定的粒度越细,意味着对业务的侵入越低,对业务整个数据分布没有任何假设,当然实现的挑战也越大。基于我们定义的技术目标,在做OLTP表压缩时,第一个目标就是冷热判定必须是行级别的,这样对业务的侵入是最小的。

我们利用了GaussDB现有存储引擎已有的机制。GaussDB现在的存储引擎和其他引擎一样,在整个数据上除了存放用户数据之外还存放元数据,元数据里有事务信息,这个事务信息通常是用来实现事务的可见性,里面记录了最后一次修改的事务ID号。当这个事务ID号足够老,对于当前所有事务都可见,这个时候我们把事务ID号替换成物理时间戳,这个物理时间戳可以用来表达这行数据最后一次修改的时间是什么时候,如果这个时间足够早、足够老,真正达到了冷的条件,那么我们就可以对它进行压缩,用户可以用非常简单的逻辑实现冷热的判定。

4.png

第二个例子是,用户可以自定义冷热条件,这个行如果长时间没有做任何修改,系统就可以把它压缩掉,否则不要碰,这是一个非常简单的策略。如果客户业务中有一些字段有非常清楚的冷热属性,比如交易的时间、交易的完成状态,那可以指定这个字段进行冷热判定。或者客户大部分的交易数据都满足3个月前的交易是冷数据,但其中某些特殊类型的交易,像担保交易,可能没有办法满足这个约束,这时候也可以自定义冷热条件。比如交易状态必须是完结的,或者交易类型不能是特定类型,通过自定义条件和最近修改时间的组合,可以灵活地定义什么样的数据应该压缩。这是第一点,怎么做冷热判定。

关键挑战二:如何对压缩后的数据有效地存储?

第二点,压缩后的目标数据怎么存。根据总体设计目标,我们希望做到对业务的侵入越低越好。我们选择了直接做块内的压缩:把一个块内所有满足冷热判定的行一次性压缩完,把压缩后的数据包就存放在当前数据块内。这样做从压缩率上讲并不是最优选择,但从对业务的影响上讲是一个更好的选择。因为业务即使定义了冷热判定条件,我们仍有一定的概率会访问冷数据,我们希望通过块内压缩的实现来保证访问冷数据的代价有一个确定性的上限,这是块内压缩的基本思考。

5.png

关键挑战三:如何实现有竞争力的压缩算法?

为什么做选择性压缩?很简单,没有任何一个压缩算法能做到数据压缩之后对业务没有影响,今天没有这样的黑科技,这是我们基本的技术判断,所以要去平衡压缩率和对业务的影响。我们首先做的是选择性压缩,业务数据分布满足典型的80-20分布政策,80%的数据占有80%的存储容量,但只消耗了20%的算力。比如银行交易,随着时间的推移,整个订单的访问频率会迅速降低,这是非常典型的满足冷热特征的业务。

如果做选择性压缩,那么只压缩那些占用80%存储容量,但只消耗20%算力的冷数据,就意味着我们在节省存储成本方面达成了80%的目标;而不去压缩那些只占用20%的存储容量,但却消耗80%算力的热数据,就意味着我们在降低对用户的业务影响方面达成了80%的目标,这是非常简单的技术选择。

压缩算法我们也看了一些,比如LZ4是现在性能最好的算法,我们一开始用的就是这个算法,但比较大的问题是压缩率相对较低。如果仔细去分析算法原理,LZ4是基于LZ77算法的一种实现,是把压缩的数据看成一个连续的字节流,从当前开始寻找匹配的字符串,找到字符串长度和偏移进行编码来代替被匹配的字符串,从而实现压缩的效果。LZ77算法从原理上讲非常适合于长文本,相对不太适合像结构化数据这样的,里面有大量的数值类型和短文本,这是数据库的特征。

我们做了很多优化,比如对数值类型做了差值编码,所以压缩框架实际上有两层,第一层对数据做编码,第二层用LZ77算法。原生LZ77算法有很多优化是面向长文本的,包括3字节的编码,我们做了非常多的工程优化,使它更容易面向短文本,比如两字节短编码,包括内置行边界。这里我们无法给出很多细节,主要的优化背景其实就两个:一个是通用压缩算法并不特别适合于关系型数据库结构化数据的场景,二是我们所做的这些工程优化,从通用的压缩场景来讲,并不一定是最优的,但它们是特别适合关系型数据的。

6.png

竞争力评估

最后有一个简单的评估,是通过TPCC和TPCH测试对目前的商用数据库O*进行的压缩率评估。O*和我们的GaussDB一样,也提供了完整的冷热判定能力,但由于发展原因,它实际上先做了数据压缩,再做冷热判定,所以整个压缩算法的压缩率是比较低的;我们使用了标准的TPCH的数据,测试表明我们的压缩率相对于O*平均提高了50%,这些数据可以被直接验证。

7.png

其他的一些厂商,像开源数据库,还有国内的厂商都提供了压缩的解决方案,但共同问题是没有做冷热判定,对用户来讲可以指定一个表或一个分区,里面的数据要么都被压缩,要么都不压缩。压缩意味着存储成本节省,但性能会下降,不压缩则是另外一个选择。这个看上去简单的选择对客户来讲反而是最难的,这也是为什么我们看到今天有很多压缩的解决方案,但用户却不会去用,因为谁也不知道开启压缩之后有什么后果,这是比较大的问题。

这里我们也做了一个标准的TPCC的测试评估,基于GaussDB单机版本进行选择性压缩。根据TPCC的语义,所有已经配送完成的订单就不会再变更,但仍有一定的概率被访问到,这是非常贴近于真实业务场景的访问模型。所以,我们的压缩算法选择了压缩流水类数据,比如订单数据,而一些状态类的数据,比如库存、账户等没有去压缩,在流水数据里,我们也只压缩已经配送完成的订单,不压缩没有配送完成的订单。从最后的结果看,整个压缩之后对于业务的影响在1.5%左右。我们相信我们是业内第一个在150万tpmC性能峰值仍然能够开启压缩并且性能基本不下降的产品。

下一步计划:语义压缩

我们已经打破了数据编码和压缩算法的边界,但对压缩算法的使用本质上没有变化,即把整个数据看成是一维的字节流。但关系数据是两维的、结构化的数据,所以在数据的行与行之间、列与列之间存在非常丰富的关联。这种关联主要来自两种场景,一种是业务本身在做建模时引入的关联,比如为了消除连接,数据模型设计成扁平化或低范式化,这会引入非常常见的关联。第二种是业务服务化改造进行服务的分层,数据在不同的服务分层之间被不断传递而造成的一种关联。我们通过一些算法自动发现这种结构化数据之间的关联,发现这些关联不是用于商品推荐或者服务治理,而是希望通过消除这些关联达到压缩的目的。在很多场景里,这种基于语义的关联消除技术会比通用算法提供更好的压缩效能,这是我们后面会重点去构建竞争力的地方。

小结

为什么做高级压缩的特性?因为我们希望在三个领域实现业内领先。

第一、是在性能敏感场景,在提供合理的压缩率的前提下,对业务的影响(越小越好)实现业内领先。

第二、是在成本敏感的场景,在提供合理的压缩解压性能的前提下,压缩率(越高越好)实现业内领先。

第三、大家可能注意到,冷热判定本身不仅可以做数据压缩,还可以做很多别的工作,比如多存储介质、负载的感知,我们希望对于整个冷热判定,包括模型及方法,在能够支持的业务领域的广度方面,能够做到业内领先,这是我们做高级压缩特性的一个基本目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/74462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3-devtools开发者工具安装方法

因为最近在学习Vue3,但是之前找到的Vue3-Devtools失效了,那就来下载安装下 下载安装 Github下载地址:Vue3-Devtools 这个链接快点:Vue3-Devtools 点击链接后页面如下 点击main选项,下拉列表往下拉,找到你想要的版…

JAVA设计模式第七讲:设计模式在 Spring 源码中的应用

设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案。本文以面试题作为切入点,介绍了设计模式的常见问题。我们需要掌握各种设计模式的原理、实现、设计意图和应用场景,搞清楚能解决什么问题…

渗透测试漏洞原理之---【业务安全】

文章目录 1、业务安全概述1.1业务安全现状1.1.1、业务逻辑漏洞1.1.2、黑客攻击目标 2、业务安全测试2.1、业务安全测试流程2.1.1、测试准备2.1.2、业务调研2.1.3、业务建模2.1.4、业务流程梳理2.1.5、业务风险点识别2.1.6 开展测试2.1.7 撰写报告 3、业务安全经典场景3.1、业务…

Excel VSTO开发7 -可视化界面开发

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 7 可视化界面开发 前面的代码都是基于插件启动或者退出时,以及Excel Application的相关事件,在用户实际操作…

亚马逊云科技人工智能内容审核服务:大大降低生成不安全内容的风险

生成式人工智能技术发展日新月异,现在已经能够根据文本输入生成文本和图像。Stable Diffusion是一种文本转图像模型,可以创建栩栩如生的图像应用。通过Amazon SageMaker JumpStart,使用Stable Diffusion模型轻松地从文本生成图像。 尽管生成式…

并发-Executor框架笔记

Executor框架 jdk5开始,把工作单元与执行机制分离开来,工作单元包括Runable和Callable,执行机制由Executor框架来提供。 Executor框架简介 Executor框架的两级调度模型 Java线程被一对一映射为本地操作系统线程 java线程启动会创建一个本…

Unity3D URP 仿蜘蛛侠风格化BloomAO

Unity3D URP 仿蜘蛛侠风格化Bloom&AO BloomBloom效果流程:制作控制面板VolumeComponent.CSCustom Renderer FeatherCustom Renderer PassBloom ShaderComposite Shader 完善Custom Feather风格化AO 总结 本篇文章介绍在URP中如何进行风格化后处理,使…

高阶数据结构-----三种平衡树的实现以及原理(未完成)

TreeMap和TreeSet的底层实现原理就是红黑树 一)AVL树: 1)必须是一棵搜索树:前提是二叉树,任取一个节点,它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key,中序遍历是有序的,按照Key的大小进行排列,高度平衡的二叉…

2024字节跳动校招面试真题汇总及其解答(一)

1. 【算法题】重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:hea…

SSH是如何配置的

目录 什么是SSH SSH可以做什么其他用途? ssh有几种连接方法吗 我应该用哪种方法连接SSH1或SSH2? 每天都在用SSH你知道SSH的原理吗 开启ssh后telnet会关闭吗 SSH的优缺点 SSH和Telnet之间优缺点的对比 SSH的配置实验 ensp Cisco H3C 1、什么是…

QT—基于http协议的网络文件下载

1.常用到的类 QNetworkAccessManager类用于协调网络操作,负责发送网络请求,创建网络响应 QNetworkReply类表示网络请求的响应。在QNetworkAccessManager发送一个网络请求后创建一个网络响应。它提供了以下信号: finished():完成…

【八大经典排序算法】:直接插入排序、希尔排序实现 ---> 性能大比拼!!!

【八大经典排序算法】:直接插入排序、希尔排序实现 ---> 性能大比拼!!! 一、 直接插入排序1.1 插入排序原理1.2 代码实现1.3 直接插入排序特点总结 二、希尔排序 ( 缩小增量排序 )2.1 希尔排序原理2.2 代码实现2.3 希尔排序特点…

数据可视化、BI和数字孪生软件:用途和特点对比

在现代企业和科技领域,数据起着至关重要的作用。为了更好地管理和理解数据,不同类型的软件工具应运而生,其中包括数据可视化软件、BI(Business Intelligence)软件和数字孪生软件。虽然它们都涉及数据,但在功…

文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

文献阅读:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 1. 文章简介2. 具体方法3. 实验结果 1. 数学推理 1. 实验设计2. 实验结果3. 消解实验4. 鲁棒性考察 2. 常识推理 1. 实验设计2. 实验结果 3. 符号推理 1. 实验设计2. 实验结果 4.…

华为数通方向HCIP-DataCom H12-821题库(单选题:241-260)

第241题 ​​LS Request​​报文不包括以下哪一字段? A、通告路由器(Advertising Router) B、链路状态 ID (Link Srate ID) C、数据库描述序列号(Database Dascription Sequence lumber) D、链路状态类型 Link state type) 答案:C 解析: LS Request 报文中包括以下字段…

协议定制 + Json序列化反序列化

文章目录 协议定制 Json序列化反序列化1. 再谈 "协议"1.1 结构化数据1.2 序列化和反序列化 2. 网络版计算器2.1 服务端2.2 协议定制(1) 网络发送和读取的正确理解(2) 协议定制的问题 2.3 客户端2.4 代码 3. Json实现序列化反序列化3.1 简单介绍3.2 使用 协议定制 J…

【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

python调用GPT实现:智能用例生成工具

工具作用: 根据输入的功能点,生成通用测试点 实现步骤 工具实现主要分2个步骤: 1.https请求调用Gpt,将返回响应结果保存为.md文件 2.用python实现 将 .md文件转换成.xmind文件 3.写个简单的前端页面,调用上述步骤接口 详细代…

操作系统强化认识之Shell编程学习与总结

目录 1.Shell的概述 2.Shell脚本入门 3.变量 3.1.系统预定义变量 3.2.自定义变量 3.3.特殊变量 4.运算符 5.条件判断 6.流程控制 6.1.if判断 6.2.case语句 6.3.for循环 6.4.while循环 7.read读取控制台输入 8.函数 8.1.系统函数 8.2.自定义函数 9.正则表示式入…

【C++入门到精通】C++入门 ——搜索二叉树(二叉树进阶)

阅读导航 前言一、搜索二叉树简介1. 概念2. 基本操作⭕搜索操作🍪搜索操作基本代码(非递归) ⭕插入操作🍪插入操作基本代码(非递归) ⭕删除操作🍪删除操作基本代码(非递归&#xff0…