国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

MongoDB負(fù)載均衡算法優(yōu)化研究

2020-04-09 06:36陳敬靜馬明棟王得玉
關(guān)鍵詞:分片集群服務(wù)器

陳敬靜,馬明棟,王得玉

(1.南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210003;2.南京郵電大學(xué) 地理與生物信息學(xué)院,江蘇 南京 210003)

0 引 言

隨著通信技術(shù)、互聯(lián)網(wǎng)、云計(jì)算的飛速發(fā)展,互聯(lián)網(wǎng)浪潮已經(jīng)到達(dá),接入到互聯(lián)網(wǎng)中的設(shè)備呈指數(shù)增長(zhǎng),越來越多的數(shù)據(jù)以不同內(nèi)容和形式涌現(xiàn)出來,大數(shù)據(jù)時(shí)代正式到來。大數(shù)據(jù)時(shí)代最主要的特征就是數(shù)據(jù)種類與數(shù)量的繁多,除了結(jié)構(gòu)化數(shù)據(jù)還有半結(jié)構(gòu)化數(shù)據(jù)以及非結(jié)構(gòu)化數(shù)據(jù),這要求數(shù)據(jù)存儲(chǔ)系統(tǒng)必須能夠處理高并發(fā)問題,同時(shí)還要易于擴(kuò)展[1]。盡管在主流應(yīng)用場(chǎng)景中仍然使用傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù),但面對(duì)海量的數(shù)據(jù),它很難滿足海量數(shù)據(jù)的存儲(chǔ)需求,已經(jīng)無法滿足人們?nèi)找嬖鲩L(zhǎng)的需求。為了解決如何存儲(chǔ)和處理海量數(shù)據(jù)的問題,非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)應(yīng)運(yùn)而生[2]。MongoDB也是NoSQL的一種,因其非常適合處理海量數(shù)據(jù)和高并發(fā)而得到大量應(yīng)用。文中通過研究MongoDB的自動(dòng)分片原理,提出一種改進(jìn)的基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法[3],以有效解決其自身算法存在的部分問題。

1 MongoDB的自動(dòng)分片

1.1 MongoDB簡(jiǎn)介

MongoDB是10gen公司使用C++編寫開發(fā)的基于分布式文件存儲(chǔ)的開源NoSQL數(shù)據(jù)庫(kù)系統(tǒng),由于其性能高效、功能豐富,在生產(chǎn)中得到了廣泛應(yīng)用。MongoDB除了具有NoSQL 數(shù)據(jù)庫(kù)的相關(guān)特性外,還具有自動(dòng)分片、集群擴(kuò)展、單點(diǎn)故障自動(dòng)恢復(fù)、復(fù)雜查詢等優(yōu)點(diǎn),非常符合存儲(chǔ)海量的半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)[4]。MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值對(duì)組成,其文檔的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似于JSON的BSON格式[5],存儲(chǔ)效率高。它是一個(gè)面向集合的,模式自由的文檔型數(shù)據(jù)庫(kù),相較于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),在面對(duì)海量數(shù)據(jù)的挑戰(zhàn)時(shí)更加有優(yōu)勢(shì),其主要功能特性有:面向集合存儲(chǔ)、模式自由、容易擴(kuò)展、支持復(fù)制和數(shù)據(jù)恢復(fù)、支持動(dòng)態(tài)查詢、支持完全索引以及自動(dòng)處理分片等[6]。

1.2 分片介紹

分片(Sharding)是指將內(nèi)存中的數(shù)據(jù)拆分成不同的塊,分別存儲(chǔ)到不同機(jī)器上的過程。通過分割數(shù)據(jù)到不同的服務(wù)器,讓數(shù)據(jù)集的不同部分分別由不同的服務(wù)器負(fù)責(zé),使得單個(gè)機(jī)器上的請(qǐng)求數(shù)得到減少,系統(tǒng)總負(fù)載得到提高,總存儲(chǔ)空間也得到提高[7]。分片是數(shù)據(jù)庫(kù)系統(tǒng)擴(kuò)展的必然產(chǎn)物,而不是某個(gè)特定數(shù)據(jù)庫(kù)軟件附屬的功能,分片能在一定程度上決定系統(tǒng)性能的優(yōu)劣。MongoDB采用自動(dòng)分片(Auto-Sharding)機(jī)制,如圖1所示。

自動(dòng)分片技術(shù)一般用于自動(dòng)配置、監(jiān)控和數(shù)據(jù)轉(zhuǎn)移,當(dāng)數(shù)據(jù)量大到服務(wù)器的磁盤、內(nèi)存難以負(fù)擔(dān)時(shí),自動(dòng)分片技術(shù)可以自動(dòng)平衡負(fù)載和數(shù)據(jù)分布的變化,提升系統(tǒng)的擴(kuò)展性能。此外,它還提供無單點(diǎn)故障自動(dòng)恢復(fù)、自動(dòng)故障轉(zhuǎn)移以及動(dòng)態(tài)添加額外服務(wù)器等技術(shù),為提升系統(tǒng)性能提供了很大幫助。

圖1 分片原理

1.3 自動(dòng)分片集群架構(gòu)

MongoDB的自動(dòng)分片集群架構(gòu)如圖2所示,主要包括分片服務(wù)器、路由服務(wù)器以及配置服務(wù)器,這三種服務(wù)器負(fù)責(zé)的功能如下:

(1)Mongos:路由服務(wù)器,負(fù)責(zé)將讀取和寫入的請(qǐng)求從應(yīng)用程序路由到分片。集群通過Mongos連接客戶端和服務(wù)器,當(dāng)客戶端向數(shù)據(jù)庫(kù)發(fā)送更新或查詢操作請(qǐng)求,Mongos接收請(qǐng)求并聚合,然后發(fā)送給分片服務(wù)器,它并不存儲(chǔ)數(shù)據(jù),只傳遞請(qǐng)求[8]。

(2)Config Server:配置服務(wù)器,存儲(chǔ)集群的配置信息以及分片與數(shù)據(jù)的對(duì)應(yīng)關(guān)系,運(yùn)行集群時(shí)向路由服務(wù)器提供配置信息和對(duì)應(yīng)關(guān)系。一般MongoDB自動(dòng)分片集群中配有多個(gè)配置服務(wù)器,每個(gè)配置服務(wù)器中都保存了所有信息,防止信息丟失。

(3)Shard:分片節(jié)點(diǎn),用于存儲(chǔ)數(shù)據(jù)。在架構(gòu)中,一個(gè)片內(nèi)可以有多個(gè)Mongos服務(wù)器,每個(gè)服務(wù)器中存放的數(shù)據(jù)都相同,主服務(wù)器只有一個(gè),其他均為從服務(wù)器。存儲(chǔ)數(shù)據(jù)的部件是分片節(jié)點(diǎn),為了獲得高擴(kuò)展性和數(shù)據(jù)一致性,分片常與副本集(Replica Set)同時(shí)使用,防止該數(shù)據(jù)片單點(diǎn)故障[9]。

圖2 自動(dòng)分片集群架構(gòu)

一般情況下,當(dāng)用戶向數(shù)據(jù)庫(kù)發(fā)送操作請(qǐng)求時(shí),Mongos會(huì)解析數(shù)據(jù)庫(kù)的分片shard key(片鍵)規(guī)則,在存儲(chǔ)元數(shù)據(jù)的配置節(jié)點(diǎn)配置服務(wù)器中查找相關(guān)信息,找到對(duì)應(yīng)的分片后將請(qǐng)求轉(zhuǎn)發(fā)到正確的片上,對(duì)客戶端發(fā)送來的請(qǐng)求進(jìn)行響應(yīng),最后Mongos將獲取到的結(jié)果發(fā)送給應(yīng)用程序[10]。將數(shù)據(jù)片段與應(yīng)用程序分離是MongoDB分片技術(shù)中最獨(dú)特的地方,使用這種分片機(jī)制,用戶可以在不更改程序的前提下,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的擴(kuò)展。

2 MongoDB負(fù)載均衡算法

2.1 Chunk塊拆分

MongoDB將分片服務(wù)器內(nèi)部數(shù)據(jù)分為chunks,不同chunk塊代表這個(gè)分片服務(wù)器內(nèi)部的部分?jǐn)?shù)據(jù),由指定片鍵的某一連續(xù)范圍內(nèi)的文檔組成。當(dāng)chunk塊過大時(shí),MongoDB后臺(tái)進(jìn)程會(huì)計(jì)算每個(gè)chunk塊的大小并選擇拆分點(diǎn),根據(jù)拆分點(diǎn)將該chunk塊切分成更小的chunk塊,避免chunk塊過大的情況[11]。在MongoDB中,負(fù)責(zé)數(shù)據(jù)遷移的工具就是均衡器(balancer),balancer是一個(gè)后臺(tái)進(jìn)程,負(fù)責(zé)chunk塊的遷移,從而均衡各個(gè)shard server的負(fù)載。拆分chunk塊最重要的兩點(diǎn)是選擇合適的拆分點(diǎn)和不同chunk塊所占用的空間基本相等。

2.2 負(fù)載均衡算法分析

隨著MongoDB中的數(shù)據(jù)越來越多,分片中chunk塊的數(shù)量也越來越多,每個(gè)分片服務(wù)器上chunk塊的個(gè)數(shù)也不相同,且差異越來越大。在MongoDB中,默認(rèn)的負(fù)載均衡算法認(rèn)為chunk塊數(shù)量相當(dāng)即負(fù)載均衡。負(fù)載均衡的實(shí)現(xiàn)主要來自于其內(nèi)部負(fù)載均衡器(balancer)進(jìn)程的運(yùn)行,均衡器周期性地檢查各分片,當(dāng)分片間chunk塊的數(shù)量差到達(dá)遷移閾值(默認(rèn)為8),均衡器啟動(dòng)自動(dòng)數(shù)據(jù)遷移,將數(shù)據(jù)從包含最多chunk塊的片上遷移到chunk塊最少的片上,直到chunk塊的數(shù)量差不大于2為止[12]。數(shù)據(jù)遷移以chunk塊為單位進(jìn)行遷移,最初默認(rèn)大小為64 M,但隨著數(shù)據(jù)量的逐漸增大,最終每個(gè)塊的數(shù)據(jù)量會(huì)達(dá)到200 M[13]。

通過閱讀源碼并對(duì)源碼進(jìn)行分析,MongoDB負(fù)載均衡算法的流程如圖3所示。

圖3 負(fù)載均衡算法流程

條件1:Minshard未達(dá)存儲(chǔ)上限且不存在寫回隊(duì)列;

條件2:Maxshard-Minshard>=Threshold;

條件3:負(fù)載均衡器仍然開啟。

2.3 負(fù)載均衡算法的爭(zhēng)議

一直以來,MongoDB的負(fù)載均衡算法在實(shí)際應(yīng)用中仍然存在許多問題。這個(gè)均衡器只考慮了數(shù)據(jù)的存儲(chǔ)平衡,而沒有考慮負(fù)載平衡[14]。節(jié)點(diǎn)的負(fù)載取決于其配置及接受任務(wù)的輕重,盡管分片節(jié)點(diǎn)上的chunk塊數(shù)量相同,但在選擇目標(biāo)分片時(shí),沒有考慮分片節(jié)點(diǎn)上的負(fù)載不相同這一問題,因此得到的結(jié)果也可能不是最好的,所以很有必要對(duì)MongoDB的負(fù)載均衡算法進(jìn)行改進(jìn)。

3 基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法

3.1 基于節(jié)點(diǎn)的均衡算法思想

通過前面的分析了解到MongoDB的負(fù)載均衡算法并不是十分完善,因此文中在原始算法的基礎(chǔ)上提出一種基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法。改進(jìn)的算法將節(jié)點(diǎn)的實(shí)時(shí)負(fù)載情況作為判斷條件,在節(jié)點(diǎn)上增加負(fù)載代理,在負(fù)載均衡器上增加負(fù)載監(jiān)視器,通過負(fù)載代理監(jiān)測(cè)各節(jié)點(diǎn)的負(fù)載情況并將數(shù)據(jù)發(fā)送給負(fù)載監(jiān)視器,均衡器將節(jié)點(diǎn)負(fù)載指數(shù)作為確定源分片和目的分片的一個(gè)指標(biāo)。

將節(jié)點(diǎn)i的負(fù)載代理檢測(cè)到的CPU占有率、內(nèi)存使用率以及網(wǎng)絡(luò)帶寬占有率分別記為Ci、Mi以及Ni,CPU、內(nèi)存和網(wǎng)絡(luò)帶寬的權(quán)值分別設(shè)為i1、i2和i3,則節(jié)點(diǎn)i的負(fù)載指數(shù)Iload可表示為:

Iload=i1×Ci+i2×Mi+i3×Ni

(1)

i1+i2+i3=1

(2)

假設(shè)自動(dòng)分片集群架構(gòu)中有n個(gè)分片,則平均負(fù)載Aveload為:

(3)

最大的節(jié)點(diǎn)負(fù)載為Maxload,設(shè)定閾值γ(一般默認(rèn)為8),若

Maxload-Aveload≥γ

(4)

則此節(jié)點(diǎn)過載。改進(jìn)的基于節(jié)點(diǎn)的均衡算法在均衡chunk塊數(shù)量的同時(shí),還均衡了分片節(jié)點(diǎn)上的負(fù)載,可以有效提升原算法的性能,解決數(shù)據(jù)分布不均的問題[15]。

3.2 基于節(jié)點(diǎn)的均衡算法設(shè)計(jì)

基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法具體設(shè)計(jì)如下:

(1)負(fù)載代理周期性地遍歷各分片,獲取節(jié)點(diǎn)負(fù)載信息并發(fā)送給負(fù)載監(jiān)視器。

(2)負(fù)載監(jiān)視器計(jì)算出平均負(fù)載,確定負(fù)載最大的分片、chunk塊數(shù)最多的分片和存儲(chǔ)即將超過上限的待移除分片,將既不是待移除分片且chunk塊數(shù)也不是最多的分片列入最小分片的候選列表。

(3)若分片塊數(shù)差超過設(shè)定閾值,則確定源分片為chunk塊數(shù)最多的分片;若分片塊數(shù)差滿足條件,但存在待移除分片,則確定源分片為待移除分片;若前兩個(gè)條件都不滿足但根據(jù)式(4)計(jì)算得出存在過載分片,則源分片為負(fù)載最大的分片;若以上條件都不滿足,則不需要遷移。

算法流程如圖4所示。

圖4 基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法流程

4 算法性能評(píng)估

4.1 測(cè)試環(huán)境

測(cè)試環(huán)境基于MongoDB的自動(dòng)分片集群,由3臺(tái)機(jī)器構(gòu)成,每臺(tái)機(jī)器內(nèi)存都為4 GB,操作系統(tǒng)為L(zhǎng)inux Redhat,MongoDB版本為3.4.0。集群包含3個(gè)分片,每個(gè)分片由一個(gè)副本集組成,每個(gè)副本集包含1個(gè)primary節(jié)點(diǎn),2個(gè)secondary節(jié)點(diǎn)和1個(gè)arbiter節(jié)點(diǎn)。結(jié)合實(shí)際運(yùn)行情況,設(shè)置CPU占有率和內(nèi)存使用率權(quán)重占比較大,網(wǎng)絡(luò)帶寬占有率權(quán)重較小,i1、i2和i3分別為0.2、0.7和0.1,閾值γ設(shè)置為13%。

4.2 平臺(tái)搭建

(1)配置副本集。

> cfg={_id:“shard1”,members:[{_id:0,host:“192.168.169.128:40007”},

{_id:0,host:“192.168.169.128:40007”},

{_id:0,host:“192.168.169.128:40007”}]}

> rs.initiate(cfg);

(2)配置Config Server。

mongod --configsvr --dbpath=/home/mongod/data/mongo.conf

(3)配置Mongos。

mongos -f /home/mongod/mongos/mongo.conf

(4)配置Shard。

>db.runCommand({addshard“shard1/192.168.148.61:40007,192.168.148.63:40007,192.168.148.65:40007”})

4.3 算法測(cè)試結(jié)果

首先,測(cè)試集群的并發(fā)寫入功能。為了保證數(shù)據(jù)總量相等,均插入一百萬條數(shù)據(jù),在不同并發(fā)數(shù)下,新舊算法每秒可寫入的數(shù)據(jù)記錄如表1所示。

表1 新舊算法并發(fā)寫入性能數(shù)據(jù)統(tǒng)計(jì)

在并發(fā)數(shù)和記錄不變的情況下,測(cè)試集群的并發(fā)讀取性能,新舊算法每秒讀取的數(shù)據(jù)記錄如表2所示。

表2 新舊算法并發(fā)讀取性能數(shù)據(jù)統(tǒng)計(jì)

從實(shí)驗(yàn)數(shù)據(jù)結(jié)果可以看出,在并發(fā)數(shù)較小的時(shí)候,新算法的讀寫性能并沒有明顯優(yōu)于原算法,甚至可能會(huì)低于原算法,但隨著并發(fā)數(shù)的增加,新算法明顯優(yōu)于原算法。這是因?yàn)楦倪M(jìn)的基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法將節(jié)點(diǎn)負(fù)載作為一個(gè)考慮條件,當(dāng)數(shù)據(jù)量不夠大時(shí),計(jì)算節(jié)點(diǎn)的負(fù)載情況資源利用率低,影響了系統(tǒng)性能,而在大數(shù)據(jù)及大并發(fā)的情況下,應(yīng)用新算法之后的讀寫性能明顯優(yōu)于原算法,提高了集群的并發(fā)讀寫能力。

5 結(jié)束語(yǔ)

首先介紹了MongoDB自動(dòng)分片的原理,然后分析了其負(fù)載均衡算法的缺點(diǎn),針對(duì)分片間分配數(shù)據(jù)不均勻的問題,提出了一種基于節(jié)點(diǎn)實(shí)時(shí)負(fù)載的負(fù)載均衡算法。接著搭建了測(cè)試環(huán)境,針對(duì)數(shù)據(jù)的并發(fā)讀寫性能與原算法做一個(gè)對(duì)比實(shí)驗(yàn),通過實(shí)驗(yàn)得出,該算法在數(shù)據(jù)的讀寫均衡上得到了明顯優(yōu)化,提高了集群的并發(fā)讀寫性能,證明了算法的有效性。

猜你喜歡
分片集群服務(wù)器
上下分片與詞的時(shí)空佈局
齊口裂腹魚集群行為對(duì)流態(tài)的響應(yīng)
基于MongoDB 分片集群的海量數(shù)據(jù)存儲(chǔ)設(shè)計(jì)
物聯(lián)網(wǎng)區(qū)塊鏈中基于演化博弈的分片算法
基于信息素決策的無人機(jī)集群協(xié)同搜索算法
2018年全球服務(wù)器市場(chǎng)將保持溫和增長(zhǎng)
勤快又呆萌的集群機(jī)器人
基于糾刪碼冗余技術(shù)中的數(shù)據(jù)可靠性技術(shù)的研究
用獨(dú)立服務(wù)器的站長(zhǎng)注意了
定位中高端 惠普8路服務(wù)器重裝上陣