一种数据库更改写入分区的方法及装置技术领域
本发明涉及数据处理领域,特别是涉及一种数据库更改写入分区的方
法及装置。
背景技术
在MongoDB数据库的分片集群中,片键决定了每条数据应该被写入到
集群中的哪个分片上,各个分片之间通过数据块的移动达到分片负载的均
衡,因此在设置分片时,需要从数据集合中选取一个键,用该键作为数据
拆分的依据,这个键就是片键。片键的选择非常重要,MongoDB会根据选定
的片键将数据划分到有着相同片键的数据块中,而后这些数据块将根据片
键的大致顺序分散到分片中。然而,当数据写入的负载较大且选择了单调
递增片键如时间单调递增片键时,新的数据只会写入到时间最新的一个数
据块中得到信息量巨大的数据块,导致数据的不平均分布。由于数据写入
的负载较高,MongoDB在各个分片中移动数据块的速度远远无法跟上数据的
写入速度,而且一旦数据块的信息量大小超过一定数值,那么就无法在分
片之间对其进行移动,从而使得大量数据堆积在一个分片上,导致硬盘的
容量迅速达到极限。
发明内容
有鉴于此,本发明提出了一种数据库更改写入分区的方法及装置,主
要目的在于解决在数据库分片集群中选取单调递增片键进行分区时导致数
据分片不均衡的问题。
依据本发明的第一个方面,本发明提供了一种数据库更改写入分区的
方法,包括:
获取数据库当前分片中最新数据块的时间片键范围,最新数据块为当
前写入数据的数据块;
在最新数据块的时间片键范围内确定预分裂时间点;
将最新数据块在预分裂时间点进行分裂,生成两个子数据块;
将以预分裂时间点为时间片键范围起点的子数据块移动到另一分片
中。
依据本发明的第二个方面,本发明提供了一种数据库更改写入分区的
装置,包括:
获取单元,用于获取数据库当前分片中最新数据块的时间片键范围,
最新数据块为当前写入数据的数据块;
确定单元,用于在获取单元获取的最新数据块的时间片键范围内确定
预分裂时间点;
分裂单元,用于将最新数据块在选择单元选择的预分裂时间点进行分
裂,生成两个子数据块;
移动单元,用于将分裂单元生成的以预分裂时间点为时间片键范围起
点的子数据块移动到另一分片中。
借由上述技术方案,本发明实施例提供的数据库更改写入分区的方法
及装置,能够获取数据库当前分片中最新数据块的时间片键范围,并在该
时间片键范围内确定预分裂时间点,将所述最新数据块在预分裂时间点进
行分裂,生成两个子数据块,其中以预分裂时间点为时间片键范围起点的
子数据块由于还未插入数据,因此将其移动到另一分片中,当实际时间到
达预分裂时间点后,新的数据会自动写入到被移动的子数据块所在的新的
分片中,从而避免了由于分裂前的最新数据块写入数据的速度高于数据块
自动分裂和移动的速度导致当前分片的容量过高,确保了数据在数据库分
片集群中的均衡分布。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的
技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和
其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于
本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目
的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符
号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种数据库更改写入分区的方法的流
程图;
图2示出了本发明实施例提供的一种数据库更改写入分区的装置的结
构示意图;
图3示出了本发明实施例提供的另一种数据库更改写入分区的装置的
结构示意图。
具体实施方式
下面将参照附图更加详细地描述本公开的示例性实施例。虽然附图中
显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公
开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够
更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技
术人员。
在使用数据库的业务中,随着业务的发展,产生的数据量也越来越大,
因此基于数据分片的数据库构架应运而生。数据分片就是将整体数据分摊
在多个存储设备上,这样每个存储设备的数据量相对变小,从而满足数据
库性能需求。在设置分片时,需要从数据集合中选取一个键,用该键作为
数据拆分的依据,这个键被称为片键。最初在数据库中插入数据时,数据
会被插入到一个分片中的数据块中,随着数据块的数据量逐渐增大,该分
片的负载逐渐增高,在这种情况下,数据库通常会自动将该数据块已写入
数据的部分分裂出去并移动到其他分片中,从而保证各个分片的数据分布
均衡。
在本发明实施例中,由于采用时间单调递增片键作为数据拆分的依据,
这样会导致数据一直被写入到最新的分片中,同时如果数据的写入负载过
高,在各个分片间移动数据块的速度远远无法跟上数据的写入速度时,会
导致当前分片的数据量增大,而且一旦数据块的信息量大小超过一定数值,
那么就无法在分片之间对其进行移动,从而使得大量数据堆积在一个分片
上,导致硬盘的容量迅速达到极限。
为了解决在数据库分片集群中选取单调递增片键进行分区时导致数据
分片不均衡的问题,本发明实施例提供了一种数据库更改写入分区的方法,
如图1所示,该方法包括:
101、获取数据库当前分片中最新数据块的时间片键范围。
由于数据是被写入数据块中的,每个数据块所包含的数据范围是按照
片键的取值来划分的,若对数据库进行分区,就需要对数据块进行操作。
因此在本发明实施例中,需要执行步骤101获取数据库当前分片中最新数
据块的时间片键范围,当前分片为数据库分片集群中当前正在写入数据的
分片,其中,当前分片中最新数据块的时间片键范围为该分片中当前正在
写入数据的数据块的时间片键范围。
102、在最新数据块的时间片键范围内确定预分裂时间点。
当获取到最新数据块的时间片键范围后,为了防止最新数据块自动分裂
和移动的速度慢于数据写入速度导致的当前分片负载过高情况的发生,因
此本发明实施例需要提前对最新数据块中未写入数据的部分进行分裂,得
到未写入数据的空数据块,进行分裂的前提是需要知道分裂的节点,因此
本发明实施例需要执行步骤102在最新数据块的时间片键范围内确定预分
裂时间点。这里需要说明的是,选择的该预分裂时间点一定要确保在该预
分裂时间点之后的数据块未被写入数据,也就是该预分裂时间点之后的数
据块为空数据块。
103、将最新数据块在预分裂时间点进行分裂,生成两个子数据块。
当在步骤102中得到最新数据块的预分裂时间点后,需要在该预分裂
时间点将最新数据块进行分裂操作,生成两个子数据块,其中一个子数据
块为空数据块,未被写入数据,另一个子数据块为分裂前最新数据块中已
写入数据的部分,将继续写入数据。
104、将以预分裂时间点为时间片键范围起点的子数据块移动到另一分
片中。
当最新数据块在预分裂时间点被分裂后,需要将未被写入数据的子数
据块,也就是以预分裂时间点为时间片键范围起点的子数据块移动到另一
分片中,当系统时间到达预分裂时间点后,新的数据会被自动写入到以预
分裂时间点为时间片键范围起点的子数据块所在的分片中,从而保证分裂
前的最新数据块所在的分片的负载不会超过极限。
本发明实施例提供的数据库更改写入分区的方法,能够获取数据库当
前分片中最新数据块的时间片键范围,并在该时间片键范围内确定预分裂
时间点,将所述最新数据块在预分裂时间点进行分裂,生成两个子数据块,
其中以预分裂时间点为时间片键范围起点的子数据块由于还未插入数据,
因此将其移动到另一分片中,当实际时间到达预分裂时间点后,新的数据
会自动写入到被移动的子数据块所在的新的分片中,从而避免了由于分裂
前的最新数据块写入数据的速度高于数据块自动分裂和移动的速度导致当
前分片的容量过高,确保了数据在数据库分片集群中的均衡分布。
进一步的,为了更好的对上述图1所示的方法进行理解,作为对上述
实施方式的细化和扩展,本发明实施例将针对图1中的步骤进行详细说明。
在本发明实施例中以时间单调递增片键为例,数据库分片集群中当前
分片的最新数据块也就是当前被写入数据的数据块,例如当前被写入数据
的数据块为最新数据块M,其时间片键范围为[Tm,T∞),则获取数据库当前
分片中最新数据块的时间片键范围为[Tm,T∞)。
由于时间片键位于[Tm,T∞)内的数据都被写入该最新数据块M中,因
此随着时间的推移,该最新数据块M的容量为越来越大,导致其所在分片
的容量逐渐接近极限。为了避免上述问题的发生,现有技术中数据库提供
了自动拆分数据块的功能,将数据块中已经写入数据的部分拆分出来并移
动到其他分片中,从而防止当前分片的容量达到极限。但是数据库提供的
自动拆分数据块的功能并不能拆分并移动数据块中未写入数据的部分,因
此当数据写入该最新数据块M的速度远大于数据库自动拆分该最新数据块M
并将拆分后的数据块移动到其他分片中的速度时,该分片的容量将迅速达
到极限。为了解决上述问题,本发明实施例需要将该最新数据块M中未写
入数据的部分提前进行拆分,获取该最新数据块M中未写入数据的部分并
将其进行移动,从而保证当前分片的容量不会达到极限。
作为一种可选的实施方式,本发明实施例会实时监控数据库分片集群
中当前分片的数据量,当当前分片的数据量大于预设阈值时,会获取当前
分片中最新数据块M的时间片键范围[Tm,T∞),并在该时间片键范围内确
定预分裂时间点,从而将最新数据块M在预分裂时间点进行拆分。
由于本发明实施例的关键在于拆分并移动最新数据块中未写入数据的
部分,因此在最新数据块M的时间片键范围[Tm,T∞)内确定的预分裂时间
点必须能够将该最新数据块M分裂为两个部分,其中一部分从未写入数据。
作为一种可选的实施方式,本发明实施例可以将当前时间点Tnow之后的一个
时间点Tfuture确定为预分裂时间点。由于在当前时间点Tnow处,数据写入状
态只有两种,一种为正在写入数据,一种为未写入数据,如果在当前时间
点Tnow处对最新数据块M进行分裂,则很有可能被正在写入数据的情况所干
扰,导致无法正确对最新数据块M进行分裂。而在当前时间点Tnow之后的时
间点Tfuture处的数据写入状态只有一种情况,即未写入数据状态。因此在时
间点Tfuture处一定能够将最新数据块M进行分裂得到未写入数据的部分。
当在最新数据块M的时间片键范围[Tm,T∞)内确定预分裂时间点Tfuture
后,就可以在预分裂时间点Tfuture处将最新数据块M进行分裂,由于数据库
无法对空数据块也就是数据块中未写入数据的部分进行自动分裂,因此,
本发明实施例提供了一种可选的实施方式,由数据库基于分裂操作指令的
触发将最新数据块M在预分裂时间点Tfuture处进行分裂。在具体实施过程中,
可以使用sp l it命令在预分裂时间点Tfuture处将最新数据块M进行分裂,生
成两个子数据块,子数据块A和子数据块B。其中,两个子数据块具有各自
新的时间片键范围,若子数据块B为未写入数据的部分,那么子数据块B
的时间片键范围为[Tfuture,T∞),以预分裂时间点Tfuture和分裂前的最新数据
块M的时间片键范围的终点T∞作为自身时间片键范围的起点和终点;子数
据块A的时间片键范围为[Tm,Tfuture),以分裂前的最新数据块M的时间片键
范围的起点Tm和预分裂时间点Tfuture作为自身时间片键范围的起点和终点。
当将最新数据块M在预分裂时间点Tfuture处进行分裂得到未写入数据的
子数据块B后,需要将子数据块B移动到另一分片中,从而避免分裂前最
新数据块M所在分片的容量达到极限。由于数据库无法对分裂后得到的空
数据块也就是数据块中未写入数据的部分进行自动迁移,因此,本发明实
施例提供了一种可选的实施方式,由数据库基于移动操作指令的触发将以
预分裂时间点Tfuture为时间片键范围起点的子数据块B移动到另一分片中。
在具体实施过程中,可以使用moveChunk命令来迁移子数据块B,将其移动
到另一分片中。当将子数据块B移动到另一分片中后,若实际时间在到达
预分裂时间点Tfuture之前,新的数据会被数据库继续自动写入子数据块A所
在的分片中;若实际时间到达预分裂时间点Tfuture之后,新的数据会被数据
库自动写入子数据块B所在的分片中,从而避免分裂前最新数据块M所在
分片的容量达到极限。
本发明实施例通过监控数据库分片集群中当前分片的数据量,当当前
分片的数据量大于预设阈值时,触发对最新数据块的预分裂和迁移,从而
避免最新数据块所在分片的容量达到极限。此外,通过多次在未来时间点
触发数据块的分裂和迁移操作,能够均衡的在数据库分片集群中分布写入
的数据。
作为对上述图1所示方法的应用,本发明实施例提供了一种数据库更
改写入分区的装置,如图2所示,该装置包括:获取单元21、确定单元22、
分裂单元23及移动单元24,其中,
获取单元21,用于获取数据库当前分片中最新数据块的时间片键范围,
最新数据块为当前写入数据的数据块;
确定单元22,用于在获取单元21获取的最新数据块的时间片键范围内
确定预分裂时间点;
分裂单元23,用于将最新数据块在确定单元22确定的预分裂时间点进
行分裂,生成两个子数据块;
移动单元24,用于将分裂单元23生成的以预分裂时间点为时间片键范
围起点的子数据块移动到另一分片中。
进一步的,如图3所示,获取单元21包括:
监控模块211,用于监控数据库分片集群中当前分片的数据量;
获取模块212,用于当当前分片的数据量大于预设阈值时,获取当前分
片中最新数据块的时间片键范围。
进一步的,确定单元22用于在最新数据块的时间片键范围内,将当前
时间点之后的任一个时间点确定为预分裂时间点。
进一步的,分裂单元23用于基于分裂操作指令的触发将最新数据块在
预分裂时间点进行分裂。
进一步的,移动单元24用于基于移动操作指令的触发将以预分裂时间
点为时间片键范围起点的子数据块移动到另一分片中。
本发明实施例提供的数据库更改写入分区的装置,能够获取数据库当
前分片中最新数据块的时间片键范围,并在该时间片键范围内确定预分裂
时间点,将所述最新数据块在预分裂时间点进行分裂,生成两个子数据块,
其中以预分裂时间点为时间片键范围起点的子数据块由于还未插入数据,
因此将其移动到另一分片中,当实际时间到达预分裂时间点后,新的数据
会自动写入到被移动的子数据块所在的新的分片中,从而避免了由于分裂
前的最新数据块写入数据的速度高于数据块自动分裂和移动的速度导致当
前分片的容量过高,确保了数据在数据库分片集群中的均衡分布。
此外,本发明实施例通过实时监控数据库分片集群中当前分片的数据
量,当当前分片的数据量大于预设阈值时,触发对最新数据块的预分裂和
迁移,从而避免最新数据块所在分片的容量达到极限。同时,通过多次在
未来时间点触发数据块的分裂和迁移操作,能够均衡的在数据库分片集群
中分布写入的数据。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没
有详述的部分,可以参见其他实施例的相关描述。
可以理解的是,上述方法及装置中的相关特征可以相互参考。另外,
上述实施例中的“第一”、“第二”等是用于区分各实施例,而并不代表
各实施例的优劣。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述
描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的
对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备
固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的
描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对
任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本
发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实
施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,
本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,
并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一
个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征
有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将
该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个
权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要
求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。
因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,
其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行
自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。
可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及
此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或
过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明
书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开
的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本
说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提
供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括
其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征
的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下
面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合
方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处
理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员
应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现
根据本发明实施例的发明名称(如确定网站内链接等级的装置)中的一些
或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所
描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和
计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质
上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网
站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限
制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出
替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成
对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或
步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。
本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算
机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可
以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用
不表示任何顺序。可将这些单词解释为名称。