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.rhkb.cn/news/110427.html

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

相关文章

centos7搭建apache作为文件站后,其他人无法访问解决办法

在公司内网的一个虚拟机上搭建了httpsd服务,准备作为内部小伙伴们的文件站,但是搭建好之后发现别的小伙伴是无法访问我机器的。 于是寻找一下原因,排查步骤如下: 1.netstat -lnp 和 ps aux 先看下端口和 服务情况 发现均正常 2.…

淘宝商品数据采集(如何快速获取淘宝商品信息),淘宝API接口申请指南

淘宝作为国内的电商平台,拥有海量的商品信息。对于想要进行淘宝商品数据采集的人来说,如何快速获取淘宝商品信息是一个重要的问题。本文将介绍一些快速获取淘宝商品信息的方法。 1. 使用淘宝开放平台PI 淘宝开放平台提供了多种PI接口,可以通…

【微服务部署】01-Kubernetes部署流程

文章目录 部署1. Kubernetes是什么2. Kubernetes的优势3. 环境搭建4. 应用部署 部署 1. Kubernetes是什么 Kubernetes是一个用于自动部署、扩展和管理容器化应用程序的开源系统 2. Kubernetes的优势 自动化容器部署资源管理与容器调度服务注册发现与负载均衡内置配置与秘钥…

【java】【springboot】【idea】springboot项目pom.xml 灰色下划线

解决方案: 这里我们找到了原因,就是因为选择了Ignored Files导致pom.xml文件被设置在maven忽略文件清单中,所以我们将打勾的选项取消,点击Apply,然后点击OK

一文解析:共享WiFi项目到底怎么样呢?

大家都知道,现代社会已经离不开互联网的便利,而WiFi的普及更是提升了人们的生活质量和工作效率。然而,面对庞大的用户群体和不断增长的网络需求,无论人们到哪都是习惯性的连接上wifi。而共享WiFi的出现,正是满足了大众…

Linux基础(一)

1.操作系统概念 人与计算机交流的中介 管理和控制计算机中硬件和软件资源 处于上层应用程序和底层硬件之间的软件平台 2.操作系统组成 内核:直接控制管理硬件 内核直接识别计算机二进制语言 解释器:把c c java python等语言解释成二进制&#xff…

Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

目录 1267. 统计参与通信的服务器 题目描述: 实现代码与解析: 写法一:两次遍历 hash 原理思路: 写法二:三次遍历 原理思路: 1267. 统计参与通信的服务器 题目描述: 这里有一幅服务器分…

215. 数组中的第K个最大元素

题目描述 给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2…

【Axure教程】调用日期选择器并筛选中继器表格

今天教大家在Axure里怎么调用代码调用浏览器的日期选择器并对对中继器表格进行日期区间的筛选。调用浏览器日期选择器的好处是,可以选择真实的日期,包括某年某月某日是星期几,哪个二月是29天……都是真实的,那不同的浏览器日期选择…

kafka复习:(22)一个分区只能被消费者组中的一个消费者消费吗?

默认情况下,一个分区只能被消费者组中的一个消费者消费。但可以自定义PartitionAssignor来打破这个限制。 一、自定义PartitionAssignor. package com.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;import org.apache.kafka.clients.consumer.internals.Abstrac…

JDK配置环境变量(超详细)

先安装JDK再配置环境变量! JDK可以简单理解为就是java,JDK包含了java项目运行所需要的运行环境JRE,编译运行java程序的java虚拟机JVM。 jdk-8u201-windows-x64安装包(jdk1.8): 提取码:19xv …

外部库/lib/maven依赖项 三者关系

外部库(存放项目初始配置的jar包)(它的文件夹里并没有包含lib文件夹的引的外部的依赖的jar包) lib(存放外部导入到项目的依赖的jar包) maven依赖项(管理项目所有的jar包依赖) 三者存放jar包的关系 项目所依赖的全部的jar包 maven依赖项的jar包 外部库中的jar包 lib中的…

文件夹无法删除?简单3招,轻松解决问题!

“我电脑里有一个文件夹占用了很大的内存,我想将它删除来释放一些内存,但是根本没法删除,为什么会这样呢?文件夹无法删除应该怎么办呢?” 在日常电脑使用中,有时候会遇到文件夹无法删除的情况,这…

【Terraform学习】使用 Terraform 创建应用程序负载均衡器(Terraform-AWS最佳实战学习)

使用 Terraform 创建应用程序负载均衡器 实验步骤 前提条件 安装 Terraform: 地址 下载仓库代码模版 本实验代码位于 task_elb 文件夹中。 变量文件 variables.tf 在上面的代码中,您将声明,aws_access_key,aws_secret_key…

深入理解ArrayList的动态扩容机制及应用

在java编程中,数据结构起着至关重要的作用,而ArrayList作为一种常用的动态数组,为我们在处理数据时提供了便利。其中,其独特的动态扩容机制更是为其赢得了广泛的应用。我们不管在工作还是面试中,都会遇到ArrayList&…

Nginx详解 二:配置文件部分

文章目录 1. Nginx 配置文件1.1 主配置文件1.2 子配置文件1.3 全局配置1.3.1 修改启动的进程数1.3.2 cpu和work进程绑定(nginx调优)1.3.3 修改PID路径1.3.4 nginx进程的优先级(work进程的优先级)1.3.5 调试work进程打开的文件的个…

聚观早报|2023戴尔科技峰会助力创新;小米汽车电池供应商敲定

【聚观365】8月23日消息 2023戴尔科技峰会助力企业创新 小米汽车电池供应商敲定中创新航和宁德时代 iPhone15预计有6种配色 王小川卸任自动驾驶企业禾多科技董事 特斯拉动力总成副总裁宣布离职 2023戴尔科技峰会助力企业创新 近日“新生万物 数实新格局 —— 2023戴尔科技…

周鸿祎为360智脑招贤纳士;LLM时代的选择指南;Kaggle大语言模型实战;一文带你逛遍LLM全世界 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 思否「齐聚码力」黑客马拉松,用技术代码让生活变得更美好 主页:https://pages.segmentfault.com/google-hacka…

系统架构设计高级技能 · 安全架构设计理论与实践

点击进入系列文章目录 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 系统架构设计高级技能 安全架构设计理论与实践 一、信息安全面临的威胁1.1 信息…

相机SD卡数据丢失如何恢复?

出门在外,相机是人们记录生活点滴的重要工具,是旅游的最佳玩伴。人们每到一个地方,都喜欢用相机来见证自己来过的痕迹,拍好的照片都会被放到相机卡里,但在使用相机时,有时我们会意外删除了重要的照片或视频…