《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X的TTL表的使用和原理(1)

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X的TTL表的使用和原理(1)

作者:郁光辉阿里云PolarDB-X技术专家

 

TTLTime to Leave表示数据在表中的生存时间,过期后会自动删除。

 

实际应用中很多场景下数据与时间强相关,比如订单系统、快递电商系统以及系统日志等。一部分数据有很强的时效性,并且数据会随时间快速增长,热度下降也很快,可能会有点查、范围查询的请求,但该部分请求多访问比较新的数据,老数据很少会被访问到。如果数据一直存储在PolarDB中,会占用表空间,意味着存储成本会上升,且查询效率会下降。

 

image.png

 

与其一直付出代价维护数据,不如定期将部分数据删除或归档到成本更低的数据库中。比如可以归拢到列存数据库或OSS等系统中,关系型数据库中存储需要查询的较新数据,很少执行的数据存储在冷存储中。

 

此前,我们比较习惯于比如在MySQL中直接通过 delete+where语句删除数据,但问题在于如果数据规模较大,MySQL会认为这是一条需要全表扫描的SQL,会锁住整个B+Tree,也可能会产生大量Binlog。

 

因为删数据需要事务性保证,会占用MySQL大量磁盘空间。如果数据量太大,甚至会因为MySQL内存不够导致删失败,是一种比较危险的操作。即使删除成功,B+Tree占用的空间还在,并没有真正释放出磁盘空间,存储成本没有下降。

 

一般来说,大规模delete语句之后,还需要补充optimize操作,即重建B+Tree,会对所有数据进行搬运,同样可能造成锁表。

 

image.png

 

因此,我们考虑,是否可以将表空间按照时间进行分区,每个分区包含不同时间范围的数据。但PolarDB-X是分布式数据库,本身具有分区表功能。如上图所示,一张PolarDB-X表已经被按照ID做哈希分为四个分区,数据均匀分布在四个分区中,但是每个分区中的数据包含所有时间范围分区,而我们考虑能否在垂直方向上将每个分区再按照时间进行拆分,即上图中的partition by range columnsdate

 

在PolarDB-X分区表基础上,再叠加一层按照时间维度的拆分,直接作用到物理表上。如要删除老分区,只需对每个分区做drop partition的操作,即可实现快速删除的效果。而对于数据库内部来说,这只涉及到元数据操作,并没有真正发生磁盘IO。数据删除之后,后台线程可以慢慢将该部分数据删除,使得delete操作成为比较轻量级的操作。

 

针对部分不希望被直接删除的老数据,我们提供了数据归档功能,能够将数据归档到OSS存储中,并且提供了一定的存储能力。

 

image.png

 

PolarDB-X除了支持分区表之外,还支持全局二级索引,且全局二级索引也能够分布在不同数据节点上。因此,全局二级索引也可以看作分区表,数据行数与主表完全一样,只是包含的列数比较少,是主表的子集。

 

使用TTL表功能可以对几个重要参数进行设定。

 

每个分区的时间粒度:比如天、月、年。

 

expireAfterCount:数据过了多少个周期之后自动删除。

 

preAllocateCount:提前多少个时间周期创建分区。

 

PivotDate:时间基准,即以该时间为基准划定expireAfterCount和preAllocateCount 。默认为当前时间,也可以指定过去或未来的其他时间,可以是用表达式的方式。

 

上方图示为创建时的场景,下方图示为过了一个时间周期之后,最底下创建出了第十个分区,第一个分区已经过期,会删除或归档到OSS。其本质类似于滑动窗口的结构。

 

image.png

 

TTL表在PolarDB-X的database有两个模式,分别为DRDS和auto。TTL表只能在auto表中使用,创建方式很简单,只需在正常的create table后跟上TTL特有语法即可。

 

TTL语法中可以指定7个参数,如图所示,必填参数有两个,其一为希望用哪一列做TTL的分区列,其二为时间分区的间隔。另外,disable schedule指创建表时不要默认自动创建定时任务,如果不加该参数,则默认会自动创建;start with加上日期参数表示TTL表创建时第一个分区的初始时间。我们不希望系统内有些历史数据被放到TTL表中时直接被删除,或很多历史数据归档到会路由到同一分区,这将导致创建出的TTL表的第一个分区会包含非常多的数据。而如果提供了start with,可以将很多早期历史数据按照时间粒度做路由,避免上述情况的发生。

 


《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X的TTL表的使用和原理(2): https://developer.aliyun.com/article/1228587?groupCode=polardbforpg

 

 

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
4月前
|
Oracle 关系型数据库 分布式数据库
PolarDB产品使用问题之使用pxd安装PolarDB-X出现报错,该怎么办
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
Kubernetes 关系型数据库 分布式数据库
PolarDB产品使用问题之PolarDB-X的架构形态有什么区别
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用问题之原PolarDB-X集群无法连接且Docker容器已经被删除,如何恢复数据
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
运维 关系型数据库 MySQL
PolarDB产品使用问题之PolarDB MySQL版和PolarDB-X的区别是什么
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
112 2
基于Redis的高可用分布式锁——RedLock
|
3月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
10天前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
44 16
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
59 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
1月前
|
NoSQL Redis 数据库
计数器 分布式锁 redis实现
【10月更文挑战第5天】
48 1

相关产品

  • 云原生数据库 PolarDB