CN116028505A - 一种在分布式数据库中实现高可用序列的方法 - Google Patents
一种在分布式数据库中实现高可用序列的方法 Download PDFInfo
- Publication number
- CN116028505A CN116028505A CN202310139533.7A CN202310139533A CN116028505A CN 116028505 A CN116028505 A CN 116028505A CN 202310139533 A CN202310139533 A CN 202310139533A CN 116028505 A CN116028505 A CN 116028505A
- Authority
- CN
- China
- Prior art keywords
- sequence
- value
- val
- character string
- length
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种在分布式数据库中实现高可用序列的方法,其特征在于,由分布式数据库中的多个计算节点直接提供序列值,并自动更新序列缓存;使用两个序列库同时提供序列服务,以保证了序列服务的高可用性;通过自的算法规则实现不同序列库之间的序列的唯一性,以保证序列值在整个分布式***中的唯一性。以达到应用程序开发人员不用再关注序列的获取,序列值的重复等非业务问题,从而可以将工作的重心放在自身业务上的效果;让分布式数据库更高效、可靠、安全的提供序列值。
Description
技术领域
本发明属于分布式数据库领域,具体涉及一种在分布式数据库中实现高可用序列的方法。
背景技术
随着计算机技术的快速发展和应用的业务领域不断增多,越来越多的数据被产生并被记录在数据库之中。随着时间的累计,数据库中单表的数据量越来越庞大,读写性能开始显著降低。同时传统关系型数据库单点单机部署模式没有解决高可用性的问题,已经不能满足业务应用对数据库高性能、高可用性、高并发的要求。所以,近些年越来越多的企业开始转型使用分布式数据库。分布式数据库为处理单表数据庞大,读写性能下降的问题,会将原本单机关系型数据库中的一张表以记录为维度拆分在多台单机关系型数据库之中。分布式数据库为提供更强大的读写性能,支持更高的并发量,通常会在一个分布式数据库中部署多个计算节点,以用于解析SQL、执行SQL、组装SQL执行结果。对于使用者,可通过分布式数据库客户端任意链接其中一个计算节点执行相关操作。在单机关系型数据库中,一张单表可以使用主键序列生成一个在单表内唯一的值来标识一条记录。在分布式数据库中,当单表被拆分到不同的单机关系型数据库中时,便面临着需要一种功能能够提供在多张单表中均保持唯一的序列值。
传统的唯一序列值方案都是在分布式数据库之外独立部署一套***。使用者需要首先链接该***获取到独立序列值,再组装SQL,再发送给分布式数据库,比如在redis中存储一个key不断自增,它们的优点是方案成熟可靠,确实可以提供唯一序列值。但是独立部署***,意味着需要额外的软硬件,额外的开发运维人员,同时对于使用者来说需要同时保持和两套***的链接,此举无疑加大了应用***的开发和运维人员的工作复杂度。
传统的唯一序列值实现方式为了保证更高的并发度,往往选择通过内存方式实现,比如雪花算法,通过使用计算机的时钟作为种子用特定的算法生成一个永不重复的值来作为序列值,它们的优点是实现简单、性能高,但同时可用性低,且无法有效解决机器时钟回拨问题,易出现序列值重复的问题。因而通常基于内存的方式多用于对唯一性要求不是那么苛刻的场合。
发明内容
本发明旨在解决现有技术的缺陷和问题,在分布式数据库中,序列值需要同时考虑到高可用性,高性能以及严苛的不可重复性,从而让分布式数据库更高效、可靠、安全的提供序列值;本发明由分布式数据库中的多个计算节点直接提供序列值,并自动更新序列缓存;使用两个序列库同时提供序列服务,以保证了序列服务的高可用性;通过自定义的算法规则实现不同序列库之间的序列的唯一性,以保证序列值在整个分布式***中的唯一性。应用程序开发人员不用再关注序列的获取,序列值的重复等非业务问题,从而可以将工作的重心放在自身业务上。
为解决上述技术问题,本发明提供一种在分布式数据库中实现高可用序列的方法,具体包括:
步骤1:在两个互不相关的数据库中分别各创建一个序列库;为保证序列库的稳定性,应当限定一个序列库同一时间允许的最大连接数,若当前计算节点同一时间的请求数量大于序列库设定的最大连接数,则序列库应当拒绝接收新的请求;
步骤2:在步骤1创建的两个序列库中各创建一张序列表,所述序列表的字段信息包括:表主键、序列名称、序列起始值、序列步长和单个计算节点应当缓存的序列值个数;所述序列名称用于区分不同的序列;所述序列起始值是计算序列时的初始值,每一个新生成的序列都在序列表中更新;所述序列步长是序列值的增长速度,记为每两个连续序列的差值;
步骤3:在步骤1创建的两个序列库中各创建一个存储过程;所述存储过程是用于处理特定复杂逻辑的程序片段,所述存储过程接收序列名称作为输入参数,输出一个字符串作为输出参数;所述存储过程将接收到的序列名称转换为大写,根据序列名称找到序列表中对应的序列记录,依照预设算法更新其序列起始值,更新成功则返回指定格式的字符串,更新失败则返回预设的字符串;
步骤4:待步骤3完成后,在两个序列表中分别创建序列记录;具体为:在两个序列表中各创建一条序列名称完全相同的序列记录,两条同名的序列记录的序列步长相同且均为10的倍数,序列起始值的个位数数字相同,但十位数一个为奇数,一个为偶数;
步骤5:计算节点接收到用户提取序列的请求,根据序列名称从本地缓存中查找是否有可用序列,若有可用序列,则消耗一个序列值返回给用户,若没有可用序列,则将序列名称发送给序列库以获取序列;具体为:计算节点通过心跳检测确认序列库是否正常;若其中一个序列库异常则在另一个序列库中生成序列,若两个序列库均正常则随机选择其中一个用于生成序列;若失败则重新选择另一个库生成序列;若两个序列库均心跳检测结果异常,计算节点会持续等待直至序列库恢复正常;计算节点调用选中的序列库上的存储过程获取返回值;
步骤6:序列库接收到计算节点的请求后,返回指定格式的字符串给计算节点;
步骤7:计算节点获取到序列库返回的指定格式的字符串后,计算序列值,并返回给用户。
所述步骤1中,所述单点数据库在独立部署的MySQL上创建;序列由两个序列库中任意一个生成。
在所述步骤2中,表主键名称为id,类型为BIGINT型,长度为20,使用单机数据库的主键自增长属性;字段seq_name用于存储序列名称,类型为VARCHAR,长度为255;字段curr_val存放序列的起始值,类型为BIGINT,长度为20;字段step_val用于保存序列的步长,类型为INT,长度为11;字段cache_nums用于保存计算节点的缓存数量,类型为INT,长度为11;在字段seq_name上创建唯一索引。
在所述步骤3中,所述两个序列库中的存储过程相同,均使用SQL编写,部署在具体的MySQL上,存储过程名为focus_sequence_func,类型为FUNCTION,上述存储过程定义了一个接收参数,类型为VACHAR,长度为255,名称为v_seq_name,返回类型为VARCHAR,长度为64,所述指定格式的的字符串是由序列起始值、字符串链接符号、序列起始值需要增加的数值、字符串链接符号和序列步长组成的一个字符串;所述预设的字符串包括-1和-2;所述预设算法为:新的序列起始值=当前的序列起始值+计算节点应当缓存的序列个数×序列步长。
所述步骤3中具体步骤包含:
步骤3-1:预定义四个变量,分别为long类型的v_curr_val,int类型的v_step_val,int类型的v_increment和int类型的v_updateRowCount;所述四个变量分别用于保存序列起始值、序列步长、序列起始值需要增加的数值和变更的序列记录数量;
步骤3-2:将传入的v_seq_name转为大写字母,表中的seq_name转为大写,查询出两个值相同的序列记录;计算v_increment值,计算公式为:v_increment=cache_nums*step_val;判断v_cur_val值是否为空,如果为空则返回字符串-2,不为空则继续步骤3-3;
步骤3-3:计算新的序列起始值,计算公式为:新v_curr_val=v_curr_val+v_increment,使用新v_curr_val值更新步骤3-2中查询出的序列记录;判断更新的序列记录的数量,如果为0行,则返回字符串-1;否则返回指定格式字符串,字符串格式为:v_curr_val值,英文逗号,v_increment值,英文逗号,v_step_val值。
在所述步骤5中,当计算节点启动后,根据地址、账号和密码和两个序列库分别建立心跳检测;计算节点初始化一个Map数据结构,使用分布式数据库的schema名称拼接##符号再拼接序列名作为key,使用一个序列值队列作为value;使用者向计算节点请求指定名称的序列值,计算节点执行如下步骤:
步骤5-1:计算节点使用该key查询Map数据结构,若获取的值不为空则执行步骤5-2,若获取的值为空则构造新的空的序列值队列,并保存在Map数据结构中,继续执行步骤5-2;
步骤5-2:检查步骤5-1获取到的序列值队列,若不为空,则从中提取出一个具体的序列值返回给请求者,若序列值队列为空,则执行步骤5-4;检查序列值队列的长度,若上一次序列值队列的长度大于100,当前序列值队列长度小于上一次的一半,则执行步骤5-4;若上一次序列值队列的长度小于100,当前序列值队列的长度小于50,则执行步骤5-4;序列值队列长度不符合前述两个条件,则执行步骤5-3;
步骤5-3:计算节点完成本次返回序列值操作,进入等待下一次请求;
步骤5-4:计算节点请求序列库生成新一批的序列值;检查两个序列库是否正常,若正常则随机调用其中一个的存储过程,获得返回结果字符串;若字符串为-1或-2,则向另一个序列库重复执行步骤5-4;否则解析返回的字符串,执行步骤7。
所述步骤7中,计算节点收到指定格式的字符串后解析提取出序列起始值、序列增长值和序列步长,计算节点计算出序列值,并返回其中一个序列值给用户,其余的序列值缓存在本地内存中留待下次使用。
所述步骤7中,计算节点计算出序列值包括:第一步,计算序列最大值,计算公式为:序列最大值=序列起始值+序列增长值;第二步,逐一计算具体的序列值,计算公式为:序列值=序列起始值+序列步长;第三步,判断第二步序列值是否大于第一步序列最大值,若大于则生成序列的步骤结束,若小于则重复第二步。
在所述步骤7还包括,以计算出的序列值更新本地的序列缓存;依照步骤3-3中的规则,从序列库的返回值中,依次提取出v_curr_val、v_increment和v_step_val;以返回的v_curr_val为基础,逐次增加值v_step_val;每加一次值后,若新的v_curr_val大于等于返回的v_curr_val与v_increment之和,则结束操作,若新的v_curr_val小于返回的v_curr_val与v_increment之和,则放入步骤5-2获取的序列值队列之中。
本发明所达到的有益效果:
(1)本发明通过使用单机关系型数据库来持久化保存序列信息,解决了传统序列使用内存保存序列无法实现可靠持久性的问题;
(2)本发明通过使用多个,至少两个,序列库保证了序列生成的高可靠;
(3)本发明设计了新的序列生成算法,保证了序列值的永不重复,避免了传统的基于时间的雪花算法面临的时间回退,序列值长度过长等问题;
(4)本发明通过多计算节点缓存序列值,由计算节点为用户提供序列服务的方式,提高了序列生成功能的并发性,增强了性能。
附图说明
图1为本发明实施例中在分布式数据库中实现高可用序列的流程图;
图2为本发明实施例中业务***与计算节点连接示意图;
图3为本发明实施例中用户请求序列及计算节点响应的时序示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图,详细介绍序列服务的初始化及使用:
图1为本发明实施例中基于数据库中间件集群的高可用客户端负载均衡方法流程图,具体包括:
步骤1:创建两个序列库;初始化两个单点数据库作为序列库。具体为:在两个MySQL上分别各创建一个数据库。MySQL是一个单机关系型数据库,被作为分布式数据库底层数据存储的一部分。序列库被用来保存序列的基础信息,并同时用来产生具体的序列值。初始化参数包括:序列库名称,序列库字符集,序列库账号,序列库密码,最大连接数。最大连接数用于限定一个序列库最多与多少个计算节点保持连接。若当前计算节点数量大于设定的最大连接数,新的计算节点请求将会被拒绝。
通过使用至少两个(或多个)的序列库保证了序列生成的高可靠。
步骤2:在两个序列库中分别创建序列表。具体为:在两个序列库中分别创建一张序列表。序列表的字段信息包括:表主键,序列名称,序列的起始值,序列的步长,缓存的序列值数量。序列名称用于区分不同的序列。序列起始值指每次产生序列时生成算法计算的起始值。序列步长指序列值的增长速度,即每两个连续序列的差值。缓存的序列值数量指每次产生序列值时共产生多少个序列值。
表主键名称为id,类型为BIGINT型,长度为20,使用单机数据库的主键自增长属性;字段seq_name用于存储序列名称,类型为VARCHAR,长度为255;字段curr_val存放序列的起始值,类型为BIGINT,长度为20;字段step_val用于保存序列的步长,类型为INT,长度为11;字段cache_nums用于保存计算节点的缓存数量,类型为INT,长度为11;在字段seq_name上创建唯一索引。
通过使用单机关系型数据库来持久化保存序列信息,解决了传统序列使用内存保存序列无法实现可靠持久性的问题。
步骤3:在两个序列库中分别创建存储过程。具体为:存储过程是一段使用SQL编写的,可部署在具体的MySQL上,用于处理特定复杂逻辑的程序片段。它接收一个参数序列名称,输出结果为一个特定的数值。上述存储过程会首先将接收到的序列名称转换为大写,随后根据序列名称找到序列表中对应的记录。依照特定的预设算法更新其序列起始值,更新成功则按照指定格式返回结果,更新失败则返回数字-1。前述的预设算法的规则为:新的序列起始值=序列当前起始值+序列缓存数量*序列增长步长。前述返回格式为:由序列起始值,英文逗号,序列增长值,英文逗号和序列增长步长组成的字符串。前述存储过程具体流程包括:
步骤3-1:预定义好四个变量,分别为long类型的v_curr_val,int类型的v_step_val,int类型的v_increment,int类型的v_updateRowCount;前述四个变量分别用于保存序列的起始值,序列的步长,序列的累计增长量和变更的序列记录数量;
步骤3-2:将传入的v_seq_name转为大写字母,表中的seq_name转为大写,查询出两个值相同的序列记录。计算v_increment值,计算公式为:v_increment=cache_nums*step_val。判断v_cur_val值是否为空,如果为空则返回字符串-2,不为空则继续步骤3-3;
步骤3-3:计算新的序列起始值,计算公式为:新v_curr_val=v_curr_val+v_increment,使用新v_curr_val值更新步骤3-2中查询出的序列记录。判断前述更新操作影响记录数,如果为0行,则返回字符串-1;否则返回指定格式字符串,字符串格式为:v_curr_val值,英文逗号,v_increment值,英文逗号,v_step_val值。
步骤3使用的存储过程代码片段如下所示:
通过设计新的序列生成算法,保证了序列值的永不重复,避免了传统的基于时间的雪花算法面临的时间回退,序列值长度过长等问题。
步骤4:待步骤3完成后,根据实际需要在两个序列表中分别创建序列记录。具体为:同一个名称的序列要分别在两个序列表中各创建一条序列记录,这两条记录的唯一区别为起始值的十位数奇偶不同,如一个是0,另一个则为1,其它位数数字要保持一致。
步骤5:计算节点响应用户获取序列的请求,检查内存是否有序列值缓存,有则返回,没有则请求序列库。
计算节点接收到用户提取序列的请求,首先根据序列名称从本地缓存中查找是否有可用序列,若有则消耗一个值返回给用户,若没有则将序列名称发送给序列库以获取序列。更具体为:计算节点通过账号密码链接到两个序列库;计算节点随机选择其中某一个可用的序列库;计算节点调用前述序列库上的存储过程获取返回值。
计算节点具体流程包括:
步骤5-1:计算节点使用schema名称,拼接上##符号,再拼接上请求的序列名称组成key;计算节点使用该key查询Map数据结构,若获取的值不为空则执行步骤5-2,若获取的值为空则首先构造新的空的序列值队列,并保存在Map数据结构中,继续执行步骤5-2;
步骤5-2:检查步骤5-1获取到的序列值队列,若不为空,则从中提取出一个具体的序列值返回给请求者,若序列值队列为空,则执行步骤5-4。检查前述序列值队列的长度,若上一次序列值队列的长度大于100,当前序列值队列长度小于之前的一半则执行步骤5-4;若上一次序列值队列的长度小于100,当前序列值队列的长度小于50则执行步骤5-4。序列值队列长度不符合前述两个条件则执行步骤5-3;
步骤5-3:计算节点完成本次返回序列值操作,进入等待下一次请求;
步骤5-4:计算节点请求序列库生成新一批的序列值。检查两个序列库是否正常,若正常则随机调用其中一个的存储过程,获得返回结果字符串;若字符串为-1,则向另一个序列库重复重复执行步骤5-4;否则解析返回的字符串。
步骤6:序列库接收计算节点请求,调用存储过程更新序列值,并返回特定结果给计算节点。具体为:序列库接收到计算节点请求某一个具体序列名称的序列值时,调用本库中的存储过程,将序列名称作为参数传入。存储过程收到序列名称后,将其转换为大写并从序列表中找到对应的记录,依照指定的算法计算出新的序列起始值。该存储过程将前述计算出的新序列起始值,连同序列增长值,序列步长组成字符串一并传回给计算节点。
步骤7:计算节点解析返回结果,返回给用户具体的序列值,缓存剩余的序列值。具体为:计算节点获取到序列库的返回值后解析提取出序列起始值、序列累积增长值和序列步长,计算节点根据一定算法计算出序列值,并返回其中一个给用户,其余的缓存在本地内存中留待下次使用。前述算法分为三步:第一步为计算本批序列最大值,具体为序列最大值=序列起始值+序列累积增长值;第二步为序列值=序列起始值+序列步长;第三步为判断第二步序列值是否大于第一步序列最大值,若大于则生成序列的步骤结束,若小于则重复第二步。前述计算节点计算序列值具体流程包括:依照步骤3-3中的规则,依次提取出v_curr_val、v_increment和v_step_val。以返回的v_curr_val为基础,逐次增加值v_step_val;每加一次值后,若得到的新v_curr_val大于等于返回的v_curr_val与v_increment之和,则结束操作,若得到的新v_curr_val小于返回的v_curr_val与v_increment之和,则将该值放入步骤5-2获取的序列值队列之中。
步骤7中用于计算序列值的代码片段为:
图2为本发明实施例中在分布式数据库中实现高可用序列的结构示意图,包含与分布式数据库用户相连的分布式数据库内的计算集群和储存集群。
所述分布式数据库用户包括个人用户,业务***,第三方管理工具等软件或人员;所述计算集群,由至少1个的计算节点组成;所述储存集群由不少于两个的序列库(序列库A和序列库B)组成,每个序列库均有独立的序列表和用于更新序列的存储过程。
比如在分布式数据库环境下,表的主键需要保证全局唯一,同时由于主键字段长度限制,市面上常见的UUID算法因字段过长甚至根本无法存入库表中,此时只能依靠本发明来提供主键值。
又比如常见的雪花算法,在生成序列时使用时间戳作为种子,一旦出现授时服务时间回拨的情况就会出现重复序列,直接破坏了序列要求永远保持唯一的特性,会对使用者带来巨大的灾难。而本发明依托数据库及时更改序列起始值,可以保证序列永远正向增长永不重复。
再比如市面上常见的分发号段的方式实现的分布式高可用序列,需要在原有的***之外额外部署授时集群、序列服务集群,对使用者来说不仅需要额外的软硬件资源,还需要维护和序列服务之间的可用性,同时一次新增请求将不得不被分割成两次不同***的调用。而本发明天生集成于分布式数据库之中,对于用户来说,无需任何额外的改造和学习可直接像使用传统oracle、mysql这类数据库一样使用该序列。
目前,经过两年多的研发实验,基于本案思想设计的实施例在公司核心业务中全面上线,在业务考验下,未发生过一次与序列有关的事故,有力支撑着日千万级TPS的访问量。
图3为本发明实施例中分布式数据库用户请求序列的时序流程图,包括用户、计算节点和序列库,具体步骤包括:
步骤301:分布式数据库用户请求某一个具体的序列;
步骤302:计算节点检查本地序列缓存,若有则返回序列值;
步骤303:计算节点请求序列库生成新的序列值;
步骤304-1:序列库调用存储过程,根据算法更新序列起始值;
步骤304-2:序列库将存储过程执行结果返回给计算节点;
步骤305-1:计算节点获取序列库返回结果,解析提取出具体的序列值,缓存在计算节点的内存中;
步骤305-2:计算节点从序列缓存中提取出一部分序列值返回给用户。
本发明提供了一种在分布式数据库中基于单机关系型数据库实现生成唯一高可用序列值的方法,单机关系型数据库保证了序列的永不重复,但没有解决高可用性的问题;本发明通过两个序列库保证生成序列的服务高可用,两个序列库可同时对外提供服务;本发明通过相同步长而仅十位数字不同的方式保证了不同序列库中的序列值永不重复;本发明通过多个计算节点缓存序列值的方式提高了序列分发的性能和并发量,不同计算节点会根据当前缓存的数量自动补充或丢弃已经取得的序列值。
本发明所达到的有益效果:
(1)本发明通过使用单机关系型数据库来持久化保存序列信息,解决了传统序列使用内存保存序列无法实现持久性的问题;
(2)本发明通过使用多个,至少两个,序列库保证了序列生成能力的高可靠;
(3)本发明设计了新的序列生成算法,保证了序列值的永不重复,避免了传统的基于时间的雪花算法面临的时间回退,序列值长度过长等问题;
(4)本发明通过多计算节点缓存序列值,由计算节点为用户提供序列服务的方式,提高了序列生成功能的并发性,增强了性能。
以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。
Claims (9)
1.一种在分布式数据库中实现高可用序列的方法,其特征在于,包括:
步骤1:在两个互不相关的数据库中分别各创建一个序列库;为保证序列库的稳定性,应当限定一个序列库同一时间允许的最大连接数,若当前计算节点同一时间的请求数量大于序列库设定的最大连接数,则序列库应当拒绝接收新的请求;
步骤2:在步骤1创建的两个序列库中各创建一张序列表,所述序列表的字段信息包括:表主键、序列名称、序列起始值、序列步长和单个计算节点应当缓存的序列值个数;所述序列名称用于区分不同的序列;所述序列起始值是计算序列时的初始值,每一个新生成的序列都在序列表中更新;所述序列步长是序列值的增长速度,记为每两个连续序列的差值;
步骤3:在步骤1创建的两个序列库中各创建一个存储过程;所述存储过程是用于处理特定复杂逻辑的程序片段,所述存储过程接收序列名称作为输入参数,输出一个字符串作为输出参数;所述存储过程将接收到的序列名称转换为大写,根据序列名称找到序列表中对应的序列记录,依照预设算法更新其序列起始值,更新成功则返回指定格式的字符串,更新失败则返回预设的字符串;
步骤4:待步骤3完成后,在两个序列表中分别创建序列记录;具体为:在两个序列表中各创建一条序列名称完全相同的序列记录,两条同名的序列记录的序列步长相同且均为10的倍数,序列起始值的个位数数字相同,但十位数一个为奇数,一个为偶数;
步骤5:计算节点接收到用户提取序列的请求,根据序列名称从本地缓存中查找是否有可用序列,若有可用序列,则消耗一个序列值返回给用户,若没有可用序列,则将序列名称发送给序列库以获取序列;具体为:计算节点通过心跳检测确认序列库是否正常;若其中一个序列库异常则在另一个序列库中生成序列,若两个序列库均正常则随机选择其中一个用于生成序列;若失败则重新选择另一个库生成序列;若两个序列库均心跳检测结果异常,计算节点会持续等待直至序列库恢复正常;计算节点调用选中的序列库上的存储过程获取返回值;
步骤6:序列库接收到计算节点的请求后,返回指定格式的字符串给计算节点;
步骤7:计算节点获取到序列库返回的指定格式的字符串后,计算序列值,并返回给用户。
2.如权利要求1所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:所述步骤1中,所述单点数据库在独立部署的MySQL上创建;序列由两个序列库中任意一个生成。
3.如权利要求2所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:在所述步骤2中,表主键名称为id,类型为BIGINT型,长度为20,使用单机数据库的主键自增长属性;字段seq_name用于存储序列名称,类型为VARCHAR,长度为255;字段curr_val存放序列的起始值,类型为BIGINT,长度为20;字段step_val用于保存序列的步长,类型为INT,长度为11;字段cache_nums用于保存计算节点的缓存数量,类型为INT,长度为11;在字段seq_name上创建唯一索引。
4.如权利要求3所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:在所述步骤3中,所述两个序列库中的存储过程相同,均使用SQL编写,部署在具体的MySQL上,存储过程名为focus_sequence_func,类型为FUNCTION,上述存储过程定义了一个接收参数,类型为VACHAR,长度为255,名称为v_seq_name,返回类型为VARCHAR,长度为64,所述指定格式的的字符串是由序列起始值、字符串链接符号、序列起始值需要增加的数值、字符串链接符号和序列步长组成的一个字符串;所述预设的字符串包括-1和-2;所述预设算法为:新的序列起始值=当前的序列起始值+计算节点应当缓存的序列个数×序列步长。
5.如权利要求4所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:
所述步骤3中具体步骤包含:
步骤3-1:预定义四个变量,分别为long类型的v_curr_val,int类型的v_step_val,int类型的v_increment和int类型的v_updateRowCount;所述四个变量分别用于保存序列起始值、序列步长、序列起始值需要增加的数值和变更的序列记录数量;
步骤3-2:将传入的v_seq_name转为大写字母,表中的seq_name转为大写,查询出两个值相同的序列记录;计算v_increment值,计算公式为:v_increment=cache_nums*step_val;判断v_cur_val值是否为空,如果为空则返回字符串-2,不为空则继续步骤3-3;
步骤3-3:计算新的序列起始值,计算公式为:新v_curr_val=v_curr_val+v_increment,使用新v_curr_val值更新步骤3-2中查询出的序列记录;判断更新的序列记录的数量,如果为0行,则返回字符串-1;否则返回指定格式字符串,字符串格式为:v_curr_val值,英文逗号,v_increment值,英文逗号,v_step_val值。
6.如权利要求5所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:在所述步骤5中,当计算节点启动后,根据地址、账号和密码和两个序列库分别建立心跳检测;计算节点初始化一个Map数据结构,使用分布式数据库的schema名称拼接##符号再拼接序列名作为key,使用一个序列值队列作为value;使用者向计算节点请求指定名称的序列值,计算节点执行如下步骤:
步骤5-1:计算节点使用该key查询Map数据结构,若获取的值不为空则执行步骤5-2,若获取的值为空则构造新的空的序列值队列,并保存在Map数据结构中,继续执行步骤5-2;
步骤5-2:检查步骤5-1获取到的序列值队列,若不为空,则从中提取出一个具体的序列值返回给请求者,若序列值队列为空,则执行步骤5-4;检查序列值队列的长度,若上一次序列值队列的长度大于100,当前序列值队列长度小于上一次的一半,则执行步骤5-4;若上一次序列值队列的长度小于100,当前序列值队列的长度小于50,则执行步骤5-4;序列值队列长度不符合前述两个条件,则执行步骤5-3;
步骤5-3:计算节点完成本次返回序列值操作,进入等待下一次请求;
步骤5-4:计算节点请求序列库生成新一批的序列值;检查两个序列库是否正常,若正常则随机调用其中一个的存储过程,获得返回结果字符串;若字符串为-1或-2,则向另一个序列库重复执行步骤5-4;否则解析返回的字符串,执行步骤7。
7.如权利要求6所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:所述步骤7中,计算节点收到指定格式的字符串后解析提取出序列起始值、序列增长值和序列步长,计算节点计算出序列值,并返回其中一个序列值给用户,其余的序列值缓存在本地内存中留待下次使用。
8.如权利要求7所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:所述步骤7中,计算节点计算出序列值包括:第一步,计算序列最大值,计算公式为:序列最大值=序列起始值+序列增长值;第二步,逐一计算具体的序列值,计算公式为:序列值=序列起始值+序列步长;第三步,判断第二步序列值是否大于第一步序列最大值,若大于则生成序列的步骤结束,若小于则重复第二步。
9.如权利要求8所述的一种在分布式数据库中实现高可用序列的方法,其特征在于:在所述步骤7还包括,以计算出的序列值更新本地的序列缓存;依照步骤3-3中的规则,从序列库的返回值中,依次提取出v_curr_val、v_increment和v_step_val;以返回的v_curr_val为基础,逐次增加值v_step_val;每加一次值后,若新的v_curr_val大于等于返回的v_curr_val与v_increment之和,则结束操作,若新的v_curr_val小于返回的v_curr_val与v_increment之和,则放入步骤5-2获取的序列值队列之中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310139533.7A CN116028505A (zh) | 2023-02-20 | 2023-02-20 | 一种在分布式数据库中实现高可用序列的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310139533.7A CN116028505A (zh) | 2023-02-20 | 2023-02-20 | 一种在分布式数据库中实现高可用序列的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116028505A true CN116028505A (zh) | 2023-04-28 |
Family
ID=86091420
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310139533.7A Pending CN116028505A (zh) | 2023-02-20 | 2023-02-20 | 一种在分布式数据库中实现高可用序列的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116028505A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117251456A (zh) * | 2023-11-16 | 2023-12-19 | 广州市千钧网络科技有限公司 | 一种主键值生成方法、装置、电子设备和存储介质 |
-
2023
- 2023-02-20 CN CN202310139533.7A patent/CN116028505A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117251456A (zh) * | 2023-11-16 | 2023-12-19 | 广州市千钧网络科技有限公司 | 一种主键值生成方法、装置、电子设备和存储介质 |
CN117251456B (zh) * | 2023-11-16 | 2024-03-08 | 广州市千钧网络科技有限公司 | 一种主键值生成方法、装置、电子设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109800222B (zh) | 一种HBase二级索引自适应优化方法和*** | |
CN107247808B (zh) | 一种分布式NewSQL数据库***及图片数据查询方法 | |
US8140495B2 (en) | Asynchronous database index maintenance | |
US9916313B2 (en) | Mapping of extensible datasets to relational database schemas | |
CN107038222B (zh) | 数据库缓存实现方法及其*** | |
US11442961B2 (en) | Active transaction list synchronization method and apparatus | |
US7890541B2 (en) | Partition by growth table space | |
US9149054B2 (en) | Prefix-based leaf node storage for database system | |
US20100257181A1 (en) | Dynamic Hash Table for Efficient Data Access In A Relational Database System | |
EP2199935A2 (en) | Method and system for dynamically partitioning very large database indices on write-once tables | |
US20120005158A1 (en) | Reducing Contention of Transaction Logging in a Database Management System | |
US11526465B2 (en) | Generating hash trees for database schemas | |
WO2007137940A1 (en) | Relational database architecture with dynamic load capability | |
AU1472901A (en) | System for managing rdbm fragmentations | |
CN105447166A (zh) | 一种基于关键字查找信息的方法及*** | |
CN111651519A (zh) | 数据同步方法、数据同步装置、电子设备及存储介质 | |
CN116028505A (zh) | 一种在分布式数据库中实现高可用序列的方法 | |
WO2017156855A1 (en) | Database systems with re-ordered replicas and methods of accessing and backing up databases | |
US8489644B2 (en) | System and method for managing virtual tree pages | |
US7822767B2 (en) | Modeling and implementing complex data access operations based on lower level traditional operations | |
CN114556320A (zh) | 切换到最终一致的数据库副本 | |
CN112181302A (zh) | 一种数据多级存储和访问方法及*** | |
CN111125129A (zh) | 数据处理方法和装置、存储介质及处理器 | |
CN110781205A (zh) | 一种基于jdbc的数据库直查方法、装置及*** | |
US11947490B2 (en) | Index generation and use with indeterminate ingestion patterns |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |