热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PolarDBXonOSS:冷热数据分离存储

在即将发布的PolarDB-X 5.4.14版本中,我们将基于OSS存储服务,推出冷热数据分离存储这一新功能。在这一功能的基础上,您可以便捷地将冷数据从源表中剥

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

为什么需要冷热分离?

在数据库使用过程中,每天有大量的数据写入和更新。然而,通常只有时间邻近的,如一个月内,甚至一周内的数据才会被频繁更新和访问。而剩下的大量数据,都默默躺在磁盘的角落中,给存储空间带来了极大的浪费,也增加了数据库维护的成本。我们将前者中提到的频繁访问数据称为热数据,后者则称为冷数据
通过对多位大型政企客户的走访和交流,我们感受到了开发者们对于冷热分离存储的迫切需求。何谓冷热分离?从字面意义上来理解,就是将热数据保留在高性能的存储设备中,用于应对日常频繁的写入与更新,满足用户对事务型数据处理的需要;冷数据则被迁移到低成本的存储设备里(这一过程也被称为“归档”),减轻热数据的维护压力,提供查询和局部订正的功能。
虽然不被频繁访问,冷数据却是十分具有价值的。它记录着用户的历史数据,例如电商的历史订单、银行系统的历史交易记录等。这些访问需求对个人用户来说是低频的,但放到整个电商用户群体,或是银行用户群体中,则是一份不小的workload。冷数据的分析处理能给用户带来很多商业上的 insight,帮助用户做出决策。因此还需要支持在线分析型数据处理的能力。跨越冷热数据的Join(连接)、Aggregation(聚合)是开发者们经常使用的分析手段。因此,在PolarDB-X的冷热分离存储设计中,我们兼顾了高性能的点查和分析型查询,来满足不同用户对冷数据的访问需求。

为何选择OSS?

阿里云对外提供两类云存储服务:块存储与对象存储。其中块存储如ESSD等,是数据库事实上采取的存储方式,配备了RDMA网络服务和高性能SSD盘来提升访问性能;而对象存储如OSS,则利用低廉的HDD盘和标准网络,对外提供低成本、海量空间的存储服务。
PolarDB-X数据库原本的存储方式采用了Paxos三副本高可用集群,格式为InnoDB行存。在冷热分离存储架构中,我们将冷数据迁移到阿里云OSS对象存储中,并采用开源列存格式ORC。阿里云的OSS 对象存储服务本身保障了 12个9 的高可用性,因此我们采用了单副本的存储方式,这与 paxos 的三副本有所不同。
结合OSS单位存储的低成本,和ORC格式本身的压缩比,我们可以得到下列一组对比数据,来形成直观的感受:

优势特性

TTL(time-to-live)

如何将冷数据从InnoDB行存中剥离出来?这是一个令很多开发者头疼的问题。如果使用delete from 语句 + where条件的形式来删除冷数据,很可能会因为扫描行数太多、数据太过分散,而造成锁表,影响整个数据库实例的访问;如果提前按照时间进行分区,再逐个将旧时间分区drop掉,则许多不适合按照时间分区的表将会束手无策。针对用户反馈的这一实际问题,PolarDB-X 引入了TTL(time-to-live)这一新特性来帮助用户完成冷热数据剥离。用户无需手动维护,而是通过提前指定起始时间、分区大小和过期时间等信息,来完成数据的自动过期。我们在更底部的存储层将每张物理表做进一步的透明分区,数据按照最近的更新时间被集中到一起。例如对于订单表t_orders,用户按照订单id进行哈希分区。引入了TTL之后,每个分区被进一步透明划分。旧时间分区(图中的2022-01分区)的过期,如同撕掉便利贴一样,在不锁表、不手动分区的情况下完成冷热数据的剥离。
关于TTL的具体使用,可以参考官网文档:什么是TTL功能 ?

高性能查询

当冷数据从主库中剥离出来,归档至OSS存储服务后,我们就得到了一张以OSS为存储载体的归档表。它完全兼容MySQL数据类型和各种查询方式,在低成本、高可用的前提下,能带来与主表一致的使用体验。为了满足不同用户对历史数据的查询需要,我们在设计上兼顾了点查和复杂分析型查询。对此我们进行了相应的测评。由于PolarDB-X on OSS 使用列存,在报表查询中有天然的优势,因此相比于PolarDB-X on MySQL 行存模式,TPC-H测试成绩有了大幅提升;1亿行数据量下的Sysbench点查测试也显示,归档表可以满足历史数据的查询要求。在实现以上功能的过程中,最为关键的设计是文件系统、多级缓存、多级索引与查询裁剪。此外还包括列存索引选择、向量化计算、AGG加速等,我们都将在后续的文章中详细介绍。

TPC-H性能测试

规格:
  • CPU:6 * 16C
  • 内存:6 * 128GB
  • SF = 100 (TPC-H 100GB)
总耗时约89s (PolarDB-X on MySQL 总耗时 150s)

Sysbench 性能测试

规格:
  • 压测ECS:1 * 8C32G
  • CN:6 * 16C128G
  • Sysbench表行数:1亿
  • 并发数:100
sysbench性能测试数据如下:

一键迁移

完成了冷热数据剥离后,如何将数据快速归档到OSS上呢?我们基于MySQL标准语法,提供了非常简易便捷的方式,只需要执行一条建表语句:

CREATE TABLE [oss_table_name] LIKE [innodb_table_name] ENGINE = 'OSS' ARCHIVE_MODE = 'TTL'
执行后,OSS表将克隆InnoDB表的表结构,免去用户对归档表结构的设计;同时,冷数据归档表和源表被绑定起来,源表过期的数据将自动导入到归档表中。此后,用户可以像访问普通表一样,通过SQL来完成包括点查、范围查询、复杂分析型查询在内的各种数据访问。

手动强制过期

如果您想要更灵活的过期和归档操作,下列语句可以让您手动过期数据,并将过期数据导入至OSS中:

ALTER TABLE [innodb_table_name] EXPIRE LOCAL PARTITION [local_partition_name]

更多特性

任意时间点备份与闪回

在阿里云官方售卖的PolarDB-X 企业版中,支持了冷数据多副本备份与异地容灾。此外,PolarDB-X 将OSS归档表的版本控制与TSO结合起来,支持将整张表恢复到任意时间点之前的状态,也支持通过指定时间点来完成快照读。您可以使用下列的闪回语句,让整张OSS归档表回到任意时间点之前的状态:

    ALTER TABLE [oss_table_name] AS OF timestamp 'yyyy-mm-dd hh:mm:ss'
    通过下列语句,指定时间点,完成在OSS归档表上的快照读:

      SELECT xxx FROM [oss_table_name] AS OF timestamp '2022-01-01 01:02:03'

      MySQL兼容性

      PolarDB-X使用开源格式ORC来作为数据存储格式。ORC起源于Hive生态,其数据类型相比于MySQL有许多受限制的地方,例如不支持高精度的Decimal、不支持Collation、时间表示范围不够大、不支持Time类型等问题。因此,在ORC格式的基础上,想要提供MySQL风格的查询体验,还需要填补这一鸿沟。为了给用户提供与MySQL一致的使用体验,我们精心设计了一套兼容MySQL的数据类型处理方案。包括time类型支持、基于collation的字符串查找、基于字节序的Decimal数值搜索等,构建起了从Hive生态到MySQL生态的桥梁。

      开放性

      我们将提供轻量级的ORC SDK。您可以通过ORC Connector 和catalog,将OSS上存储的ORC文件作为数据源,轻松地完成Spark、Flink、Presto等开源大数据产品的接入。在开源版本中,您还可以使用其他存储设备或服务来存放归档表,只需在执行create table时,指定Engine参数的值,如Engine = 'S3' / Engine = 'local_disk' 等,将归档表存放在S3存储服务或本地磁盘上。
      演示视频

      总结

      PolarDB-X 冷热分离存储充分利用了OSS服务成本低、容量大的优良特性,将冷数据快速高效地从在线库中剥离出来,减轻了数据维护压力,降低了数据存储成本。同时,提供与MySQL兼容的访问方式,兼顾点查与分析型查询的性能,并支持大数据产品的接入。未来我们将在冷热数据分离这一赛道上不断前进。

      点击“阅读原文”查看PolarDB-X更多信息


      推荐阅读
      • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
      • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
      • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
        在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
      • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
      • 第二章:Kafka基础入门与核心概念解析
        本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
      • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
      • 全面升级的中文PubMed——Medreading
        Medreading 是一款由科研者之家(HOME for Researchers)推出的中文版PubMed,提供强大的文献检索和分析功能,支持AI辅助全文下载。 ... [详细]
      • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
      • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
        本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
      • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
        本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
      • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
      • 如何查询计算机的显卡型号及性能参数? ... [详细]
      • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
      • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
      • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
        本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
      author-avatar
      Lovepetall
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有