一种基于mysql的分布式业务主键生成方法
技术领域
1.本发明涉及分布式系统技术领域,尤其涉及一种基于mysql的分布式业务主键生成方法。
背景技术:
2.传统的关系型数据库,如mysql中,数据库本身自带自增主键生成机制,但在分布式环境下,由于分库分表导致数据水平拆分后无法使用单表自增主键,因此我们需要一种全局唯一id生成策略作为分布式主键。
3.分布式系统中,业务组成基本是由多个不同功能的微服务组成的,各个微服务都有自己的业务流程,往往需要对大量的数据和消息进行唯一标识,数据日渐增长,对数据分库分表后需要有一个唯一id来标识一条数据或消息,数据库的自增id显然不能满足需求。业务系统对唯一标识id的的要求如下:
4.全局唯一性,既然是唯一标识,不能出现重复的id号;
5.趋势递增,尽可能的使用数据库引擎的聚集索引;
6.单调递增,保证下一个id一定大于上一个id;
7.信息安全,防止恶意用户扒取相关数据。
8.除了上述要求之外,id生成功能还要尽量保证qps、平均延时较低等特性,尽量不影响业务主流程的性能和高可用性,然而现有的分布式系统中数据库的自增id无法满足需求。
技术实现要素:
9.本发明的目的在于提供一种基于mysql的分布式业务主键生成方法,以解决上述背景技术中遇到的问题。
10.为实现上述目的,本发明的技术方案如下:
11.一种基于mysql的分布式业务主键生成方法,包括以下步骤:
12.步骤一:微服务启动,获取当前微服务所在节点的真实ip和相关业务标识;
13.步骤二:基于mysql判断当前微服务所在机器是否注册过相关业务信息,如果注册过,获取当前业务对应的workid;没有注册过,进行相关信息注册,并获取workid;
14.步骤三:缓存获取到的workid和注册时时间戳;
15.步骤四:判断更新周期的时间是否大于当前机器的时间,如果小于则启动报警;
16.步骤五:判断当前业务所在各个机器的时间,进行平均值获取,并与进行比对,如果小于,则启动报警;
17.步骤六:获取业务id当前时间下生成的起始索引;
18.步骤七:开启定时任务,定时更新mysql记录的更新时间,以及缓存当前业务所述的workid数据至本地文件;
19.步骤八:启动成功,缓存相关业务的id生成工具类及相关信息。
20.上述方案中,生成出来的id是个64位的长整型数字,生成的规则是时间戳、workid、自增数字中的组合。
21.与现有技术相比,本发明的有益效果是:基于mysql的分布式业务主键生成方法,对业务性能影响较小,可支持多业务多场景同时获取唯一表示id,可基于业务标识进行相关隔离,各业务之间id生成的规则相互不影响,支持微服务业务高可用,性能高。本地服务独立生成,可与mysql进行相应解耦,即使mysql集群出现故障,也可以独立工作,不受mysql集群影响。
附图说明
22.参照附图来说明本发明的公开内容。应当了解,附图仅仅用于说明目的,而并非意在对本发明的保护范围构成限制。在附图中,相同的附图标记用于指代相同的部件。其中:
23.图1为本发明基于mysql的分布式业务主键生成方法流程图。
具体实施方式
24.为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,现在结合附图对本发明作进一步详细的说明。这些附图均为简化的示意图,仅以示意方式说明本发明的基本结构,因此其仅显示本发明有关的构成。
25.根据本发明的技术方案,在不变更本发明实质精神下,本领域的一般技术人员可以提出可相互替换的多种结构方式以及实现方式。因此,以下具体实施方式以及附图仅是对本发明的技术方案的示例性说明,而不应当视为本发明的全部或者视为对本发明技术方案的限定或限制。
26.下面结合附图和实施例对本发明的技术方案做进一步的详细说明。
27.如图1所示,一种基于mysql的分布式业务主键生成方法,包括以下步骤:
28.步骤一:微服务启动,获取当前微服务所在节点的真实ip和相关业务标识。
29.步骤二:基于mysql判断当前微服务所在机器是否注册过相关业务信息,如果注册过,获取当前业务对应的workid;假如没有注册过,进行相关信息注册,并获取workid。即在检查mysql是否注册过相关业务时,若已经注册过,则获取属于自身的ip和业务标识的workid,若没有注册过,则通过mysql注册业务标识和服务所在ip,为该新服务分配workid。
30.步骤三:缓存获取到的workid和注册时的时间戳,用于后续生成递增的业务主键id。
31.步骤四:检查周期更新的时钟,判断更新周期的时间是否大于等于当前机器的时间,如果小于当前机器的时间,则说明失败,启动报警;如果大于当前机器的时间,则说明成功,进行下一步操作。
32.步骤五:检查周期更新的时钟,判断当前业务所在各个机器的时间,对所有机器的时钟时间进行平均数计算,进行平均值获取,并进行比对,如果小于或等于平均值,则说明失败,启动报警,并对告警中心服务进行上报,等待后续人工接入进行修复;如果大于平均值,则说明成功,进行下一步操作。
33.步骤六:获取业务id当前时间下生成的起始索引;
34.步骤七:开启定时任务,定时更新mysql记录的更新时间,以及缓存当前业务所述
的workid数据至本地文件;
35.步骤八:启动成功,缓存相关业务的id生成工具类及相关信息,比如workid、该服务所分配的自增序列。
36.通过本方法,可以获取分布式id唯一标识,每一个服务所在不同的机器,都会分配一个唯一的workid、可以根据机器所在不同的地域进行workid的规划,完成空间能力的划分。因生成的规则是时间戳、workid、自增数字,生成出来的id是个64位的长整型数字,所以可采用64-bit分别划分成多段,分开来标示机器、时间等,可以根据自身业务特性分配bit位,非常灵活。
37.通过本方法,选取更新周期的时间大于当前机器的时间的数据,从而针对每个业务可以生成独立的递增id序列。在实施时,毫秒数在高位,自增序列在低位,最终使整个id都是趋势递增的。
38.通过本方法获得的唯一标识id,生成出来的id是64位的长整型,无法直接猜测出来唯一标识id的生成规则,防止业务的泄漏,生层规则相对隐藏,数据相对安全,可以防止用户对数据进行恶意的爬取。
39.通过本方法,支持各业务空间划分,进行业务隔离,可以独立部署。服务启动后,因为缓存了workid,第三方组件主要是为了分配workid用的,在服务启动后就可以不依赖第三方组件,如果每个机器的workid在规划时候是唯一的,后续可以增加缓存文件进行缓存,不依赖第三方组件,可以与第三方组件进行解耦。这样不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成id的性能高。
40.在检查周期更新的时钟时,因服务器可能出现时钟同步组件出现问题,如果时钟出现问题,生成规则中的时间戳就混乱,可能出现分配出相同的id,所以检测出时钟回拨后,会立马上报告警,上报该服务无法生成id,避免业务问题,因此当服务所在机器时钟出现回拨问题,可以及时报警,进行快速修复。
41.基于mysql的分布式业务主键生成方法,对业务性能影响较小,可支持多业务多场景同时获取唯一表示id,可基于业务标识进行相关隔离,各业务之间id生成的规则相互不影响,支持微服务业务高可用,性能高。本地服务独立生成,可与mysql进行相应解耦,即使mysql集群出现故障,也可以独立工作,不受mysql集群影响。
42.以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式,并不用于限定本发明保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应含在本发明的保护范围之内。
技术特征:
1.一种基于mysql的分布式业务主键生成方法,其特征在于,包括以下步骤:步骤一:微服务启动,获取当前微服务所在节点的真实ip和相关业务标识;步骤二:基于mysql判断当前微服务所在机器是否注册过相关业务信息,如果注册过,获取当前业务对应的workid;没有注册过,进行相关信息注册,并获取workid;步骤三:缓存获取到的workid和注册时时间戳;步骤四:判断更新周期的时间是否大于当前机器的时间,如果小于则启动报警;步骤五:判断当前业务所在各个机器的时间,进行平均值获取,并与进行比对,如果小于,则启动报警;步骤六:获取业务id当前时间下生成的起始索引;步骤七:开启定时任务,定时更新mysql记录的更新时间,以及缓存当前业务所述的workid数据至本地文件;步骤八:启动成功,缓存相关业务的id生成相关信息。2.根据权利要求1所述的一种基于mysql的分布式业务主键生成方法,其特征在于:在步骤八中,生成出来的id是个64位的长整型数字,生成的规则是时间戳、workid、自增数字中的组合。
技术总结
本发明涉及一种基于Mysql的分布式业务主键生成方法,先选取更新周期的时间大于当前机器的时间,再选取大的平均值,最后缓存当前业务所述的workId数据至本地文件。基于Mysql的分布式业务主键生成方法,对业务性能影响较小,可支持多业务多场景同时获取唯一表示ID,可基于业务标识进行相关隔离,各业务之间ID生成的规则相互不影响,支持微服务业务高可用,性能高。本地服务独立生成,可与Mysql进行相应解耦,即使Mysql集群出现故障,也可以独立工作,不受Mysql集群影响。不受Mysql集群影响。不受Mysql集群影响。
技术研发人员:杨志鹏
受保护的技术使用者:紫光云(南京)数字技术有限公司
技术研发日:2021.11.30
技术公布日:2022/3/8