存储成本最高降至原来的5%,PolarDB分布式冷数据归档的业务实践

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 国内某家兼具投资理财、文化旅游、票务为一体的大型综合型集团公司,2015年成立至今,由于业务高速发展,业务数据增长非常快,数据库系统屡次不堪重负。该公司数据库运维总监介绍,他们目前业务压力比较大的是票务和订单系统,他们的平台每天新增几千万的订单数据,订单的数据来自于各个终端,近几年每个月以300G的数据规模在高速增长,由于数据不断增加,数据库系统迄今为止迭代过了3次。

背景

国内某家兼具投资理财、文化旅游、票务为一体的大型综合型集团公司,2015年成立至今,由于业务高速发展,业务数据增长非常快,数据库系统屡次不堪重负。该公司数据库运维总监介绍,他们目前业务压力比较大的是票务和订单系统,他们的平台每天新增几千万的订单数据,订单的数据来自于各个终端,近几年每个月以300G的数据规模在高速增长,由于数据不断增加,数据库系统迄今为止迭代过了3次。
image.png

第一阶段:自建单机MySQL,开始单机MySQL还能满足业务的增长,所有的票务数据都可以放在MySQL数据库里头,但是数据越来越多的时候,我们发现有些单表的数据早已超过2000w,熟悉MySQL的朋友应该知道,表数据超过2000w后,性能变差。数据库变慢,开始我们的业务方还能接受,到后来越来越慢,最终我们只能删数据,删数据后,必须做Optimize Table才会释放空间,每次操作都非常紧张。但后来公司的业务做了升级,要求保留过往所有的票务数据和订单数据,就意味着不能删除老数据了。所以我们在18年年底做了一次数据库系统升级。

第二阶段:利用开源中间件+MySQL我们自建了一套分库分表的数据库,极大缓解了我们业务增长带来的压力。这套系统在我们线上运行还不错,唯一不足点就是这套数据库系统库没有一套完整的binlog日志,无法直接利用同步工具将数据同步给数仓系统。只能挨个将底下的MySQL做单独的数据同步,到数仓系统。
image.png

这套同步链路比较大的问题就是无法保证分布式事务的完整性,同时在同步过程中还不能做DDL操作。我们公司的业务其实也一直在调整,偶尔需要对表结构做变更的话,业务需要停服,我们挨个对底下的MySQL做表结构的变更,很麻烦。我们在18年-20年业务增长确实很快,到22年底我们的数据已经到达了20几个T了,这样每次做结构变更,业务的停服时间也越来越久了。期间我们还做了两次数据库的扩容,使用过分库分表中间件自建MySQL集群的人都知道,这个扩容相当于再自建一套更大规模的MySQL集群,然后将数据迁移过去,非常麻烦。所以到22年年底,我们就不得不考虑迁移到分布式数据库。

第三阶段:我们当时觉得自建MySQL集群的维护成本已经很高了,当时公司政策也是上云。所以在22年年底我们开始调研业界的分布式数据库,最终我们选型了PolarDB分布式数据库,这套系统经历了多次双11大促,是一套高性能云原生分布式数据库产品。但是我们当时对比了其他云产品,让我们下定决心迁移的主要是看中了以下三点:

1、透明分布式特性:从连接、开发到管理行为均最大限度保留单机MySQL的使用体验,让用户的分布式改造周期大幅缩短,研发运维团队的原有技术栈最大限度保留。同时也支持Online DDL和在线扩容,在做数据库变更的时候,困扰我们几年的停服也得以解决。
image.png

  1. 全局Binlog能力: PolarDB-X是兼容MySQL生态的分布式数据库。通过实例内PolarDB-X的CDC组件,能够提供与MySQL binlog格式兼容的变更日志,并且对外隐藏了实例扩缩容、分布式事务、全局索引等分布式特性,让您获得与单机MySQL数据库一致的使用体验。这个能力大大降低我们同步的运维成本,兼容MySQL Binlog的协议,让我们无缝对接开源同步工具。
    image.png

  2. 冷数据归档能力: PolarDB-X基于OSS存储服务,推出冷热数据分离存储这一新功能。在这一功能的基础上,可以便捷地将冷数据从源表中剥离出来,归档至更低成本的OSS中,形成一张归档表;归档表支持高效的主键与索引点查、复杂分析型查询,满足高可用、MySQL兼容性和任意时间点闪回等特性。您可以像访问MySQL表一样来访问归档表,也可以用开源大数据产品接入OSS的归档数据。
    image.png

这个特性其实很适用我们这种票务和订单系统的业务,这类业务天然按照时间日期划分为冷热。好比我们公司的业务客户往往会查询最近3个月的订单数据,3个月之前的数据基本不查询,但是这些历史数据都必须保留下来,所以数据会非常大。我们在正式迁移之前,按照下面的表格计算了一笔账:
image.png

按照目前的数据规模,我们3个月之前的数据做了下估算,大概是20T。
image.png
这20T的数据可以归档到oss上,光一个月就帮我们节省了近2w的成本,整体的存储成本最高降低了原来的 5% ,所以当时我们非常有动力做这次数据库系统的升级。

数据迁移与归档

得益于PolarDB-X高度兼容MySQL数据库,其开源开发的能力也充分兼容了MySQL的生态工具,整个过程异常的顺利。我们先做了全量的迁移,再做了增量迁移。前后过程中我们充分做了数据校验,确保数据万无一失,最后做了数据切流。
image.png

我们迁移之前的表结构导入到PolarDB-X其实没有做太大的变化,PolarDB-X的透明分布式提供了表自动按主键拆分的能力,这样我们迁移到PolarDB-X数据库的表默认都是分表,极大满足了我们分布式的分表需求。 但迁移后我们的表并不是TTL表,也无法做冷数据归档,所以我们需要首先将表改造成TTL表,然后将该表做归档表的绑定。


TTL(Time to Live,生存周期)功能,支持在创建表的DDL语句中指定local_partition_definition语法,创建一个TTL表。TTL表会将每个物理表按照时间进行分区,并通过定时任务进行管理,能够让冷数据在PolarDB-X中按照一定的策略归档到OSS 但是遇到的第一个问题是TTL表主键必须包含时间列,那就得先做主键变更,再为将表做TTL的转化。好在PolarDB-X的主键变更是Online的过程,整个过程其实对业务是无感的,只需要做两个DDL操作。

alter table t_orders drop primary key, add primary key(id,gmt_modified);
2. ALTER TABLE t_orders
      LOCAL PARTITION BY RANGE (gmt_modified)
      STARTWITH '2015-01-01'
      INTERVAL 1 MONTH
       EXPIRE AFTER 3

所以我们业务低峰期,做了下TTL表的转化,这部分还算顺利。但是此时的TTL表还不能定时归档,需要绑定到另外一张归档表。绑定过程很简单,如下图所示。

CREATE TABLE t_order_oss LIKE t_orders ENGINE = 'OSS' ARCHIVE_MODE = 'TTL';

将TTL表 t_orders 绑定到另外一张表t_order_oss,两者的表结构一致,这样定时将过期的冷数据从t_order迁移到 t_order_oss。只不过t_order_oss是更低成本的存储介质oss。
image.png

一张表变成了两者不同的表,对我们来说业务有改造成本的。但冷数据和热数据的适用场景和存储介质是不一样的,两者数据访问延迟也是有一定的差异。热数据经常需要高频访问,冷数据对我们来说很少查,也很少做变更。如果两者是一张表,会增加业务异常访问冷数据的风险,影响到了热数据的SLA。区分之后,对热表DDL操作由于数据有限,变更操作会非常友好。出于这样的考虑,我们接受这样的改造,实际证明改造成本也比较低,受益也明显。经过这一波的迁移后,我们热数据通常是指最近3个月的数据,意味着我们需要把过去几年的数据归档到oss上,整个数据量大概是20T。我们配置归档的窗口都是我们的业务低峰期(02:00~-5:00),由于数据量比较多,整个归档持续了1个多月。归档后上线半年,业务感受非常深,由于访问的数据更少了,业务访问性能也提升了。
image.png

可以看到归档前访问的数据量随着时间不断在增加,那么大的数据量添加一个索引都非常困难。而归档后,业务访问的数据量始终维持在1T左右,不再随时间而变化。其实降低的不仅仅是存储成本,之前数据都在数据库,对存储空间和资源要求比较高,我们需要配置比较大的MySQL集群,现在数据大部分迁移到了冷数据上,数据库本身存储的数据其实不多,所以现在数据库资源使用较之前也减少了很多。

冷表的结构变更

PolarDB-X数据库系统上线后,不管是性能和成本都达到了我们的预期。但是后来我们业务需要对表结构做变更,提示不允许做表结构的变更。由于PolarDB-X冷数据存储介质是对象存储,并且存储格式是ORC。这两者都不能直接对原生数据文件做变更,每次变更都要求对数据进行重写,对于庞大的冷数据数据量,这种方案是无法接受了。好在PolarDB-X第一时间采用了多版本的方案,改写SQL的方式做了支持。这个冷表的DDL过程,不涉及到数据重写过程,每次DDL变更,只是在元数据构建了一个新的版本,元数据层面做好历史数据和元数据版本的映射关系。在查询扫描过程中,做好transform read。这里我们以列类型变更为例:
image.png

对t_order_oss的c3列类型做了变更,从int 类型变成了decimal类型。在修改列类型后,整个过程非常快,不涉及到数据文件的重写。只是在元数据会记录之前的version1和更改后的version2.当用户发起查询的时候,优化器识别数据文件的元数据版本和最终的数据版本。如果查询的数据文件版本和最终的数据版本一致,则数据文件读取的数据不需要做任何project。如果查询的数据文件版本和最终版本有差异,那么数据文件读取的数据需要做project。如上图所示,将一条SQL拆分成了两条执行计划,两条执行计划结果做union all,就是我们的查询结果。这样对DDL本身没有任何代价,只是对查询有代价,考虑到冷数据本身主要查询频率低,对RT延迟要求也低,所以我们觉得这个设计是合理的。基于这套online schema change方案,PolarDB-X数据库对冷表支持了完备的DDL。

冷表的查询加速

熟悉OSS的朋友都知道,OSS有带宽限制,对于大量的数据扫描并不友好;而且PolarDB-X采用的是列存存储格式(ORC),这种列存格式其实不太适用于TP数据库。虽然我们将冷数据归档到了OSS,但是这块票务系统在对账期间,难免会对冷数据进行大规模扫描或点查。我们开始其实比较担心冷数据归档的查询性能的,但实际效果还是不错的。
image.png

PolarDB-X在查询链路上引入了Local Cache的IO加速技术,并且基于元数据和统计信息构建了多级裁剪技术。

1、表分区级别:通过分区规则裁剪到目标分区
2、RuntimeFilter级别:通过构建MinMaxFilter并下推用于文件裁剪
3、文件级别:通过MinMax统计信息定位到唯一文件
4、Stripe级别:通过MinMax统计信息及BloomFilter定位到唯一Striple
5、RowIndex级别:通过MinMax统计信息及BloomFilter定位到唯一RowGroup
6、列级别:通过列裁剪定位到制定的列做扫描
可以很好的满足我们在冷数据的点查需求,在一些重吞吐的复杂查询中PolarDB-X也引入了Native MPP技术和向量化技术,大大提高了复杂查询的查询效率。

数据库系统迁移的总结

到目前为止,这次数据库系统迁移到PolarDB-X数据库还是很成功的,取得以下四种主要的收益:

1、PolarDB-X提供的透明分布式能力,大大降低我们的使用成本,业务上可以像使用单机MySQL数据库一样使用PolarDB-X。当空间不够的时候,其提供的在线扩容能力,也确保我们后面可以从容面对业务的高速发展;
2、PolarDB-X提供的全局Binlog能力,可以确保我们的业务数据更加方便同步到下游的数仓系统,降低了我们ETL链路的维护成本;
3、存储成本最高降至原来的5%,我们将大部分数据归档到了OSS上,极大的降低的我们的存储成本。由于业务数据量访问减少,数据库本身的规格也减少了,数据库部署成本也降低。PolarDB-X对冷表提供的Online Schema Change和查询加速的技术,也满足了我们业务需求。
4、PolarDB-X支持对冷数据对备份恢复,对,你没听错。PolarDB-X也支持对带有冷数据的实例做数据库备份,这种InnoDB+OSS一体化备份能力,是其他产品不具备的。这个也是我们后期在生产中比较看重的点。
但是该吐槽还得吐槽。目前冷数据归档的表要求主键必须包含时间列,也分区必须按照时间分区,过期粒度是分区级别。这些都限制了用户的使用。不过PolarDB-X数据库马上就要发布新的冷数据归档的解决方案,新的方案听说去除了主键必须包含时间列的限制,且支持行级的归档需求,那我们拭目以待吧!


云原生数据库PolarDB分布式(PolarDB-X)大降价,价格下调40%,最低至0.75元/小时。
阿里巴巴双十一同款数据库,原生MySQL生态,基于Paxos三副本确保RPO=0,支持集中式和分布式一体化。
点击下方链接,立即购买

购买PolarDB

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
26天前
|
存储 SQL 安全
应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
中盾集团采用PolarDB-X云原生分布式数据库开源版本,有效解决了大数据量处理、复杂查询以及历史数据维护等难题,实现了业务的高效扩展与优化。
|
1月前
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
52 0
|
2天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
8天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云数据库重磅升级!元数据服务OneMeta + OneOps统一管理多模态数据
|
30天前
|
数据采集 分布式计算 并行计算
Dask与Pandas:无缝迁移至分布式数据框架
【8月更文第29天】Pandas 是 Python 社区中最受欢迎的数据分析库之一,它提供了高效且易于使用的数据结构,如 DataFrame 和 Series,以及大量的数据分析功能。然而,随着数据集规模的增大,单机上的 Pandas 开始显现出性能瓶颈。这时,Dask 就成为了一个很好的解决方案,它能够利用多核 CPU 和多台机器进行分布式计算,从而有效地处理大规模数据集。
61 1
|
1月前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
57 5
|
28天前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
44 0
|
28天前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
96 0
|
28天前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
46 0
|
28天前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
44 0