本發明涉及計算機技術領域,具體涉及一種防止Mongos集群中的均衡操作失效的方法和裝置。
背景技術:
數據庫是按照數據結構來組織、存儲和管理數據的倉庫。隨著用戶對數據存儲和管理的需求,出現各種數據庫,例如,Mysql數據庫、Oracle數據庫、MongoDB數據庫等。通常數據存儲采用的是主從式數據庫集群進行存儲,但是,這種存儲方式局限于數據庫集群中各數據庫的存儲空間,無法滿足數據量的迅速累積。所以,在數據庫集群中可以引入Mongos的架構方式。Mongos是一種分布式存儲的數據庫架構,適合巨量數據的存儲。Mongos架構中包括若干個路由節點、若干個分片節點以及若干元數據節點。其中,路由節點用于將業務方的需求指向相應的分片中,元數據中記錄所存儲的數據在各分片中位置,分片節點用于存儲大量的數據。每個分片中又分成若干個數據塊(也可稱chunck或桶),當用戶進行數據查詢時,可通過元數據節點中相應數據的存儲位置進行相應數據的查詢。當面對巨量的數據存儲需求時,可以通過增加分片的形式進行整個數據庫集群的擴充。
當Mongos架構的數據庫進行數據寫入的時候,不排除會出現大量數據存儲在同一個分片中,而其他分片中的數據量很少的情況,為了避免這種情況出現,Mongos架構中會有一個數據均衡的功能,將存儲數據較多的分片中的數據挪出一部分存儲到其它相對空閑的分片中,達到所有分片中的數據量均衡的效果。也就是說,當不同分片中的數據量的差距到達一定程度的時候,Mongos就會啟動數據均衡器,進行數據的均衡處理,盡量保證每個分片中的數據量一致。例如,有5個分片,每個分片中的最大存儲量為10個數據塊(桶),其中分片1中的數據已經達到9個數據塊的量,而其他4個分片中,都只有4個數據塊的數據量,那么數據均衡器就會啟動,就將分片1中的4個數據塊的數據量分別挪到其它4個分片中,最終使得每個分片中都有5個數據塊的數據量。
但是,當基于已經選定的數據分片模型進行大量的數據寫入時可能存在某些數據塊(稱為chunck或桶)的數據量超過數據塊的存儲空間的大小或單個數據塊最大存儲記錄條數(例如,250000條),而大量這樣的數據塊是無法由mongos自帶均衡機制進行拆分遷移從而導致該分片類似的數據塊里數據量持續增長,最終使得分片數據極其不均衡而影響數據庫集群的性能,進而影響業務的穩定性。
技術實現要素:
鑒于上述問題,提出了本發明以便提供一種克服上述問題或者至少部分地解決上述問題的防止Mongos集群中的均衡操作失效的方法和相應的裝置。
依據本發明的一個方面,提供了一種防止Mongos集群中的均衡操作失效的方法,包括:
掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據;
對于掃描到的數據塊,判斷該數據塊中已存儲的數據是否達到了預設閾值;
對于已存儲數據達到了預設閾值的一個當前數據塊,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;
啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。
可選地,掃描Mongos集群中的各分片中的各數據塊包括:
掃描Mongos集群中的所有分片中各數據庫和數據表對應各數據塊。
可選地,所述判斷該數據塊中已存儲的數據是否達到了預設閾值包括:
判斷該數據塊中已存儲的總數據量大小是否達到了第一預設閾值,或者,該數據塊中已存儲的記錄條數是否達到了第二預設閾值。
可選地,所述在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊包括:
在該當前數據塊所在分片中新建一個或多個數據塊,將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中;
可選地,所述將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中包括:
先計算當前數據塊中的每條數據的哈希值,并將哈希值按照大小順序排列;
按照大小排列的哈希值中設置相應個數的節點將哈希值分為多組;
將所述多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊;
對于新建的一個或多個數據塊中的每個數據塊,將其對應的一組哈希值在當前數據塊中的對應數據遷移到該數據塊中。
可選地,所述將該數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中包括:
所述將該數據塊所在分片中的超過該分片的額定數據塊數量的隨機的一個或多個數據塊的數據遷移到其他的分片中。
可選地,在啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中之后,該方法進一步包括:
將數據已遷移到其他分片的所述一個或多個數據塊刪除。
可選地,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊之前,該方法進一步包括:
關閉Mongos集群中的均衡操作。
根據本發明的另一方面,提供了一種防止Mongos集群中的均衡操作失效的裝置,包括:
數據塊掃描單元,適于掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據;對于掃描到的數據塊,判斷該數據塊中已存儲的數據是否達到了預設閾值;
數據塊拆分單元,適于對于已存儲數據達到了預設閾值的一個當前數據塊,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。
可選地,所述數據塊掃描單元,適于掃描Mongos集群中的所有分片中各數據庫和數據表對應各數據塊。
可選地,所述數據塊掃描單元,適于判斷該數據塊中已存儲的總數據量大小是否達到了第一預設閾值,或者,該數據塊中已存儲的記錄條數是否達到了第二預設閾值。
可選地,所述數據塊拆分單元,適于在該當前數據塊所在分片中新建一個或多個數據塊,將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中。
可選地,所述數據塊拆分單元,適于先計算當前數據塊中的每條數據的哈希值,并將哈希值按照大小順序排列;按照大小排列的哈希值中設置相應個數的節點將哈希值分為多組;將所述多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊;對于新建的一個或多個數據塊中的每個數據塊,將其對應的一組哈希值在當前數據塊中的對應數據遷移到該數據塊中。
可選地,所述數據塊拆分單元,適于所述將該數據塊所在分片中的超過該分片的額定數據塊數量的隨機的一個或多個數據塊的數據遷移到其他的分片中。
可選地,所述數據塊拆分單元,適于在啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中之后,進一步將數據已遷移到其他分片的所述一個或多個數據塊刪除。
可選地,所述數據塊拆分單元,適于在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊之前,進一步關閉Mongos集群中的均衡操作。
根據本發明的技術方案,當Mongos集群中的分片中的數據塊的數據達到了預設閾值的情況下,為保證數據均衡有效,首先將該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;然后再啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中,防止了因數據塊中的數據超過預設閾值而引起的均衡操作失效。可見,本發明可以有效防止Mongos集群中的均衡操作失效,保證Mongos集群中各分片的數據均衡,提高數據庫集群的效率,保障業務的穩定性。
上述說明僅是本發明技術方案的概述,為了能夠更清楚了解本發明的技術手段,而可依照說明書的內容予以實施,并且為了讓本發明的上述和其它目的、特征和優點能夠更明顯易懂,以下特舉本發明的具體實施方式。
附圖說明
通過閱讀下文優選實施方式的詳細描述,各種其他的優點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優選實施方式的目的,而并不認為是對本發明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了根據本發明一個實施例的一種防止Mongos集群中的均衡操作失效的方法的流程示意圖;
圖2示出了根據本發明一個實施例的一種防止Mongos集群中的均衡操作失效的裝置的結構示意圖。
具體實施方式
下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠將本公開的范圍完整的傳達給本領域的技術人員。
圖1示出了根據本發明一個實施例的一種防止Mongos集群中的均衡操作失效的方法的流程示意圖。如圖1所示,該方法包括:
步驟S110,掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據。
Mongos集群中的數據存儲在各個分片中,且每個分片中的數據都分別存放在分片中的各個數據塊中,這里的數據塊可以稱之為“chunck或桶”。一旦,分片的一個數據塊中的數據存儲太多,都會引起相應的均衡操作的失效,所以為了防止均衡操作失效的存在,需要掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據。
步驟S120,對于掃描到的數據塊,判斷該數據塊中已存儲的數據是否達到了預設閾值。
這里的預設閾值可以根據數據塊中的數據占有的空間資源的大小來設定,例如、64MB;也可以根據數據塊中的數據的總條數來設定,例如,25萬條。該設定的預設閾值是判斷均很失效的一個臨界值,當數據量超過預設閾值后,就可能會引起均衡操作的失效。
步驟S130,對于已存儲數據達到了預設閾值的一個當前數據塊,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊。
當判斷一個數據塊中的數據已經達到預設閾值后,就在數據塊所在的分片中,將該數據塊拆分成一個或多個數據塊,使拆分后的數據塊的數據均小于預設閾值,這樣就可以防止均衡操作的失效。
步驟S140中,啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。
雖然將數據塊中的數據進行了拆分,為了保證各個分片中的數據均衡,還需要啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。因為當前數據塊已經被拆分成一個或者多個數據塊,拆分后的數據塊和該分片中的數據塊的地位等同,所以在進行數據遷移的時候,可以將拆分后的數據塊遷移到其他的分片中,也可以在該分片中隨機選擇數據塊進行遷移,也就是說,遷移的數據塊不一定是拆分出來的數據塊。
可見,本發明將該數據超過預設閾值的數據塊在所在分片中將其拆分為一個或多個數據塊,可以有效防止Mongos集群中的均衡操作失效,保證Mongos集群中各分片的數據均衡,提高數據庫集群的效率,保障業務的穩定性。
Mongos集群中的所有分片是用來存儲數據,也是以數據庫和數據表的形式存儲的,所以,在本發明的一個實施例中,步驟S110中的掃描Mongos集群中的各分片中的各數據塊包括:掃描Mongos集群中的所有分片中各數據庫和數據表對應各數據塊,遍歷所有的數據庫和數據表所對應的數據塊,然后進行數據量的判斷。
在本發明的一個實施例中,步驟S120中的判斷該數據塊中已存儲的數據是否達到了預設閾值包括:判斷該數據塊中已存儲的總數據量大小是否達到了第一預設閾值,或者,該數據塊中已存儲的記錄條數是否達到了第二預設閾值。
也就是說,可以通過數據塊中已存儲的數據量大小進行判斷,例如,第一預設閾值為64MB,當一個數據塊中的數據大小超過64MB,就可以進行拆分數據塊的操作。也可以通過數據塊中以存儲的數據的條數進行判斷;例如,第二預設閾值為25萬條,當當一個數據塊中的數據記錄條數超過25萬條,就可以進行拆分數據塊的操作。
需要說明的是,這里利用該數據塊中已存儲的總數據量大小判斷其是否達到了第一預設閾值以及利用該數據塊中已存儲的記錄條數判斷是否達到了第二預設閾值,是本發明的一個實施例,具體的判斷依據在本發明中不作具體的限定。
為了保證拆分后的數據塊中的數據不會達到預設閾值,可以采取均分當前數據塊中的數據的方式,使得拆分后的每個數據塊中的數據量大致相同。在本發明的一個實施例中,步驟S130中的在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊包括:在該當前數據塊所在分片中新建一個或多個數據塊,將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中,使得該當前數據塊和新建的一個或多個數據塊中各數據塊的數據量大致相同。例如,當前數據塊數據量為30萬條,已經超過了預設閾值25萬條。在進行當前數據塊拆分的時候,在當前數據塊所在的分片中再新建1個數據塊,將當前數據塊中的15萬條數據分別遷移到新建的數據塊中,使得當前的數據塊和新建的數據塊的每個數據塊中均包括15萬條數據。
具體地,為了保證數據的均分,上述的將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中包括:
(1)先計算當前數據塊中的每條數據的哈希值,并將哈希值按照大小順序排列。
哈希算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。這里為了進行數據的均分,將每條數據對應的哈希值計算出來,然后根據哈希值的大小進行排序,按照排序的順序,將對應的數據進行均分。
(2)按照大小排列的哈希值中設置相應個數的節點將哈希值分為多組。
例如,總共有999條數據需要進行拆分成3組,那么哈希值排在第333位的是個節點,哈希值排在第666位的是個節點,將所有數據的哈希值進行大小排序后,排在第333位的哈希值是528,排在第666位的哈希值是941,那么小于或等于528的哈希值對應的數據被分到第一組,大于528小于或等于941的哈希值對應的數據被分到第二組,大于941的哈希值對應的數據被分到第三組。
(3)將多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊。
將哈希值分成多組后,把每組對應的哈希值相應的數據分配各當前數據塊和新建的一個或多個數據塊。
上述例子中,就可以將第一組哈希值對應的數據分配給當前數據塊,將第二組哈希值對應的數據分配給新建的數據塊1,將第三組哈希值對應的數據分配給新建的數據塊2。
(4)對于新建的一個或多個數據塊中的每個數據塊,將其對應的一組哈希值在當前數據塊中的對應數據遷移到該數據塊中。
因為哈希值是一個數據唯一且極其緊湊的數值表示形式,每個哈希值都對應一個數據,當將多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊后,再將每個數據塊中分配的哈希值相在當前數據庫中對應的數據遷移到該數據塊中就完成了數據的大致均等拆分。
在本發明的一個實施例中,步驟S140中的將該數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中包括:將該數據塊所在分片中的超過該分片的額定數據塊數量的隨機的一個或多個數據塊的數據遷移到其他的分片中。
當前數據塊已經被拆分成一個或者多個數據塊,拆分后的數據塊和該分片中的數據塊的地位等同,所以在進行數據遷移的時候,可以將拆分后的數據塊遷移到其他的分片中,也可以在該分片中隨機選擇數據塊進行遷移,也就是說,遷移的數據塊不一定是拆分出來的數據塊。
這里遷移的數據塊的數量是根據該分片拆分后的數據塊的總數量以及額定數量確定的,例如,當前分片的數據塊的額定數量是10個,但是拆分后的數據塊的總數量是12個,那么相比較額定數量10,多了2個,就需要將多余的2個進行遷移。
當前數據塊所在的分片中的一個或多個數據塊已經遷移到其他分片中,所以,在本發明的一個實施例中,在步驟S140中的啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中之后,該方法進一步包括:將數據已遷移到其他分片的一個或多個數據塊刪除,最終達到各分片的數據均衡。
在本發明的一個實施例中,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊之前,該方法進一步包括:關閉Mongos集群中的均衡操作。
進行當前數據塊拆分前一定要將Mongos集群中的均衡操作關閉,如果不進行關閉的話,對Mongos集群的分片的處理時會啟動加鎖操作,加鎖后的數據塊是不能隨意更改的,就無法完成數據塊的拆分操作。所以,Mongos集群中的均衡操作。拆分結束后,在開啟均衡操作,將數據塊進行自動均衡。
圖2示出了根據本發明一個實施例的一種防止Mongos集群中的均衡操作失效的裝置的結構示意圖。如圖2所示,該防止Mongos集群中的均衡操作失效的裝置200包括:
數據塊掃描單元210,適于掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據;對于掃描到的數據塊,判斷該數據塊中已存儲的數據是否達到了預設閾值。
Mongos集群中的數據存儲在各個分片中,且每個分片中的數據都分別存放在分片中的各個數據塊中,這里的數據塊可以稱之為“桶”。一旦,分片的一個數據塊中的數據存儲太多,都會引起相應的均衡操作的失效,所以為了防止均衡操作失效的存在,需要掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據。
這里的預設閾值可以根據數據塊中的數據占有的空間資源的大小來設定,例如、64MB;也可以根據數據塊中的數據的總條數來設定,例如,25萬條。該設定的預設閾值是判斷均很失效的一個臨界值,當數據量超過預設閾值后,就可能會引起均衡操作的失效。
數據塊拆分單元220,適于對于已存儲數據達到了預設閾值的一個當前數據塊,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。
當判斷一個數據塊中的數據已經達到預設閾值后,就在數據塊所在的分片中,將該數據塊拆分成一個或多個數據塊,使拆分后的數據塊的數據均小于預設閾值,這樣就可以防止均衡操作的失效。
雖然將數據塊中的數據進行了拆分,為了保證各個分片中的數據均衡,還需要啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。因為當前數據塊已經被拆分成一個或者多個數據塊,拆分后的數據塊和該分片中的數據塊的地位等同,所以在進行數據遷移的時候,可以將拆分后的數據塊遷移到其他的分片中,也可以在該分片中隨機選擇數據塊進行遷移,也就是說,遷移的數據塊不一定是拆分出來的數據塊。
可見,本發明將該數據超過預設閾值的數據塊在所在分片中將其拆分為一個或多個數據塊,可以有效防止Mongos集群中的均衡操作失效,保證Mongos集群中各分片的數據均衡,提高數據庫集群的效率,保障業務的穩定性。
Mongos集群中的所有分片是用來存儲數據,也是以數據庫和數據表的形式存儲的,所以,在本發明的一個實施例中,數據塊掃描單元210,適于掃描Mongos集群中的所有分片中各數據庫和數據表對應各數據塊,遍歷所有的數據庫和數據表所對應的數據塊,然后進行數據量的判斷。
在本發明的一個實施例中,數據塊掃描單元210,適于判斷該數據塊中已存儲的總數據量大小是否達到了第一預設閾值,或者,該數據塊中已存儲的記錄條數是否達到了第二預設閾值。
也就是說,可以通過數據塊中已存儲的數據量大小進行判斷,例如,第一預設閾值為64MB,當一個數據塊中的數據大小超過64MB,就可以進行拆分數據塊的操作。也可以通過數據塊中以存儲的數據的條數進行判斷;例如,第二預設閾值為25萬條,當當一個數據塊中的數據記錄條數超過25萬條,就可以進行拆分數據塊的操作。
需要說明的是,這里利用該數據塊中已存儲的總數據量大小判斷其是否達到了第一預設閾值以及利用該數據塊中已存儲的記錄條數判斷是否達到了第二預設閾值,是本發明的一個實施例,具體的判斷依據在本發明中不作具體的限定。
為了保證拆分后的數據塊中的數據不會達到預設閾值,可以采取均分當前數據塊中的數據的方式,使得拆分后的每個數據塊中的數據量大致相同。在本發明的一個實施例中,數據塊拆分單元220,適于在該當前數據塊所在分片中新建一個或多個數據塊,將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中,使得該當前數據塊和新建的一個或多個數據塊中各數據塊的數據量大致相同。例如,當前數據塊數據量為30萬條,已經超過了預設閾值25萬條。在進行當前數據塊拆分的時候,在當前數據塊所在的分片中再新建1個數據塊,將當前數據塊中的15條數據分別遷移到新建的這兩個數據塊中,使得當前的數據塊和新建的數據塊的每個數據塊中均包括15萬條數據。
具體地,為了保證數據的均分,數據塊拆分單元220適于:
(1)先計算當前數據塊中的每條數據的哈希值,并將哈希值按照大小順序排列。哈希算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。
哈希值是一段數據唯一且極其緊湊的數值表示形式。這里為了進行數據的均分,將每條數據對應的哈希值計算出來,然后根據哈希值的大小進行排序,按照排序的順序,將對應的數據進行均分。
(2)按照大小排列的哈希值中設置相應個數的節點將哈希值分為多組。
例如,總共有999條數據需要進行拆分成3組,那么哈希值排在第333位的是個節點,哈希值排在第666位的是個節點,將所有數據的哈希值進行大小排序后,排在第333位的哈希值是528,排在第666位的哈希值是941,那么小于或者等于528的哈希值對應的數據被分到第一組,大于528小于或等于941的哈希值對應的數據被分到第二組,大于941的哈希值對應的數據被分到第三組。
(3)將多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊。
將哈希值分成多組后,把每組對應的哈希值相應的數據分配各當前數據塊和新建的一個或多個數據塊。上述例子中,就可以將第一組哈希值對應的數據分配給當前數據塊,將第二組哈希值對應的數據分配給新建的數據塊1,將第三組哈希值對應的數據分配給新建的數據塊2。
(4)對于新建的一個或多個數據塊中的每個數據塊,將其對應的一組哈希值在當前數據塊中的對應數據遷移到該數據塊中。
因為哈希值是一個數據唯一且極其緊湊的數值表示形式,每個哈希值都對應一個數據,當將多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊后,再將每個數據塊中分配的哈希值相在當前數據庫中對應的數據遷移到該數據塊中就完成了數據的大致均等拆分。
在本發明的一個實施例中,數據塊拆分單元220,適于將該數據塊所在分片中的超過該分片的額定數據塊數量的隨機的一個或多個數據塊的數據遷移到其他的分片中。
當前數據塊已經被拆分成一個或者多個數據塊,拆分后的數據塊和該分片中的數據塊的地位等同,所以在進行數據遷移的時候,可以將拆分后的數據塊遷移到其他的分片中,也可以在該分片中隨機選擇數據塊進行遷移,也就是說,遷移的數據塊不一定是拆分出來的數據塊。
這里遷移的數據塊的數量是根據該分片拆分后的數據塊的總數量以及額定數量確定的,例如,當前分片的數據塊的額定數量是10個,但是拆分后的數據塊的總數量是12個,那么相比較額定數量10個數據塊,多了2個數據塊,就需要將多余的2個數據塊遷移到其它分片中。
當前數據塊所在的分片中的一個或多個數據塊已經遷移到其他分片中,所以,在本發明的一個實施例中,數據塊拆分單元220,適于在啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中之后,進一步將數據已遷移到其他分片的一個或多個數據塊刪除,最終達到各分片的數據均衡。
在本發明的一個實施例中,數據塊拆分單元220,適于在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊之前,進一步關閉Mongos集群中的均衡操作
進行當前數據塊拆分前一定要將Mongos集群中的均衡操作關閉,如果不進行關閉的話,對Mongos集群的分片的處理時會啟動加鎖操作,加鎖后的數據塊是不能隨意更改的,就無法完成數據塊的拆分操作。所以,Mongos集群中的均衡操作。拆分結束后,在開啟均衡操作,將數據塊進行自動均衡。
綜上所述,根據本發明的技術方案,當Mongos集群中的分片中的數據塊的數據達到了預設閾值的情況下,為保證數據均衡有效,首先將該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;然后再啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中,防止了因數據塊中的數據超過預設閾值而引起的均衡操作失效。可見,本發明可以有效防止Mongos集群中的均衡操作失效,保證Mongos集群中各分片的數據均衡,提高數據庫集群的效率,保障業務的穩定性。
需要說明的是:
在此提供的算法和顯示不與任何特定計算機、虛擬裝置或者其它設備固有相關。各種通用裝置也可以與基于在此的示教一起使用。根據上面的描述,構造這類裝置所要求的結構是顯而易見的。此外,本發明也不針對任何特定編程語言。應當明白,可以利用各種編程語言實現在此描述的本發明的內容,并且上面對特定語言所做的描述是為了披露本發明的最佳實施方式。
在此處所提供的說明書中,說明了大量具體細節。然而,能夠理解,本發明的實施例可以在沒有這些具體細節的情況下實踐。在一些實例中,并未詳細示出公知的方法、結構和技術,以便不模糊對本說明書的理解。
類似地,應當理解,為了精簡本公開并幫助理解各個發明方面中的一個或多個,在上面對本發明的示例性實施例的描述中,本發明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖:即所要求保護的本發明要求比在每個權利要求中所明確記載的特征更多的特征。更確切地說,如下面的權利要求書所反映的那樣,發明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權利要求書由此明確地并入該具體實施方式,其中每個權利要求本身都作為本發明的單獨實施例。
本領域那些技術人員可以理解,可以對實施例中的設備中的模塊進行自適應性地改變并且把它們設置在與該實施例不同的一個或多個設備中。可以把實施例中的模塊或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領域的技術人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發明的范圍之內并且形成不同的實施例。例如,在下面的權利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
本發明的各個部件實施例可以以硬件實現,或者以在一個或者多個處理器上運行的軟件模塊實現,或者以它們的組合實現。本領域的技術人員應當理解,可以在實踐中使用微處理器或者數字信號處理器(DSP)來實現根據本發明實施例的防止Mongos集群中的均衡操作失效的裝置中的一些或者全部部件的一些或者全部功能。本發明還可以實現為用于執行這里所描述的方法的一部分或者全部的設備或者裝置程序(例如,計算機程序和計算機程序產品)。這樣的實現本發明的程序可以存儲在計算機可讀介質上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網網站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應該注意的是上述實施例對本發明進行說明而不是對本發明進行限制,并且本領域技術人員在不脫離所附權利要求的范圍的情況下可設計出替換實施例。在權利要求中,不應將位于括號之間的任何參考符號構造成對權利要求的限制。單詞“包含”不排除存在未列在權利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現。在列舉了若干裝置的單元權利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。
本發明公開了A1、一種防止Mongos集群中的均衡操作失效的方法,包括:
掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據;
對于掃描到的數據塊,判斷該數據塊中已存儲的數據是否達到了預設閾值;
對于已存儲數據達到了預設閾值的一個當前數據塊,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;
啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。
A2、如A1所述的方法,其中,掃描Mongos集群中的各分片中的各數據塊包括:
掃描Mongos集群中的所有分片中各數據庫和數據表對應各數據塊。
A3、如A1所述的方法,其中,所述判斷該數據塊中已存儲的數據是否達到了預設閾值包括:
判斷該數據塊中已存儲的總數據量大小是否達到了第一預設閾值,或者,該數據塊中已存儲的記錄條數是否達到了第二預設閾值。
A4、如A1所述的方法,其中,所述在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊包括:
在該當前數據塊所在分片中新建一個或多個數據塊,將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中。
A5、如A4所述的方法,其中,所述將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中包括:
先計算當前數據塊中的每條數據的哈希值,并將哈希值按照大小順序排列;
按照大小排列的哈希值中設置相應個數的節點將哈希值分為多組;
將所述多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊;
對于新建的一個或多個數據塊中的每個數據塊,將其對應的一組哈希值在當前數據塊中的對應數據遷移到該數據塊中。
A6、如A1所述的方法,其中,所述將該數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中包括:
所述將該數據塊所在分片中的超過該分片的額定數據塊數量的隨機的一個或多個數據塊的數據遷移到其他的分片中。
A7、如A1所述的方法,其中,在啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中之后,該方法進一步包括:
將數據已遷移到其他分片的所述一個或多個數據塊刪除。
A8、如A1所述的方法,其中,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊之前,該方法進一步包括:
關閉Mongos集群中的均衡操作。
本發明還公開了B9、一種防止Mongos集群中的均衡操作失效的裝置,包括:
數據塊掃描單元,適于掃描Mongos集群中的各分片中的各數據塊,查看數據塊中的已存儲數據;對于掃描到的數據塊,判斷該數據塊中已存儲的數據是否達到了預設閾值;
數據塊拆分單元,適于對于已存儲數據達到了預設閾值的一個當前數據塊,在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊;啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中。
B10、如B9所述的裝置,其中,
所述數據塊掃描單元,適于掃描Mongos集群中的所有分片中各數據庫和數據表對應各數據塊。
B11、如B9所述的裝置,其中,
所述數據塊掃描單元,適于判斷該數據塊中已存儲的總數據量大小是否達到了第一預設閾值,或者,該數據塊中已存儲的記錄條數是否達到了第二預設閾值。
B12、如B9所述的裝置,其中,
所述數據塊拆分單元,適于在該當前數據塊所在分片中新建一個或多個數據塊,將該當前數據塊中的部分數據遷移到新建的一個或多個數據塊中。
B13、如B12所述的裝置,其中,
所述數據塊拆分單元,適于先計算當前數據塊中的每條數據的哈希值,并將哈希值按照大小順序排列;按照大小排列的哈希值中設置相應個數的節點將哈希值分為多組;將所述多組哈希值一一對應地分配給當前數據塊和新建的一個或多個數據塊;對于新建的一個或多個數據塊中的每個數據塊,將其對應的一組哈希值在當前數據塊中的對應數據遷移到該數據塊中。
B14、如B9所述的裝置,其中,
所述數據塊拆分單元,適于所述將該數據塊所在分片中的超過該分片的額定數據塊數量的隨機的一個或多個數據塊的數據遷移到其他的分片中。
B15、如B9所述的裝置,其中,
所述數據塊拆分單元,適于在啟動Mongos集群中的均衡操作,將當前數據塊所在分片中的一個或多個數據塊的數據遷移到其他的分片中之后,進一步將數據已遷移到其他分片的所述一個或多個數據塊刪除。
B16、如B9所述的裝置,其中,
所述數據塊拆分單元,適于在該當前數據塊所在分片中將該當前數據塊拆分為一個或多個數據塊之前,進一步關閉Mongos集群中的均衡操作。