阿里云DRDS 的sequence序列深入理解

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: DRDS的隐式sequence的一些测试,以及在DRDS迁移的过程中踩到的坑--

1 Sequence简介

DRDS sequence全称:全局唯一数字序列,顾名思义,其作用是生成全局唯一和有序递增的数字序列。常用于主键列、唯一索引列等值的生成。
Sequence分类,总共分为两大类:
显式sequence:通过sequence语法进行创建与维护,可以单独使用。
隐式sequence:DRDS表主键定义 AUTO_INCREMENT后,用于自动填充主键,由 DRDS 自动维护
每类sequence针对不同的使用场景还分为四种类型,分别为Group Sequence,Group Sequence(单元化),Time-based Sequence,Simple Sequence。
详情参考阿里云官网
本文重点介绍group隐式sequence。为什么?
1、sequence原理性的东西,在官网上基本没有体现,我们只知其然而不知其所以然
2、当然是因为做DRDS数据迁移踩的关于隐式sequence的坑太多了,经常跟阿里研发取经,加上环境测试了解到一些东西。

2 sequence的原理理解

1、sequence值是如何分配的?

image

如图所示:DRDS在分配sequence的时候,会根据自身的节点数来划分多个sequence段,默认每个段的长度为10万。注意这里是根据DRDS的规格节点数来划分的sequence端,而不是根据RDS的数量,与RDS无关。
通过show sequences;命令,可以查看当前sequence的value。
image
这里的value值通常是表示已经分配的最大sequence段的起始值,即200000

2、sequence的起始值

有没有发现上图中,sequence段的起始值我是从100001开始取值的。默认情况下,sequence的起始值并不是按照1来开始递增的,而是按照100001开始的。这就涉及到内部的一些算法:
(value - value % (innerStep unit_count)) + innerStep unit_count + nodeIndex * innerStep
实验证明如下:
新建一张表,并且插入一条测试数据:
image
image
可以看到主键的id是从100001开始取值的。

3、sequence的缓存

这里在节点上分配的sequence段,我们可以称之为sequence的缓存,正常情况下,节点上的缓存用完才会重新分配sequence段。
image
缓存实验测试如下:
image
image
image
truncate表清理了数据之后,重新插入数据还是会用到之前的缓存,从100002开始。
由于这种缓存的存在,尤其是DRDS在数据迁移的某些场景时,会产生很大的影响。

某客户案例:
DRDS进行平台的数据迁移,由于没有直接迁移DRDS to DRDS的工具,经过多次测试与衡量决定采用底层RDS to RDS方式的数据迁移。在第二次进行应用测试大批量报错主键冲突。原因就是第一次测试完,truncate清理数据后,缓存还是存在的。第二次导入数据后则还是会用缓存的值,这时候测试插入数据就会出现主键冲突。
这里出现sequence冲突的根本原因是,sequence本来是DRDS层面维护的,但是采用非标的方式迁移底层的RDS数据,虽然数据没有问题,但sequence就没有人来维护了。这样就很容易出现很多问题。所以不到迫不得已尽量不要走非标方案。
解决方法:清理sequence缓存。
常用的清理缓存的方法:
1、alter sequence start with AUTO__XXXX;使用命令抬高sequence,命令是表级别的。
2、重启drds,目的是重启节点。
3、表删除重新建表

4、缓存的值是如何计算出来

我们已经知道,初始化的时候,sequence的值会按照算法定义起始值。那alter sequence start with AUTO__XXXX命令是如何更新sequence的value 以及 缓存的呢?
同理,alter sequence调整后,也会重新初始化sequence,先用算法更新起始值
(value - value % (innerStep unit_count)) + innerStep unit_count + unit_index * innerStep
然后再用下面的公式计算缓存区间:所有节点先后用公式计算
value + (inner_step * unit_count)

简单的说:一般而言,执行命令alter后,首先会根据算法,将调整的sequence“合法化”,就是取整数,然后加一段区间更新到缓存,所以缓存会更新到一个更大的值。所以你会发现,在执行alter命令后,之后的主键值并不是按照修改的值递增的,主键值肯定比调整的value要大。
测试验证如下:
image
上图可以看到,show sequence显示的值为200000,与缓存中已分配的sequence段的最大值匹配。
image
上图中,随意调大了sequence的value,show sequence显示为了432432,(这个只是暂时显示,后面还是会更新为最大sequence段的起始值)
image
上图中,又插入了一条数据,发现show sequence的值已经改了。用命令查询一下缓存,果然缓存已经更新了,并且是比alter设置的value值要大。
这里还会发现,图中第一次show sequence时,不是代表最大的sequence段的起始值。这是因为sequence值用到的时候才会更新这个value。
那为什么执行查看缓存的命令inspect后就恢复了呢?
猜测这个命令会强制刷新value与缓存保持一致。

那么此时再插入数据主键会是从432432开始吗?
image

当然不是了,如果你还觉得是,那就是之前我啰嗦的不够透彻。
这里就是按照缓存中的值来取sequence了。

3、END

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
目录
相关文章
|
4月前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
6月前
|
Cloud Native Java 关系型数据库
阿里云 PolarDB-X 团队25届实习生招聘
阿里云 PolarDB-X 团队25届实习生招聘
|
关系型数据库 分布式数据库 数据库
阿里云产品体系分为6大分类——云计算基础——数据库——关系型数据库——分布式关系型数据库服务 DRDS
阿里云产品体系分为6大分类——云计算基础——数据库——关系型数据库——分布式关系型数据库服务 DRDS自制脑图
170 1
阿里云产品体系分为6大分类——云计算基础——数据库——关系型数据库——分布式关系型数据库服务 DRDS
|
关系型数据库 中间件 分布式数据库
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS自制脑图, Distribute Relational Database Service(DRDS)是分布式关系型数据库,它主要是一种水平拆分、可平滑扩容、读写分离的在线分布式数据库服务。
395 9
阿里云互联网中间件五剑客之——分布式关系型数据库服务DRDS
《阿里云产品手册2022-2023 版》——PolarDB-X
《阿里云产品手册2022-2023 版》——PolarDB-X
|
存储 Cloud Native 关系型数据库
OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓
作为全球数据库领导者,阿里云数据库坚定拥抱开源。此次亮相大会,旗下核心开源项目云原生分布式数据库PolarDB-X通过了信通院的 “可信开源项目评估,并以正式成员身份,加入中国信通院牵头组建的可信开源社区共同体。至此,阿里云数据库两大开源项目PolarDB for PostgreSQL(简称PolarDB-PG)和PolarDB-X均已通过评估,并成为可信开源社区共同体银河计划成员。
OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓
|
SQL 机器学习/深度学习 运维
【笔记】用户指南—备份与恢复—将PolarDB-X与其他阿里云服务集成
阿里云提供众多与数据相关的产品和服务,PolarDB-X作为一款云原生分布式数据库产品,同时也是阿里云生态的重要组成部分。PolarDB-X通过打通与其他云产品的连接,提供了更加原生的生态互通能力,为更多的业务场景提供了便利。
122 0
|
SQL 机器学习/深度学习 运维
【笔记】用户指南—备份与恢复—将PolarDB-X与其他阿里云服务集成
阿里云提供众多与数据相关的产品和服务,PolarDB-X作为一款云原生分布式数据库产品,同时也是阿里云生态的重要组成部分。PolarDB-X通过打通与其他云产品的连接,提供了更加原生的生态互通能力,为更多的业务场景提供了便利。
116 0
|
SQL 机器学习/深度学习 运维
用户指南—备份与恢复—将PolarDB-X与其他阿里云服务集成
阿里云提供众多与数据相关的产品和服务,PolarDB-X作为一款云原生分布式数据库产品,同时也是阿里云生态的重要组成部分。PolarDB-X通过打通与其他云产品的连接,提供了更加原生的生态互通能力,为更多的业务场景提供了便利。
132 0
下一篇
无影云桌面