一種MongoDB負載均衡優化方法
【技術領域】
[0001] 本文屬于數據庫性能優化領域,具體設及一種MongoDB負載均衡優化方法。
【背景技術】
[0002] 隨著互聯網Web 2.0網站的興起,傳統的關系型數據庫在應付Web 2.0網站,特別 是超大規模和高并發的SNS類型的Web 2. 0純動態網站時已經顯得力不從屯、,暴露了很多 難W克服的問題,例如對數據庫高并發讀寫的問題、對海量數據的高效率存儲和訪問的問 題,W及數據庫的高擴展性和高可用性的問題。
[0003] 為了應對W上問題,非關系性數據庫NoSQUNot化Iy SQL是一種新型的數據庫 方面的革命)應運而生,它通過降低關系型數據庫的數據庫事務一致性、寫實時性讀實時 性,W及弱化復雜的S化查詢功能來解決Web 2. 0網站建設中遇到的問題。其中MongoDB 就是其中一個典型的代表。MongoDB是一個開源的,基于分布式的,面向文檔存儲的非關系 型數據庫。是非關系型數據庫當中功能最豐富、最像關系數據庫的,它的特點是高性能、易 部署、易使用,存儲數據非常方便,擴展能力強。 陽004]在MongoDB中,提供一種名為Auto-Siareding,即自動分片的機制來實現數據庫 的水平擴展(水平擴展,是指通過加入更多的服務器運行數據,從而提供更多的存儲空間 或者更高的運算性能)。與其它數據庫不同,水平擴展的全部的過程都會由MongoDB自動地 完成,不需要人工操作,并且當各個分片(分片,是指將數據拆分成特定大小的塊,然后將 其分布到多個服務器中)中的數據分布不均衡時,自動完成數據的重分布,通過將數據分 布到多個服務器上,運樣就不再需要高性能主機來存儲海量數據,承受高壓負載。
[0005] 目前MongoDB的Auto-Shareding機制是靠一個balancer的模塊來實現數據在各 個服務器上的轉移W及均勻分布,它是一個在后臺運行的任務,當任意兩個服務器中的數 據塊的數量的差值達到系統設定的最高闊值時,balancer就會將數據塊從數據塊多的服務 器移動到數據塊少的服務器上,直到數量之差達到最低闊值。
[0006] 但是通過研究可W知道balancer內在的算法僅僅依據各個服務器上數據塊的總 量來實現數據塊在各個服務器上的負載均衡。運種算法可W使得數據庫的移動量最小,但 是選取的數據塊都是塊鍵(每個數據庫的唯一標識,是個數字)最小的。并沒有將實際使用 情況考慮進去,因為各個數據塊的使用情況大有不同,有的基本不會訪問,有的查詢量大, 有的修改量大,使得各個服務器的負責并不能有效的均衡。
【發明內容】
[0007] 本發明的目的在于克服現有技術中MongoDB在自動分片機制上的不足,提供一種 將數據塊的CRUD負載考慮進去,根據數據庫的實際使用情況,依據各個數據塊讀寫頻率, 動態地進行負載均衡,W達到優化數據庫性能的目的的MongoDB負載均衡優化方法。
[0008] 本發明的目的是通過W下技術方案來實現的:一種MongoDB負載均衡優化方法, 包括W下步驟:
[0009] SI、計算每兩個服務器內數據塊總數的差值;
[0010] S2、判斷任意兩個服務器內數據塊總數的差值是否大于或等于系統預先設定的最 大闊值,若是則將該組兩個服務器中包含數據塊多的服務器定為數據塊移動源,包含數據 塊少的服務器定為數據塊移動目標,否則不操作;
[0011] S3、分別計算數據塊移動源和數據塊移動目標內的平均數據塊操作量;
[0012] S4、比較數據塊移動源和數據塊移動目標內的平均數據塊操作量大小,如果數據 塊移動源內平均數據塊操作量大于數據塊移動目標內平均數據塊操作量,則從數據塊移動 源中選取數據塊操作量最大的數據塊移動到數據塊移動目標中;如果數據塊移動源內平均 數據塊操作量小于或等于數據塊移動目標內平均數據塊操作量,則從數據塊移動源中選取 數據塊操作量最小的數據塊移動到數據塊移動目標中;
[0013] S5、重復步驟Sl~S4,直到任意兩個服務器內數據塊總數的差值小于系統預先設 定的最小闊值時,完成負載均衡。
[0014] 進一步地,所述的步驟S3包括W下子步驟:
[0015] S31、在MongoDB中建立CRUD性能測試集,并計算出系統的運行各個操作的性能參 數;
[0016] S32、修改MongoDB的configserver中記錄數據塊參數的數據結構,增加 W下變量:數據塊插入操作的次數operateC、數據塊查詢操作的次數operateR、數據 塊更新操作的次數operate!]、數據塊刪除操作的次數operateD和數據塊操作量變量 dat油IockWei曲t,對數據塊的每一次操作都在相對應的變量上進行加一操作;
[0017]S33、根據步驟Sl和S2中的參數計算每個數據塊操作量并保存到變量 dat油IockWei曲t中,計算服務器內所有數據塊操作量總和W及服務器內的平均數據塊操 作量。
[0018] 進一步地,所述的步驟S31具體實現方法為:從數據庫中選擇插入、刪除、修改W 及查找測試語句各5000條,分別記錄在4個語句腳本中;再建立一個定時執行shell腳本, 分別記錄下4個語句腳本的執行時間作為性能參數;所述的性能參數包括:插入操作性能 參數Tc、刪除操作性能參數Td、修改操作性能參數Tu和查詢操作性能參數TK。
[0019] 進一步地,所述的步驟S33具體包括W下子步驟:
[0020] S331、設一個服務器上有n個數據塊,用KiQ《i《n)表示,服務器上所有數據 塊操作次數之和用0。表示,每個數據塊總的操作次數用0 1表示,則: 化 陽OW 0。=芝^0, 1=1
[0022] 將步驟S32得到的參數帶入上式,得到: 打町打 n 打
[0023] =芝 之Qji= ^ 0。+S〇說 +S〇化^。。;1 :{c'、r',U、江} i=l >=1 i=lj=l'
[0024] 其中,0"、〇Ki、化1、〇Di分別表示第i塊數據塊插入操作的次數operateC、查詢操作 的次數operateR、更新操作的次數operate!]、刪除操作的次數operateD;
[00巧]S332、計算第i塊數據塊操作量DWi:
[0026] DW, = ^ 0|巧 '二 0。。+ 〇wTr+O…Tu+O防T〇. ]=ftNf:>Us;d}
[0027] 計算服務器上所有數據塊操作量: 打打 n n Ii
[0028] DWn二'芝 SOjiTj= ^ 〇ciTc+ ^OrjTr+ ^ 〇uiT〇 + ^ 〇防 了口 I=Ij=tcr,Uvd) 1=1. 1=1 1=1 J=I
[0029] 每次負載均衡時按照上式計算出服務器中各個數據塊的DWi然后存入變量 dat油IockWei曲t中,DW。參數供后續步驟使用;
[0030] S333、將包含數據塊多的服務器稱為數據塊移動源,用S表示;包含數據塊少的服 務器稱為數據塊移動目標,用T表示;S與T的平均數據塊操作量分別用5"和T"表示,則:
[0031]
[0032] 陽〇3引其中,叫和n康示S與T中數據塊的數量,SDWn和TDWn分別表示S與T服務器上 所有數據塊操作量。
[0034] 進一步地,所述的步驟S3還包括一個步驟:S34、在完成負載均衡后對步驟S32中 增加的變量進行置零操作。
[0035] 本發明的有益效果是:針對MongoDB在自動分片機制上的不足之處,提供了 一種基于數據塊的增刪查改頻率的負載均衡方法,對移動數據塊的選擇上,將數據塊的 CRUD(CRUD代表對數據庫的四種操作,即增刪改查)負載考慮進去,根據數據庫的實際使 用情況,依據各個數據塊讀寫頻率,動態地進行負載均衡,W達到優化數據庫性能的目的, 可W使得集群不僅僅是在數據塊的數量上負載均衡,而且也實現了讀寫負載均衡,優化了 MongoDB水平擴展的能力,能有效的提供MongoDB數據庫的并發讀寫性能,均衡數據庫的負 載,減輕數據庫壓力,降低服務器壓力。
【附圖說明】
[0036] 圖1為本發明的負載均衡優化方法流程圖。
【具體實施方式】
[0037] 下面結合附圖進一步說明本發明的技術方案。
[0038] 如圖1所示,一種MongoDB負載均衡優化方法,包括W下步驟:
[0039] S1、計算每兩個服務器內數據塊總數的差值;
[0040] S2、判斷任意兩個服務器內數據塊總數的差值是否大于或等于系統預先設定的最 大闊值,若是則將該組兩個服務器中包含數據塊多的服務器定為數據塊移動源,包含數據 塊少的服務器定為數據塊移動目標,否則不操作;
[0041] S3、分別計算數據塊移動源和數據塊移動目標內的平均數據塊操作量;
[0042] S4、比較數據塊移動源和數據塊移動目標內的平均數據塊操作量大小,如果數據 塊移動源內平均數據塊操作量大于數據塊移動目標內平均數據塊操作量,則從數據塊