开发者社区> 化雨u> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【35】Sequence序列网络介绍与使用(含RNN,RNNCell,LSTM,LSTMCell的调用)
【35】Sequence序列网络介绍与使用(含RNN,RNNCell,LSTM,LSTMCell的调用)
10 0
阿里云ECS服务器配置Web项目和FTP Server
第一次使用阿里云ECS服务器部署Web项目和FTP Server,在使用过程中遇到了很多困难,但同时对计算机网络的工作原理有了更加清晰的认识。现将使用经历进行系统性地总结。 在阅读之前请确保已购买阿里云ECS云服务器并且初始化云服务器操作系统,本教程选用的操作系统为“Windows Server 2022 数据中心版 64位中文版”。
55 0
王小呆的阿里云ECS使用心得
飞天计划为高校学子提供了免费使用ECS的机会,乘着此次机会我跟着教程申请了免费的ECS使用。 本文就是为了记录我在第一次使用ECS的时候,遇到的种种问题以及发现的各种好玩的功能。
36 0
阿里云ESC的windows Server 2012 R2使用体验
1.自我情况 2.使用过程 3.心得体会
205 0
什么是Serverless?阿里云腾讯云都在发力「无服务器架构」
要说目前软件架构中热度十二分的话题,当属Serverless。 通常我们会将其翻译为“无服务器架构”。 尽管成天被称为“无服务器”,但该架构与传统架构不同,显然并不是真的不需要服务器。 而是选择将服务器等基础设施的管理“隐藏”起来,计算资源作为服务而不是作为服务器的概念出现。
2126 0
阿里云运维编排新功能:一键批量克隆ECS
借助OOS运维编排的能力,您可以在控制台进行一键批量克隆ECS,也可以跨可用区和跨区域克隆。通过openapi或者sdk,您可以跟自己的运维系统轻松地集成。
5120 0
Oracle中序列(Sequence)详解
Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。
961 0
+关注
化雨u
智者乐水,仁者乐山
文章
问答
文章排行榜
最热
最新
相关电子书
更多
分布式数据库DRDS全新升级
立即下载
阿里云总监课第五期第六节:研发挑战 - 研发过程中挑战
立即下载
阿里云创新赋能平台万创科技城站
立即下载