一种在分布式数据库中实现高可用序列的方法技术

技术编号:37429111 阅读:10 留言:0更新日期:2023-04-30 09:49
本发明专利技术公开了一种在分布式数据库中实现高可用序列的方法,其特征在于,由分布式数据库中的多个计算节点直接提供序列值,并自动更新序列缓存;使用两个序列库同时提供序列服务,以保证了序列服务的高可用性;通过自的算法规则实现不同序列库之间的序列的唯一性,以保证序列值在整个分布式系统中的唯一性。以达到应用程序开发人员不用再关注序列的获取,序列值的重复等非业务问题,从而可以将工作的重心放在自身业务上的效果;让分布式数据库更高效、可靠、安全的提供序列值。安全的提供序列值。安全的提供序列值。

【技术实现步骤摘要】
一种在分布式数据库中实现高可用序列的方法


[0001]本专利技术属于分布式数据库领域,具体涉及一种在分布式数据库中实现高可用序列的方法。

技术介绍

[0002]随着计算机技术的快速发展和应用的业务领域不断增多,越来越多的数据被产生并被记录在数据库之中。随着时间的累计,数据库中单表的数据量越来越庞大,读写性能开始显著降低。同时传统关系型数据库单点单机部署模式没有解决高可用性的问题,已经不能满足业务应用对数据库高性能、高可用性、高并发的要求。所以,近些年越来越多的企业开始转型使用分布式数据库。分布式数据库为处理单表数据庞大,读写性能下降的问题,会将原本单机关系型数据库中的一张表以记录为维度拆分在多台单机关系型数据库之中。分布式数据库为提供更强大的读写性能,支持更高的并发量,通常会在一个分布式数据库中部署多个计算节点,以用于解析SQL、执行SQL、组装SQL执行结果。对于使用者,可通过分布式数据库客户端任意链接其中一个计算节点执行相关操作。在单机关系型数据库中,一张单表可以使用主键序列生成一个在单表内唯一的值来标识一条记录。在分布式数据库中,当单表被拆分到不同的单机关系型数据库中时,便面临着需要一种功能能够提供在多张单表中均保持唯一的序列值。
[0003]传统的唯一序列值方案都是在分布式数据库之外独立部署一套系统。使用者需要首先链接该系统获取到独立序列值,再组装SQL,再发送给分布式数据库,比如在redis中存储一个key不断自增,它们的优点是方案成熟可靠,确实可以提供唯一序列值。但是独立部署系统,意味着需要额外的软硬件,额外的开发运维人员,同时对于使用者来说需要同时保持和两套系统的链接,此举无疑加大了应用系统的开发和运维人员的工作复杂度。
[0004]传统的唯一序列值实现方式为了保证更高的并发度,往往选择通过内存方式实现,比如雪花算法,通过使用计算机的时钟作为种子用特定的算法生成一个永不重复的值来作为序列值,它们的优点是实现简单、性能高,但同时可用性低,且无法有效解决机器时钟回拨问题,易出现序列值重复的问题。因而通常基于内存的方式多用于对唯一性要求不是那么苛刻的场合。

技术实现思路

[0005]本专利技术旨在解决现有技术的缺陷和问题,在分布式数据库中,序列值需要同时考虑到高可用性,高性能以及严苛的不可重复性,从而让分布式数据库更高效、可靠、安全的提供序列值;本专利技术由分布式数据库中的多个计算节点直接提供序列值,并自动更新序列缓存;使用两个序列库同时提供序列服务,以保证了序列服务的高可用性;通过自定义的算法规则实现不同序列库之间的序列的唯一性,以保证序列值在整个分布式系统中的唯一性。应用程序开发人员不用再关注序列的获取,序列值的重复等非业务问题,从而可以将工作的重心放在自身业务上。
[0006]为解决上述技术问题,本专利技术提供一种在分布式数据库中实现高可用序列的方法,具体包括:
[0007]步骤1:在两个互不相关的数据库中分别各创建一个序列库;为保证序列库的稳定性,应当限定一个序列库同一时间允许的最大连接数,若当前计算节点同一时间的请求数量大于序列库设定的最大连接数,则序列库应当拒绝接收新的请求;
[0008]步骤2:在步骤1创建的两个序列库中各创建一张序列表,所述序列表的字段信息包括:表主键、序列名称、序列起始值、序列步长和单个计算节点应当缓存的序列值个数;所述序列名称用于区分不同的序列;所述序列起始值是计算序列时的初始值,每一个新生成的序列都在序列表中更新;所述序列步长是序列值的增长速度,记为每两个连续序列的差值;
[0009]步骤3:在步骤1创建的两个序列库中各创建一个存储过程;所述存储过程是用于处理特定复杂逻辑的程序片段,所述存储过程接收序列名称作为输入参数,输出一个字符串作为输出参数;所述存储过程将接收到的序列名称转换为大写,根据序列名称找到序列表中对应的序列记录,依照预设算法更新其序列起始值,更新成功则返回指定格式的字符串,更新失败则返回预设的字符串;
[0010]步骤4:待步骤3完成后,在两个序列表中分别创建序列记录;具体为:在两个序列表中各创建一条序列名称完全相同的序列记录,两条同名的序列记录的序列步长相同且均为10的倍数,序列起始值的个位数数字相同,但十位数一个为奇数,一个为偶数;
[0011]步骤5:计算节点接收到用户提取序列的请求,根据序列名称从本地缓存中查找是否有可用序列,若有可用序列,则消耗一个序列值返回给用户,若没有可用序列,则将序列名称发送给序列库以获取序列;具体为:计算节点通过心跳检测确认序列库是否正常;若其中一个序列库异常则在另一个序列库中生成序列,若两个序列库均正常则随机选择其中一个用于生成序列;若失败则重新选择另一个库生成序列;若两个序列库均心跳检测结果异常,计算节点会持续等待直至序列库恢复正常;计算节点调用选中的序列库上的存储过程获取返回值;
[0012]步骤6:序列库接收到计算节点的请求后,返回指定格式的字符串给计算节点;
[0013]步骤7:计算节点获取到序列库返回的指定格式的字符串后,计算序列值,并返回给用户。
[0014]所述步骤1中,所述单点数据库在独立部署的MySQL上创建;序列由两个序列库中任意一个生成。
[0015]在所述步骤2中,表主键名称为id,类型为BIGINT型,长度为20,使用单机数据库的主键自增长属性;字段seq_name用于存储序列名称,类型为VARCHAR,长度为255;字段curr_val存放序列的起始值,类型为BIGINT,长度为20;字段step_val用于保存序列的步长,类型为INT,长度为11;字段cache_nums用于保存计算节点的缓存数量,类型为INT,长度为11;在字段seq_name上创建唯一索引。
[0016]在所述步骤3中,所述两个序列库中的存储过程相同,均使用SQL编写,部署在具体的MySQL上,存储过程名为focus_sequence_func,类型为FUNCTION,上述存储过程定义了一个接收参数,类型为VACHAR,长度为255,名称为v_seq_name,返回类型为VARCHAR,长度为64,所述指定格式的的字符串是由序列起始值、字符串链接符号、序列起始值需要增加的数
值、字符串链接符号和序列步长组成的一个字符串;所述预设的字符串包括

1和

2;所述预设算法为:新的序列起始值=当前的序列起始值+计算节点应当缓存的序列个数
×
序列步长。
[0017]所述步骤3中具体步骤包含:
[0018]步骤3

1:预定义四个变量,分别为long类型的v_curr_val,int类型的v_step_val,int类型的v_increment和int类型的v_updateRowCount;所述四个变量分别用于保存序列起始值、序列步长、序列起始值需要增加的数值和变更的序列记录数量;
[0019]步骤3

2:将传入的v_seq_name转为本文档来自技高网
...

【技术保护点】

【技术特征摘要】
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_se...

【专利技术属性】
技术研发人员:乐磊仇东标张勇
申请(专利权)人:焦点科技股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1