海安新闻网
当前位置:主页>国际新闻>
多地区部署唯一自增ID的实现方法探讨
来源:damugemaoyi.com  阅读量:1519

这是一个偏向于技术和业务的解决方案。有许多方法可以解决这个问题,也就是说,当同一个应用程序在全球部署时。

当一个系统部署在世界多个地区时,由于服务业务和当地监管机构的要求,在数据层通常有几种可能性:

1。数据相互隔离,不存在相互迁移的问题。

2,以单个节点作为书写中心(通常是1-3),然后与世界各地的其他站点同步。这种类型的基本数据通常是配置数据或要共享的基本数据的一部分,放置在法律认可的国家或地区,而不违反监管要求。

3。写操作存在于每个地区或国家,然后通过系统或底层数据同步工具相互同步。

对于方法1和方法2,实现相对简单,因为写入是相对单一的条目,然后以此为中心分发数据,不同地方的写入速度会受到影响。然而,对于大多数企业来说,多读少写是最常见的,所以这种方法的可行性仍然很强。

对于方法3,每个区域在本地写入数据库或某种存储,但希望每个区域中写入的某些数据的某些字段会相互同步,或者这些数据会同步到某个数据中心,以便于全局查询或附近的全数据查询。

此时,一个问题是主键的解决方案。在单个数据库上,数据库的自动增长列可以用来实现主键。但是,在这种情况下,简单地使用数据库的自动增长列会导致区域的标识之间的冲突,以及在相互同步数据时出现问题。当然,我们通常有以下解决方案:

1。使用全局唯一代码或其他类似UUID的字符串唯一代码:

优点:不再有冲突,不再关心同步。

缺点:主键从数字变为字符串的存储空间会更大,并且插入速度会受到一定程度的影响(索引不是从最后一个位置插入,而是从中间插入)

2。全球统一自动增长栏:

优势:存储空间保持不变,业务代码转换非常小

劣势:自动增长栏的获取成本高,系统延迟大,依赖单点自动增长分配。没有项目登陆。

3。每个区域都被划分为几个部分:例如,某个区域有0 ~ 5亿和5000 ~ 10亿

的优势:业务代码不需要任何修改。

缺点:划分区域后,会出现光线不足的问题。光线耗尽后,它将为后继者埋下深坑。继任者知道它可以改革,但如果他不知道,他将成为一潭死水。特别是,在一个系统多次易手后,许多人可能仍然清楚地记得这种坑。因此,该项目可以落地,但许多坑仍然存在。

我们正试图找到一种综合的方法,不埋坑,进行小企业转型,几乎不增加存储空间?

有一些方法。这个过程将会相对复杂。以下步骤将逐步完成。

第一步:因为这个部分的想法是让代码保持不变,我们仍然需要遵循这个部分的想法,但是它会稍微改变。遵循这一节的第一件事是:对于那些涉及这种自我增加的标识,程序不能只使用4字节的整型,而必须使用8字节的整型或长整型,否则这一节很容易被浪费。然后下一步是如何避免该部分的缺点,而不是埋坑。

步骤2:动态分段划分,即不再将某个区域划分为0 ~ 5亿、5000 ~ 10亿等。但争夺分部,具体步骤如下:

1。设置一个中心节点,该中心节点将自动主持和备份集群维护。中心节点维护一个序列中心。

2。每个区域一次取一个切片。每个区域可以根据其写入频率获取不同大小的切片。拾取碎片的方法可以通过乐观锁定机制来完成,首先读取,然后尝试拾取。例如,具有高并发性的可以一次获得1亿,而具有低并发性的可以获得100万。在每个区域取走片段后,它可以被放在一个局部序列表中,例如,1亿到1亿或1百万

4.例如,某个区域内的序列范围是:1亿-1亿、3亿-4亿和6亿-7亿。每个片段都有一个状态标识符:未使用、开始使用、一半使用、即将结束、用完等。如果不使用多个切片,它们将按顺序使用。

5。当使用最后一个切片并且使用新切片时(或者当使用第一个切片时),每个应用服务器确定数亿个切片的最大值已经突破并且不能再使用。此时,它获取下一个切片,并通过乐观锁定取出下一个切片中的一部分值(例如,将当前值更改为100)。此时,它将在短时间内强制写入一部分标识值。

6。当这些指定的标识值用完并插入数据时,可以省略标识并使用数据库中内置的自动增量。通常情况下,此时数据库将从最大值开始累加。当然,我们可以继续使用方法5。每台机器可以使用100、1000和的范围供自己使用,以实现指定的自我增值。然而,在应用程序重新启动的最坏情况下,这种方法会被浪费掉:服务器的数量*序列缓存的自我增量。

总之,方法是:在大范围和小范围内,您可以在强制指定某个标识后继续使用数据库的AUTO _ INVATION,或者您可以在该区域继续使用小范围获取方法来降低锁定粒度,在相同的锁定粒度条件下,您可以通过一些异步机制尽可能地将锁定概率降低到0。碎片征用示意图如下:

1。全局碎片化的范围很大,因此可以使用异步任务来完成碎片化的预处理,这样跨区域获取碎片化的时间就不会被添加到服务中,并且本地碎片化将始终被用于服务中。

2。同时,全局碎片锁定粒度几乎为0,因为对碎片的适应速度因地区而异。

3。根据服务的并发性,可以在不同的步骤中在每个区域内申请多个服务器。根据服务操作的随机性,同时发出锁的概率将大大降低。本地切片的征用也可以通过缓存来完成,如Redis。

友情链接:
海安新闻网 版权所有© www.damugemaoyi.com 技术支持:海安新闻网 | 网站地图