对于数据库系统而言,存储容量和数据安全是影响用户零碎的老本及信息安全的重要因素。TDSQL PG版通过反对压缩来缩小磁盘空间应用以此来节省成本,同时反对对表内容加密来保障用户数据的安全性。
摸索前沿钻研,聚焦技术创新。本期DB·洞见由腾讯云数据库高级工程师丁艳飞从工程翻新的角度,为大家介绍TDSQL PG版通明压缩和通明加密的相干实现,次要包含整体架构介绍、压缩办法简介、通明压缩实现、加密脱敏介绍四个局部。
观看视频,获取完整版讲师分享内容
一、TDSQL PG 版整体架构
TDSQL PG版是一款分布式数据库,在内核层面由GTM、CN、DN节点组成。其中GTM是事务管理器,负责协调整个集群的事务,并治理全局的对象。CN节点是协调节点,是业务拜访入口,每个节点之间互相对等,都能对外提供一致性视图。DN节点是数据节点,业务运行过程中产生的数据都会在DN节点上进行存储。
数据库内核配合OSS零碎能够对外提供指标监控、运维治理、实时告警、平安审计、数据治理等运维管控能力。随着业务的一直进行,所产生的数据会越来越多,对DN节点的磁盘存储也造成越来越大的压力。数据节点的存储容量也越来越成为制约整个IT零碎部署密度、影响零碎老本的次要因素。所以目前大多数客户都会要求数据库系统具备数据压缩存储的能力。
二、压缩办法简介
2.1 存储介质压缩
针对压缩需要,在数据库畛域呈现了一些特定的压缩办法,其中一种就是在存储介质中进行压缩。这种形式会在原有的SSD外部引入一个计算引擎。数据依照惯例形式来写入SSD,盘内的计算引擎能够对写入的数据进行压缩解决,再把压缩后的数据写入到存储物理介质中。整个压缩过程对业务通明,下层业务根本无感知,利用方面也能够不进行批改。此外,这种形式相当于零拷贝技术,不须要做额定的数据传输,当数据量增长较多时,也能够很不便地减少多块盘来实现压缩能力的线性扩大。
传统的关系型数据库(应用B-Tree数据模型,如Oracle/MySQL/SQL Server/PostgreSQL)能够间接部署在这种智能存储介质上应用,且不存在占用业务cpu的问题,使用方便,对性能影响小。但目前而言,很少有客户应用,次要起因是这些存储介质的价格昂贵,整体部署老本大,基本上很难实现大批量应用。
2.2 数据编码
另一种罕用的压缩办法是应用数据编码。数据库关系表中寄存的个别是结构化数据,同一列中字段具备雷同的数据类型且有明确的数据边界。对于不同的列,如果它们之间有互相关系,在这些列之间可能也会存在较多类似的数据。所以咱们能够利用数据明确的字段边界和丰盛的类型信息,采纳肯定的编码技术来实现数据库的压缩。
下表中列举了局部常见的编码方式,包含字典编码、RLE编码、常量编码、差值编码、前缀编码等。不同的编码有不同的适配场景,字典编码是较为通用的编码方式,RLE编码则次要用于间断相等的数据,常量编码次要针对近似性常量化的数据,差值编码实用于在小值域范畴内散布平均的整数型数据,前缀编码则实用于前缀雷同的字符型数据。
左边是一个数据库应用数据编码的简略例子,是用字典编码对页面进行压缩的一个实例。当页面满或者页外行的数量达到阈值后,通过数据编码进行压缩,较为罕用的做法是把重复性较高的数据进行去重,将去重后的数据建设字典存储在页面固定区域,而把原来存放数据的中央存成指向特定字典下标的援用。但这种计划最大的问题是频繁更新对性能影响较大。频繁更新会导致页级字典的频繁重建,与此对应的页面数据的援用也须要频繁变动。除此之外,在实现上还须要在页内减少字典区域,对现有页面冲击大,实现简单。
2.3 通用压缩
第三种办法是应用通用的压缩算法对数据库中的数据进行压缩。常见的压缩算法会把输出的数据当作间断的字节流进行解决,再基于一些经典的编码算法比方串编码、嫡商编码来实现对信息的压缩。下表中列举了局部常见的压缩算法,不同的压缩算法谋求的指标不同,比方lz4算法谋求疾速的压缩和解压的速度,而zstd算法则谋求更高的压缩比。
在数据库中,buffer里存储的原始页面个别具备固定大小。这种形式的长处是,在将页面写入到磁盘中时能较好地计算每一个页面在文件中的偏移地位,以不便对这个页面读或者写。但对页面引入压缩算法后就会呈现另一种状况,因为不同的页面存储的文件内容不同,所以采纳压缩算法后,理论压缩后的大小是不固定的。即便对于同一个页面,随着增删改的进行,压缩之后的数据大小也有可能变动。所以当引入压缩后,再从新去磁盘上读取雷同的页面时,页面的偏移地位就会发生变化,这样会对整个数据库层面的读写产生微小的冲击。
为了解决这个问题,通常在数据库畛域会新增一个新的压缩页面类型。这个新的压缩文件里每个页面的大小都是固定不变的,个别会配置成原始页面的二分之一、四分之一或者八分之一,以此来存储压缩之后的数据。但这种实现形式也存在问题,它的压缩次要受限于压缩页面大小的配置。如果压缩页面配置较大,以后的数据量比拟小,压缩之后所占用的空间也比拟小,但因为压缩页面比拟大,所以写入到磁盘文件中时还是要占一个压缩页面大小,这就达不到节俭磁盘空间的目标。
但如果把压缩页面设置的比拟小,则会存在另外一个问题。原有的页面有可能须要多个压缩页面进行存储,所以一个原始的页面会决裂成多个压缩页面,须要额定的原数据信息进行额定的存储。在读取时,须要在原有的压缩页面解压后,再把多个页面从新拼装成为原始页面,因而又减少了实现上的复杂度。
三、通明压缩实现
咱们的指标是实现数据文件的压缩以此来节俭存储空间,且计划实现要简略且适宜OLTP场景。通过前文的介绍,咱们先把智能存储介质排除,因为它属于磁盘层面的压缩计划,不属于数据库自身,临时不作思考。同时咱们也能够排除数据编码,它不适宜于频繁更新的场景,且会对现有页面的构造造成较大的冲击,不满足代码低侵入性的要求,因而咱们把实现基调定在通用压缩办法上。
通用压缩办法存在前文提到的问题,即页面压缩后大小不固定,因而偏移也不固定。如果存在一种办法能使页面压缩后,还能依照原页面固定大小进行偏移的查找,又能把压缩后节俭的空间释放出来,整个计划的实现会简略很多。这时咱们能够采纳文件系统自身提供的打洞能力。文件系统的打洞能力是保障文件其余属性不变的状况下,告知文件系统在指定偏移的地位上有一段空间不再须要,能够被动开释该文件所占用的物理空间。
找到这种形式后,咱们把最终的压缩计划定为应用通用压缩加文件打洞来实现。整个计划以页为压缩粒度,在页面落盘时先应用压缩算法对页面进行压缩,压缩完后依照原有的页面偏移的计算形式找到页面应该写入的地位,将压缩后的数据写到固定的地位中。对于固定页面的大小,除去压缩数据后残余局部所占用的空间,咱们能够利用打洞工具将残余磁盘空间开释。在读取页面时,从磁盘上读取后先进行数据的解压,再将解压后的页面放入buffer中。因而整个压缩解压在buffer层向上齐全通明,在代码实现层面满足低入侵要求。
为了进步压缩速度,在刷脏页时咱们采纳多过程并行的形式进行压缩。在syncbuffer时,轮询压缩过程,将脏页id退出待压缩队列,压缩过程的主循环发现队列中有数据,就会对相应页面进行压缩,再将压缩后的页面存储在slot中。Syncbuffer将脏页id退出待压缩队列后不会期待压缩实现,而是去拜访已压缩实现队列,将队列里对应的页面退出buffer id list中,再对list中的页面进行刷盘。因而页面压缩采纳多线程并行,而压缩和落盘能够看作是一个pipeline的过程,以此来加快速度。
除此之外,咱们也对Vacuum整顿页面时的压缩进行了优化。因为元组更新时不是原位更新,会在原有的元组上做删除标记,再插入一个新的元组。这样在页面里就会存在dead tuple,因而auto Vacuum的过程会定期对页面进行整顿,将页面中无效的元组依照原有的组织形式从页面尾部进行排列和插入。对其余的dead tuple,则会在line pointer上做标记,示意它们能够重用。在页面整顿后,没有用的闲暇空间能够进行置0操作,以此进步整个页面中的数据反复度。
右图是一个简略的测试。咱们对表进行不同水平的更新,从20%逐步到100%。咱们发现在全表更新的状况下,优化后比优化前能够节俭30%的磁盘空间。
为了让备机也反对压缩,咱们也做了相应适配。备机的信息起源渠道次要是主机的日志,因而备机获取压缩信息的场景之一就是FULL PAGE IMAGE。在页面第一次做批改前,在FULL PAGE WRITE的机制下,咱们会把页面记录到日志里。备机在利用到这种类型的日志时,能够获取到页面上记录的压缩信息,在备机页面落盘前依据压缩信息进行页面的压缩,再进行打洞解决。
另一种场景是备机在回放其余日志时可能产生一些新的页面。如果在回放一个插入操作时,以后页面空间有余,须要新增一个页面来进行插入,这时备机会初始化一个新的页面。或者当备机在回放新建索引日志、索引决裂、元数据初始化的操作时,都会波及到页面初始化动作。备机自身没有压缩信息,因而要想得到压缩信息,就须要在主机里对相应日志类型减少压缩信息,给备机进行利用。这样备机在初始化页面后,就能够把压缩信息设置在页面的页面头上,后续就能够依照失常流程进行操作,在理论的落盘前再依据页面头上的压缩信息进行压缩解决。
除了备机外,咱们也须要对数据库绝对应的配套做压缩的反对。
一是备机重建。备机重建是应用pg_basebackup工具,读取对应的主节点上的数据文件,再把该数据文件备份到指定目录下。因为数据文件通过打洞解决,在读取这个数据文件时,它会把每个页面对应的压缩信息读取上来,对空洞局部进行零的填充,这样一来,备份好的文件每个页面的大小就等于没有压缩前的大小。为了应答这种重建的压缩状况,在获取每个表文件后,咱们会把该表文件的每个页面读取上来,依据页面上记录的压缩后的大小,找到空洞对应的偏移地位,在指定的偏移地位上从新进行打洞解决。为了进步解决的速度,咱们对多个文件采取了并行处理。
二是压缩信息查看。为了不便查看压缩信息,咱们对pageinspect进行了相应的适配。它可能读取指定页面上的信息。在读取时先将文件读取,再读到buffer里进行解析和显示。对压缩而言,咱们不须要buffer里的信息,咱们真正须要的是磁盘中理论存储压缩的信息,因而咱们在插件里减少了一些函数,能够反对从磁盘中间接把相应页面读上来,再去解析页面头,再显示对应的压缩信息。
三是压缩率获取。因为咱们通过文件系统的打洞性能来实现压缩,而文件通过打洞后,应用一般的stat或者ll命令读取的大小是蕴含空洞大小的,而真正存储所占用的大小则不包含空洞大小,因而能够利用这两个的理论比值来获取压缩比。
四是参数设置。咱们能够对表和索引别离指定不同的压缩算法,同时也能够查看整个表的信息。在信息显示里,咱们的option选项能列出压缩的状况。如果想要查看每个页面的状况,咱们也提供了函数反对,能够列出对应页面里压缩算法和压缩后页面的大小。如果想要查看整个表的压缩概述,咱们也提供了函数反对,能够看出以后表有多少页面是压缩的,有多少页面没有压缩。
咱们对压缩和非压缩状况做了tpcc、pgbench测试,能够比照压缩前、压缩开启后产生的影响。咱们在测试过程中把shared buffer设置得比拟小,结构出页面频繁换入换出的场景,在这种状况下对页面做频繁的压缩和解压操作。从测试后果能够看到,在tpcc模型下压缩比能够达到2.3,ptmC有15%的新的降落。在pgbench模型下,压缩比能达到6.8,tpcB有约17%的降落。以咱们目前采取的压缩策略来看,采纳通用压缩算法,实质上是以工夫换空间,因而性能劣化在咱们预期之内。
四、加密脱敏介绍
TDSQL PG版整体的平安体系是以数据库三权分立为根底的。咱们把传统的DBA角色分解成平安管理员、审计管理员、数据管理员。在平安规定方面,咱们针对平安管理员减少了平安规定和数据通明加密、脱敏的规定;在审计方面,咱们联合业界的审计规范和业务的场景须要,减少对象审计、用户审计、SQL审计;数据管理员则履行之前DBA数据权限治理和数据库运维的职能。
通过三个角色的划分,咱们从根本上杜绝了零碎的平安死角。平安管理员负责整体平安规定的制订,通过这种形式来束缚零碎中所有的角色。审计管理员则负责制订审计规定、设计零碎中包含审计管理员在内的所有角色,做到零碎的所有操作都具备可追溯性。数据管理员负责数据库的日常运维。这三个管理员之间互相束缚,互相监督。
在这部分咱们次要分享数据通明加密、脱敏的规定。加密次要针对数据文件自身的泄露问题。目前常见的数据库的存储格局根本属于半公开状态,只有拿到了数据文件,再配合相应的数据程序,别人就能够解出外面对应的数据。在这种状况下,咱们须要通过数据中心对一些有窃密要求的文件进行加密,避免透露,因而须要把存储的文件进行加密。
TDSQL PG版反对表级加密和列级加密两种形式。通过下图,咱们能够看到表级加密的流程和压缩的流程十分类似。个别是在页面进行落盘前,先进行加密解决,再进行落盘,在磁盘里存储的都是通过加密后的文件。当须要读取时,咱们会从磁盘上读取后先进行解密,再把解密后的数据放在buffer里,所以用户在读取时能够间接从buffer里获取明文数据。列加密的不同之处在于,列加密会在一行数据进行插入时将这一列值先进行加密,加密完后再插入到buffer的页面中,所以buffer里是加密的状态,磁盘里存的也是加密的文件。当用户须要应用这一列或这个页面时,咱们就会对相应的这列先进行解密,再给用户进行明文显示。
脱敏对应的应用场景是,在拜访数据时,局部用户没有权限看到这些数据的明文,但为了进行运维操作或其余工作须要拜访这些数据,但他们不须要晓得这些数据真正的存储后果。针对这种场景,咱们能够在磁盘里存储失常的明文数据,在用户进行读写时进行解决。如果在用户读取时,发现是受权用户,就能够间接从buffer里拿到失常的数据进行显示;但如果发现是非受权用户,就须要先对数据进行脱敏解决,把脱敏后的后果展现给非受权用户。
加密和脱敏之间互不抵触,能够灵便地搭配应用,既能够对存储内容进行加密,也能够针对不同的用户,采纳用户本人设置的脱敏规定来保证数据拜访的隔离性。
下图是加密和脱敏的简略示例。在这个例子中,非受权用户是分公司经理和人力资源经理,受权用户是董事长。对同样的表格而言,董事长能看到所有信息的原始状态,薪酬和家庭信息也能失常显示。但对非受权的分公司经理而言,在薪酬和家庭信息方面,他查看到的都是脱敏后的后果,例如他只能看到薪酬为0,家庭信息为空。通过这样的形式,零碎里不同等级的用户对同样的数据会看到不同的视图,以此达到隔离的成果。
加密和压缩流程类似,因而咱们也反对加密和压缩的同时应用。在这种状况下,咱们整体解决逻辑不变,在原始页面进行落盘前先进行压缩和加密解决,在读取时进行解密和解压的解决。但须要留神的是,咱们要保障先进行压缩再进行加密。这次要思考到压缩对于结构化的数据可能达到较好的成果,而数据页面自身存储的就是绝对结构化的数据,如果把原页面作为输出源,压缩成果会绝对较好。但如果把原页面先进行加密,加密后失去的数据是绝对芜杂的数据,再把绝对芜杂的后果作为压缩的输出源,压缩成果就会大打折扣。因而为了保障压缩和加密的失常应用,咱们在解决时须要先进行压缩再进行加密。与此绝对应,读取时也是从磁盘读取后先对页面进行解密,再把解密后的数据进行解压,再放入到buffer里,以此保证数据失常的读和写。
TDSQL PG版起源于技术成熟、功能强大的PostgreSQL,在此基础上腾讯云数据库结构和发行了性能更丰盛、稳定性更好、兼容性更广、安全性更高、性能更强、扩展性极好的分布式数据库TDSQL PG版产品。
腾讯公司对TDSQL PG版具备齐全自主知识产权,实现平安可控, 具备在中高端市场规模化代替国外数据库的能力,在数据库根底软件层面无力撑持了国家平安可控策略倒退。以后TDSQL PG版曾经在金融、保险、通信、税务、公安、消防、政务等多个行业的外围交易系统上线运行,为泛滥行业客户提供优质服务。
发表回复