[版本更新] PolarDB-X on OSS 提供冷热数据分离存储

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 4月底,PolarDB-X正式发布2.1.1 版本,重点推出冷热数据新特性,可以支持业务表的数据按照数据特性分别存储在不同的存储介质上,比如将冷数据存储到Aliyun OSS对象存储上。

架构简介

PolarDB-X 采用 Shared-nothing 与存储分离计算架构进行设计,系统由4个核心组件组成。


1.jpeg


  • 计算节点(CN, Compute Node)

计算节点是系统的入口,采用无状态设计,包括 SQL 解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度,负责分布式事务 2PC 协调、全局二级索引维护等,同时提供 SQL 限流、三权分立等企业级特性。

  • 存储节点(DN, Data Node)

存储节点负责数据的持久化,基于多数派 Paxos 协议提供数据高可靠、强一致保障,同时通过 MVCC 维护分布式事务可见性。

  • 元数据服务(GMS, Global Meta Service)

元数据服务负责维护全局强一致的 Table/Schema, Statistics 等系统 Meta 信息,维护账号、权限等安全信息,同时提供全局授时服务(即 TSO)。

  • 日志节点(CDC, Change Data Capture)

日志节点提供完全兼容 MySQL Binlog 格式和协议的增量订阅能力,提供兼容 MySQL Replication 协议的主从复制能力。 开源地址:[https://github.com/ApsaraDB/galaxysql]

版本说明

3月底,PolarDB-X 正式发布 2.1.0 版本,包含了四大核心特性,全面提升 PolarDB-X 稳定性和生态兼容性,其中包含基于Paxos的三副本共识协议。

4月底,PolarDB-X正式发布2.1.1 版本,重点推出冷热数据新特性,可以支持业务表的数据按照数据特性分别存储在不同的存储介质上,比如将冷数据存储到Aliyun OSS对象存储上。

冷热数据分离存储业务价值:在数据库使用过程中,每天有大量的数据写入和更新。然而,通常只有时间邻近的,如一个月内,甚至一周内的数据才会被频繁更新和访问。而剩下的大量数据,都默默躺在磁盘的角落中,给存储空间带来了极大的浪费,也增加了数据库维护的成本。我们将前者中提到的频繁访问数据称为热数据,后者则称为冷数据。冷数据虽然不被频繁访问,却是十分具有价值的。它记录着用户的历史数据,例如电商的历史订单、银行系统的历史交易记录等。这些访问需求对个人用户来说是低频的,但放到整个电商用户群体,或是银行用户群体中,则是一份不小的workload。冷数据的分析处理能给用户带来很多商业上的 insight,帮助用户做出决策。


2.png


更多技术细节查看:[https://zhuanlan.zhihu.com/p/477664175]

使用例子

快速配置OSS存储

安装完成后连接PolarDB-X集群,通过如下SQL命令进行OSS存储初始化: 例子:

create filestorage oss with ('file_uri' = 'oss://oss-bucket-name/', 'endpoint'='oss-endpoint', 'access_key_id'='your_ak', 'access_key_secret'='your_sk');
  • file_uri: OSS存储uri
  • endpoint: OSS存储 end-point
  • access_key_id: Access Key
  • access_key_secret: Secret Key

注1:(关于endpoint参数):在阿里云OSS产品界面,通过“对象存储-Bucket列表-bucket-概览”可以获取到一组endpoint(地域节点)信息。仅当在相同Region的ECS部署环境下,使用经典网络访问或vpc网络访问endpoint。否则使用外网访问endpoint。

注2:通过执行show file storage语句来验证是否配置成功。

本地磁盘存储配置

对于没有OSS但希望体验用户,可以通过磁盘模式模拟OSS,比如将挂载一个NFS协议的网盘 注意:file_uri为CN节点能访问的数据目录路径,如果你无法保证多个CN能够共同访问这一数据目录路径,请限制CN节点个数为1个。

通过如下命令进行本地磁盘存储初始化: 例子:

create filestorage local_disk with ('file_uri' = 'file:///tmp/orc/');

建表时存储引擎改为

engine = 'local_disk'

即可使用本地磁盘存储,例如:

create table sbtest1 like sysbench.sbtest1 engine = 'local_disk' archive_mode = 'loading';

开始体验

注:例子中的存储引擎都会以

engine = 'oss'

展示,如果你使用的是本地存储请修改为

engine = 'local_disk'

Hello World

create database innodb_engine partition_mode = 'auto';
use innodb_engine;
CREATE TABLE `t1` (
    `id` int(10) UNSIGNED NOT NULL,
    `k` int(10) UNSIGNED NOT NULL DEFAULT '0',
    `c` char(120) NOT NULL DEFAULT '',
    `pad` char(60) NOT NULL DEFAULT '',
    KEY `xid` (`id`),
    KEY `k_1` (`k`)
) ENGINE = 'INNODB'
PARTITION BY KEY(`id`) PARTITIONS 4;
insert into t1 values (1, 1, '1', '1'),(2, 2, '2', '2'),(3, 3, '3', '3'),(4, 4, '4', '4');
create database oss_engine partition_mode = 'auto';
use oss_engine;
-- 创建一张表结构与t1一样的OSS表oss_t1,并将数据导入到oss_t1
create table oss_t1 like innodb_engine.t1 engine = 'oss' archive_mode = 'loading';
select * from oss_t1;

TTL分区

Innodb数据自动过期并归档到OSS存储上示例 注:例子中的存储引擎都会以

engine = 'oss'

展示,如果你使用的是本地存储请修改为

engine = 'local_disk'


create database ttl_test partition_mode = 'auto';
use ttl_test;
-- 创建TTL表t_order,根据gmt_modified字段过期3个月以前数据
CREATE TABLE t_order (
    id bigint NOT NULL AUTO_INCREMENT,
    gmt_modified DATETIME NOT NULL,
    PRIMARY KEY (id, gmt_modified)
)
PARTITION BY HASH(id)
PARTITIONS 4
LOCAL PARTITION BY RANGE (gmt_modified)
STARTWITH '2021-01-01'
INTERVAL 1 MONTH
EXPIRE AFTER 3
PRE ALLOCATE 3
PIVOTDATE NOW();
-- 准备数据
insert into t_order (gmt_modified) values ('2021-01-01'),('2021-02-01'),('2021-03-01'),('2021-04-01'),('2021-05-01'),('2021-06-01'),('2021-07-01'),('2021-08-01'),('2021-09-01'),('2021-10-01'),('2021-11-01'),('2021-12-01'),('2022-01-01'),('2022-02-01'),('2022-03-01'),('2022-04-01'),('2022-05-01'),('2022-06-01'),('2022-07-01'),('2022-08-01'),('2022-09-01'),('2022-10-01'),('2022-11-01'),('2022-12-01');
-- 建立一张OSS表oss_order并与t_order绑定数据归档关系
create table oss_order like t_order engine = 'oss' archive_mode = 'ttl';
-- 正常流程为后台任务自动过期数据,为了演示方便这里模拟触发数据过期
alter table t_order expire local partition;
-- 查看数据
select * from t_order;
select * from oss_order;

Sysbench

数据准备

下载Sysbench压测工具包 sysbench.tar.gz

解压:
tar xzvf sysbench.tar.gz
cd sysbench/
安装编译所需依赖库:
yum -y install make automake libtool pkgconfig libaio-devel mysql-devel
./autogen.sh
./configure
make -j
make install
执行命令sysbench --version,返回sysbench 1.1.0证明压测工具包安装成功。

准备压测配置

创建配置文件sysb.conf,将PolarDB-X连接信息填入配置文件,其中配置文件以及主要参数的解读如下:

mysql-host='{HOST}'
mysql-port='{PORT}'
mysql-user='{USER}'
mysql-password='{PASSWORD}'
mysql-db='sysbench'
db-driver='mysql'
percentile='95'
histogram='on'
report-interval='1'
time='60'
rand-type='uniform'

参数说明:

  • percentile:响应时间采样的百分位;
  • histogram:是否展示响应时间分布直方图;
  • report-interval:显示实时结果的时间间隔,单位为秒;
  • time:压测时长,单位为秒;
  • rand-type:随机数的分布模式。

创建数据库sysbench

create database sysbench partition_mode = 'auto';

导入压测数据

sysbench --config-file='sysb.conf' --create-table-options='PARTITION BY KEY(`id`) PARTITIONS 4'  --tables='1' --threads='4' --table-size='100000' oltp_point_select prepare

将导入数据转换到OSS存储引擎

create database oss_sysbench partition_mode = 'auto';
use oss_sysbench;
create table sbtest1 like sysbench.sbtest1 engine = 'oss' archive_mode = 'loading';

调整压测库为oss_sysbench

修改sysb.conf中mysql-db='oss_sysbench'

执行压测

sysbench --config-file='sysb.conf' --db-ps-mode='disable' --skip-trx='on' --mysql-ignore-errors='all'  --tables='1' --table-size='100000' --threads=4 oltp_point_select run

TPC-H

建立数据库及表结构

create database tpch partition_mode = 'auto';
use tpch;
CREATE TABLE `customer` (
  `c_custkey` int(11) NOT NULL,
  `c_name` varchar(25) NOT NULL,
  `c_address` varchar(40) NOT NULL,
  `c_nationkey` int(11) NOT NULL,
  `c_phone` varchar(15) NOT NULL,
  `c_acctbal` decimal(15,2) NOT NULL,
  `c_mktsegment` varchar(10) NOT NULL,
  `c_comment` varchar(117) NOT NULL,
  PRIMARY KEY (`c_custkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH(c_custkey) PARTITIONS 4;
CREATE TABLE `lineitem` (
  `l_orderkey` int(11) NOT NULL,
  `l_partkey` int(11) NOT NULL,
  `l_suppkey` int(11) NOT NULL,
  `l_linenumber` int(11) NOT NULL,
  `l_quantity` decimal(15,2) NOT NULL,
  `l_extendedprice` decimal(15,2) NOT NULL,
  `l_discount` decimal(15,2) NOT NULL,
  `l_tax` decimal(15,2) NOT NULL,
  `l_returnflag` varchar(1) NOT NULL,
  `l_linestatus` varchar(1) NOT NULL,
  `l_shipdate` date NOT NULL,
  `l_commitdate` date NOT NULL,
  `l_receiptdate` date NOT NULL,
  `l_shipinstruct` varchar(25) NOT NULL,
  `l_shipmode` varchar(10) NOT NULL,
  `l_comment` varchar(44) NOT NULL,
  PRIMARY KEY (`l_shipdate`,`l_orderkey`,`l_linenumber`),
  KEY `i_l_partkey` (`l_partkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH(l_orderkey) PARTITIONS 4;
CREATE TABLE `nation` (
  `n_nationkey` int(11) NOT NULL,
  `n_name` varchar(25) NOT NULL,
  `n_regionkey` int(11) NOT NULL,
  `n_comment` varchar(152) DEFAULT NULL,
  PRIMARY KEY (`n_nationkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast;
CREATE TABLE `orders` (
  `o_orderkey` int(11) NOT NULL,
  `o_custkey` int(11) NOT NULL,
  `o_orderstatus` varchar(1) NOT NULL,
  `o_totalprice` decimal(15,2) NOT NULL,
  `o_orderdate` date NOT NULL,
  `o_orderpriority` varchar(15) NOT NULL,
  `o_clerk` varchar(15) NOT NULL,
  `o_shippriority` int(11) NOT NULL,
  `o_comment` varchar(79) NOT NULL,
  PRIMARY KEY (`o_orderdate`,`o_orderkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH(O_ORDERKEY) PARTITIONS 4;
CREATE TABLE `part` (
  `p_partkey` int(11) NOT NULL,
  `p_name` varchar(55) NOT NULL,
  `p_mfgr` varchar(25) NOT NULL,
  `p_brand` varchar(10) NOT NULL,
  `p_type` varchar(25) NOT NULL,
  `p_size` int(11) NOT NULL,
  `p_container` varchar(10) NOT NULL,
  `p_retailprice` decimal(15,2) NOT NULL,
  `p_comment` varchar(23) NOT NULL,
  PRIMARY KEY (`p_partkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH(p_partkey) PARTITIONS 4;
CREATE TABLE `partsupp` (
  `ps_partkey` int(11) NOT NULL,
  `ps_suppkey` int(11) NOT NULL,
  `ps_availqty` int(11) NOT NULL,
  `ps_supplycost` decimal(15,2) NOT NULL,
  `ps_comment` varchar(199) NOT NULL,
  PRIMARY KEY (`ps_partkey`,`ps_suppkey`),
  KEY `IDX_PARTSUPP_SUPPKEY` (`PS_SUPPKEY`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH(ps_partkey) PARTITIONS 4;
CREATE TABLE `region` (
  `r_regionkey` int(11) NOT NULL,
  `r_name` varchar(25) NOT NULL,
  `r_comment` varchar(152) DEFAULT NULL,
  PRIMARY KEY (`r_regionkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast;
CREATE TABLE `supplier` (
  `s_suppkey` int(11) NOT NULL,
  `s_name` varchar(25) NOT NULL,
  `s_address` varchar(40) NOT NULL,
  `s_nationkey` int(11) NOT NULL,
  `s_phone` varchar(15) NOT NULL,
  `s_acctbal` decimal(15,2) NOT NULL,
  `s_comment` varchar(101) NOT NULL,
  PRIMARY KEY (`s_suppkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH(s_suppkey) PARTITIONS 4;

数据准备

下载TPC-H脚本工具包tpchData.tar.gz 解压

tar xzvf tpchData.tar.gz

修改param.conf配置文件,填入PolarDB-X实例的连接信息:

cd tpchData/
vim param.conf
#!/bin/bash
### remote generating directory
export remoteGenDir=./
### target path
export targetPath=../tpch/tpchRaw
### cores per worker, default value is 1
export coresPerWorker=`cat /proc/cpuinfo| grep "processor"| wc -l`
### threads per worker, default value is 1
export threadsPerWorker=`cat /proc/cpuinfo| grep "processor"| wc -l`
#export threadsPerWorker=1
export hint=""
export insertMysql="mysql -h{HOST} -P{PORT} -u{USER} -p{PASSWORD} -Ac --local-infile {DB} -e"

具体填入的值包括: {HOST}:主机名 {PORT}:端口号 {USER}:用户名 {PASSWORD}:密码 {DB}: 数据库名 如果希望更高效地生成数据,可调大脚本中threadsPerWorker的值。

执行脚本,生成1 GB的数据:

cp workloads/tpch.workload.100.lst workloads/tpch.workload.1.lst
cd datagen
sh generateTPCH.sh 1

可以在tpch/tpchRaw/SF1/目录下查看到生成的数据

ls ../tpch/tpchRaw/SF1/
customer  lineitem  nation  orders  part  partsupp  region  supplier

导入数据到PolarDB-X实例

cd ../loadTpch
sh loadTpch.sh 1

校验数据完整性

select (select count(*) from customer) as customer_cnt,
 (select count(*)  from lineitem) as lineitem_cnt,
 (select count(*)  from nation) as nation_cnt,
 (select count(*)  from orders) as order_cnt,
 (select count(*) from part) as part_cnt,
 (select count(*) from partsupp) as partsupp_cnt,
 (select count(*) from region) as region_cnt,
 (select count(*) from supplier) as supplier_cnt;
+--------------+--------------+------------+-----------+----------+--------------+------------+--------------+
| customer_cnt | lineitem_cnt | nation_cnt | order_cnt | part_cnt | partsupp_cnt | region_cnt | supplier_cnt |
+--------------+--------------+------------+-----------+----------+--------------+------------+--------------+
| 150000       | 6001215      | 25         | 1500000   | 200000   | 800000       | 5          | 10000        |
+--------------+--------------+------------+-----------+----------+--------------+------------+--------------+

将导入数据转换到OSS存储引擎

create database oss_tpch partition_mode = 'auto';
use oss_tpch;
create table customer like tpch.customer engine='oss' archive_mode='loading';
create table nation like tpch.nation engine='oss' archive_mode='loading';
create table region like tpch.region engine='oss' archive_mode='loading';
create table partsupp like tpch.partsupp engine='oss' archive_mode='loading';
create table part like tpch.part engine='oss' archive_mode='loading';
create table supplier like tpch.supplier engine='oss' archive_mode='loading';
create table orders like tpch.orders engine='oss' archive_mode='loading';
create table lineitem like tpch.lineitem engine='oss' archive_mode='loading';

采集统计信息

analyze table customer;
analyze table lineitem;
analyze table nation;
analyze table orders;
analyze table part;
analyze table partsupp;
analyze table region;
analyze table supplier;

测试TPC-H 22条Query

下载测试脚本tpch-queries.tar.gz 并解压:

tar xzvf tpch-queries.tar.gz

运行脚本,执行查询并计时

cd tpch-queries
'time' -f "%e" sh all_query.sh {HOST} {USER} {PASSWORD} {DB} {PORT}

结尾

PolarDB-X 冷热分离存储充分利用了OSS服务成本低、容量大的优良特性,将冷数据快速高效地从在线库中剥离出来,减轻了在线数据维护压力、以及在线库的规模成本,降低了全量数据的存储成本。同时,提供与MySQL兼容的访问方式,兼顾点查(sysbench)与分析型查询(tpc-h)的性能,并支持大数据产品的接入。

参考链接

  1. PolarDB-X On OSS QuickStart
  2. PolarDB-X on OSS: 冷热数据分离存储
相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
4月前
|
存储 SQL Cloud Native
揭秘!PolarDB-X存储引擎如何玩转“时间魔术”?Lizard多级闪回技术让你秒回数据“黄金时代”!
【8月更文挑战第25天】PolarDB-X是一款由阿里巴巴自主研发的云原生分布式数据库,以其高性能、高可用性和出色的可扩展性著称。其核心竞争力之一是Lizard存储引擎的多级闪回技术,能够提供高效的数据恢复与问题诊断能力。本文通过一个电商公司的案例展示了一级与二级闪回技术如何帮助快速恢复误删的大量订单数据,确保业务连续性不受影响。一级闪回通过维护最近时间段内历史数据版本链,支持任意时间点查询;而二级闪回则通过扩展数据保留时间并采用成本更低的存储方式,进一步增强了数据保护能力。多级闪回技术的应用显著提高了数据库的可靠性和灵活性,为企业数据安全保驾护航。
47 1
|
4月前
|
存储 SQL 运维
“震撼发布!PolarDB-X:云原生分布式数据库巨擘,超高并发、海量存储、复杂查询,一网打尽!错过等哭!”
【8月更文挑战第7天】PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
112 1
|
4月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
305 0
|
7月前
|
SQL 容灾 关系型数据库
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布!
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
|
5月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之如何将冷存到OSS(Object Storage Service)的数据恢复
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之从MySQL迁移数据到PolarDB-X时,自定义函数不会自动迁移,该怎么办
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
115 1
|
6月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之oss该如何配置
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7月前
|
存储 Cloud Native 关系型数据库
PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
【5月更文挑战第14天】PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
314 2
|
7月前
|
存储 关系型数据库 MySQL
PolarDB-X on OSS: 冷热数据分离存储
在即将发布的PolarDB-X 5.4.14版本中,我们将基于OSS存储服务,推出冷热数据分离存储这一新功能。在这一功能的基础上,您可以便捷地将冷数据从源表中剥离出来,归档至更低成本的OSS中,形成一张归档表;归档表支持高效的主键与索引点查、复杂分析型查询,满足高可用、MySQL兼容性和任意时间点闪回等特性。您可以像访问MySQL表一样来访问归档表,也可以用开源大数据产品接入OSS的归档数据。
189 0
PolarDB-X on OSS: 冷热数据分离存储
|
7月前
|
安全 druid Java
Seata 1.8.0 正式发布,支持达梦和 PolarDB-X 数据库
Seata 1.8.0 正式发布,支持达梦和 PolarDB-X 数据库
603 10
Seata 1.8.0 正式发布,支持达梦和 PolarDB-X 数据库

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB