PolarDB PG 版冷热数据分层功能介绍
内容介绍:
一、冷热分层存储原理及特性
二、冷热分层存储支持模式的几种模式
三、冷存数据访问及数据压缩率
四、如何将数据转存OSS
五、分层存储最佳实践
本次分享的主题是在云原生数据库PolarDB PG上自研实现的冷热数据分层存储功能,由刘建伟分享。
一、冷热分层存储原理及特性
1.冷热分层的原理
左边是冷热分层的架构图。上面是PolarDB PG异写构图的架构。中间是共享存储也就是云盘,下面是OSS。数据从云盘写入OSS需要经过一层压缩。同时从OSS读出到共享存储有一个解压缩过程。冷热分层的功能可以用两句话概括。第一是PolarDB可以将OSS对象存储。直接作为一种存储介质。存储价格十分低廉。第二是可以与块存储联合使用。根据不同维度自动将冷热数据分层存储。既保持增删改查的SQL透明性。同时通过多级缓存保障性能的最少衰减。
2.分层存储的特性
(1)第一个特性是易用性比较好。
客户通常认为数据存入OSS之后没办法修改。只能读不能写。但在PolarDB 机上实现的冷热分层存储。没有OSS限制。也就是数据写入OSS之后表可以增删改查,索引是完全透明的。也支持join的联合操作查询。同时分层存储的索引透明。基表数据存储在OSS中。可以在此基础上建立索引。同时索引可以建在云盘上。也可以直接建在OSS上。
(2)第二个特性是灵活度比较高。
PolarDB PG实现的分层存储支持多种OSS分层的策略。最直接的是将OSS基表和索引分开,将基表归档。然后是将分区表归档。这是使用最常见的场景。将历史分区存入OSS进行归档。然后热分区依旧保留在云盘中。
(3)第三种是按大字段进行独立归档。
这是PolarDB PG独有的一个特性。比如有时候一张表里有JSON或者TEXT或者其他符合类型的字段。它比较占用空间。但它的访问量也比较低。访问频度频率比较低。可以将大字段独立的存储在OSS上。其他字段依旧保留在云盘中。第三个特性是性能上采用了三层缓存的设计。首先针对逻辑对象,一些特殊的对象有一层缓存。其次是页面的共享缓存。也就是我们的shared buffer。第三层是文件的缓存。也就是利用云盘实现对OSS的一层物化缓存。在做增删改读时。可以合并一些IO。减少对OSS的访问次数。就可以将OSS的读写延迟影响降到最低。
(4)第四个特性是覆盖的场景比较广泛。
除了通用的场景之外,在时空、时序数据的归档上都可以。例如时空轨迹,随着时间的增长轨迹,历史轨迹可以写入OSS。以及高精地图不更新的部分们也可以放到OSS。时序数据,历史分区也可以直接放到OSS进行归档,可以大幅降低成本。
(5)第五个特性是安全可靠。
由于实现的冷存是SQL透明的。增删改都可以操作。所以在数据的高可用上跟云盘对齐。它是利用copy online机制实现OSS的数据快照。如果有误删或者误改操作。也可以基于OSS快照快速恢复。同时冗余也降到最低。
二、冷热分层存储支持模式的几种模式
1.首先最普通的是数据冷归档模式。
就是无脑的将表索引以及物化视图等任何数据都扔到OSS中。
2.第二种是表与索引分层。
就是将基表的数据存储在OSS中。但是索引建立在云盘上。这样做点查或者索引扫描时能确保性能。
3.第三种是表内的大字段分层。
就是将某一个字段独立写入OSS,其他字段依旧存储在云盘。第四种是比较典型的分区表的分层,可以将过期的历史分区转存到OSS。热分区依旧存储在云盘上。如果查询和写入只达到热分区上。性能完全没有影响。
三、冷存数据访问加速及数据压缩率
由于OSS的访问延迟比较高。为了降低OSS延迟对数据的访问影响,做一层物化缓存。描述OSS物化缓存的一些机制。在默认情况下。会在云盘上开1GB的物化缓存,确保基础的数据写入的IO合并。如果对表的访问性能要求变高。可以通过Polar_smgrcache_size参数来调高缓存。访问性能也能得到加速。
接下来介绍数据压缩率。PolarDB分层存储将数据写入OSS。不是直接写进去,是会通过一层压缩。可以进一步降低在OSS上的存储空间。对于压缩率不同的类型表现不一样。像序列化的int类型,压缩效果最好。它的压缩率可以达到10%以内。也就是1GB的数据压完后不到100兆。其他通用类的integer、Double、text、timestamp数据的压缩率在十几%到三十几%。最多的是通用类型的多字段组合。压缩效果会有所降低。但也能达到30%到40%的压缩率。也就是1GB数据压完之后存到OSS上只有300到400兆。最后是空间几何类型的数据压缩。点类型压缩表现效果比较好。压缩率能达到20%到30%。对于线面数据。压缩效果稍微弱一些。只能达到60%到70%。这是数据在OSS上存储过程中的压缩率。
四、如何将数据转存OSS
只需要通过简单的DDL就可以将数据库中现有的数据存入OSS。首先将一张表或者是索引转存OSS。可以使用ALTER TABLE SET TABLESPACE OSS、ALTER INDEX SET TABLESPACE OSS、ALTER Materialized SET TABLESPACE OSS 将他们写入OSS。对于大字段独立转存OSS开发了一种新的DDL语句。就是alter table set,直接alter column时。设置storage type为OSS。在写入OSS数据时。如果大字段有数据写入,是直接写入到OSS。然后访问和增删改都是完全透明的。第三个是针对分区表的子分区转存。子分区跟普通的表是一样的。所以操作语句也是一样的。通过ALTER TABLE SET TABLESPACE OSS语句就可以实现。
五、冷数据分层存储最佳实践
第一个实践是分区表按时间线自动做冷热分层。分区表如果是按时间序列进行分区。那随着时间的推移。一段时间之前的数据就归为历史数据。历史分区就要自动的转存OSS。对于这种场景,在PolarDB PG里面可以通过pg_corn插件来配合实现按时间线自动冷存的功能。
第二个实践是大字段直接通过DDL语句将storage type设为OSS。
第三个实践是关于转冷存时锁表的问题。在执行表转OSS时,普通的操作会长时间锁住表,直到最后转完才会释放锁。PolarDB 有pg_repack插件。在此基础上实现不锁表直接可以转冷存的功能。
第四个实践是如何实现一键转冷存。当将表还有索引或者是分区表的很多个分区以及分区表上多个索引转存。如果一次一次做DDL操作会比较麻烦,所以提供一键转冷存的函数。就是可以直接调函数,将表以及表上的索引或者是分区表以及底下所有的分区表索引一次性转存到OSS中。
第五个实践是关于统计。怎么统计存储在OSS上数据的大小。提供一系列的统计函数。和5Pg的统计函数不一样。5Pg的函数只能统计在云盘上的存储空间。OSS部分需要通过独立的额外的函数进行统计。接下来是将冷存数据进行预热。通过polal_osfs_prewarm函数将冷存表进行预热。访问时就可以达到比较好的效果。最后是提高读写性能。如果想临时提高对一张表的访问性能。可以临时把polal_smgr_canche值在控制台上调大。当想降回来时再把它调小。期间调大调小是不需要重启数据库非常方便。
接下来打开官网的文档,最佳实践里面涉及很多函数可以直接到官网的自研内核能力,底下的冷数据分层存储最佳实践。里面提供辅助操作的具体函数。比如统计冷数据有专门的函数来进行统计。
以上为分享全部内容。