一種面向海量小文件的分布式存儲(chǔ)方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明涉及數(shù)據(jù)存儲(chǔ)領(lǐng)域,尤其涉及分布式存儲(chǔ)系統(tǒng)數(shù)據(jù)路由方法。
【背景技術(shù)】
[0002] 更加普及的互聯(lián)網(wǎng)、瘋狂生長(zhǎng)的移動(dòng)互聯(lián)網(wǎng)、正在萌芽的物聯(lián)網(wǎng),使得個(gè)人、企業(yè) 在各類應(yīng)用上的狀態(tài)信息發(fā)生井噴。這些數(shù)據(jù)具有容量大、形式多、速率高的顯著特點(diǎn),傳 統(tǒng)的數(shù)據(jù)管理系統(tǒng)對(duì)其進(jìn)行處理已顯吃力。這對(duì)信息科學(xué)提出了新的需求,也期盼擁有更 高性能的計(jì)算系統(tǒng)能應(yīng)用于生產(chǎn)實(shí)踐當(dāng)中。對(duì)此,國(guó)內(nèi)外學(xué)者設(shè)計(jì)了形式各樣的分布式文 件系統(tǒng)來(lái)滿足井噴式數(shù)據(jù)的需求。近年來(lái)興起的各類云存儲(chǔ)系統(tǒng)、NoSQL都是從不同的角度 關(guān)注數(shù)據(jù)劇增問題。
[0003] 數(shù)據(jù)規(guī)模變大時(shí),需要增加機(jī)器數(shù)目,即實(shí)現(xiàn)系統(tǒng)的橫向擴(kuò)展,將數(shù)據(jù)分散到各個(gè) 存儲(chǔ)節(jié)點(diǎn),實(shí)現(xiàn)分布式存儲(chǔ)。如何將數(shù)據(jù)均衡分布在各個(gè)機(jī)器,又能在查詢階段迅速找到對(duì) 應(yīng)的數(shù)據(jù),就是數(shù)據(jù)分片與數(shù)據(jù)路由問題。每份數(shù)據(jù)都擁有多個(gè)副本以保證容災(zāi),這就是數(shù) 據(jù)復(fù)制過(guò)程。數(shù)據(jù)復(fù)制還有利于提高讀操作的效率,客戶端可以從副本中選擇訪問速度較 快的一個(gè)進(jìn)行訪問,達(dá)到數(shù)據(jù)流分流的目的。在設(shè)計(jì)分布式文件系統(tǒng)時(shí),數(shù)據(jù)路由策略是關(guān) 鍵。如果數(shù)據(jù)分片與路由策略設(shè)計(jì)不合理,有可能導(dǎo)致不必要的大規(guī)模數(shù)據(jù)迀移。如果對(duì)數(shù) 據(jù)復(fù)制與一致性考慮不周全,有可能導(dǎo)致系統(tǒng)出錯(cuò)。
[0004] 數(shù)據(jù)量驟增的現(xiàn)象催生出了各類大型分布式文件系統(tǒng)。早前的這些系統(tǒng)在特定應(yīng) 用場(chǎng)景的存儲(chǔ)性能較為優(yōu)異。但當(dāng)程師們使用這些系統(tǒng)的設(shè)計(jì)思想去處理數(shù)量龐大的小文 件時(shí),發(fā)現(xiàn)其效果并不理想,主要是使用磁盤存儲(chǔ)小文件會(huì)帶來(lái)空間利用率問題與磁盤I/O 挑戰(zhàn)。對(duì)海量小文件帶來(lái)的問題,存儲(chǔ)系統(tǒng)需要做出一定的調(diào)整,提高磁盤的空間利用率, 優(yōu)化讀寫流程。主要思路為:將元數(shù)據(jù)與文件實(shí)際內(nèi)容分開處理,元數(shù)據(jù)保存在主控節(jié)點(diǎn)的 內(nèi)存中,文件實(shí)際內(nèi)容合并成大文件再保存在存儲(chǔ)集群的磁盤中,存儲(chǔ)節(jié)點(diǎn)通過(guò)內(nèi)存索引 檢索文件實(shí)際內(nèi)容。
[0005] 現(xiàn)有的分布式存儲(chǔ)方法中尚無(wú)針對(duì)海量小文件存儲(chǔ)效率和存儲(chǔ)空間利用率等問 題提出較好的解決辦法。同時(shí)對(duì)于數(shù)據(jù)容災(zāi)等問題也缺少考慮。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明的目的在于提供一種面向海量小文件的分布式存儲(chǔ)方法。
[0007] 為達(dá)到上述目的,本發(fā)明采用了以下技術(shù)方案:
[0008] 步驟1、在存儲(chǔ)集群初始化階段,將數(shù)據(jù)副本數(shù)設(shè)置為K,將存儲(chǔ)節(jié)點(diǎn)分配在N個(gè)網(wǎng) 段,每個(gè)網(wǎng)段包含Μ個(gè)存儲(chǔ)節(jié)點(diǎn),其中,N大于K;
[0009] 步驟2、在存儲(chǔ)集群初始化階段,創(chuàng)建Ρ個(gè)數(shù)據(jù)分區(qū),將所述Ρ個(gè)數(shù)據(jù)分區(qū)稱為寫入 窗口,數(shù)據(jù)分區(qū)的數(shù)量Ρ由用戶設(shè)定,一個(gè)數(shù)據(jù)分區(qū)由Κ個(gè)大文件組成,Κ個(gè)大文件分別存儲(chǔ) 在不同網(wǎng)段的存儲(chǔ)節(jié)點(diǎn)上;在寫入窗口的各個(gè)數(shù)據(jù)分區(qū)上設(shè)置用于標(biāo)記的序號(hào),將寫入窗 口的各個(gè)數(shù)據(jù)分區(qū)的可寫標(biāo)志位設(shè)置為可寫;
[0010] 步驟3、存儲(chǔ)小文件時(shí),從寫入窗口中選擇一個(gè)數(shù)據(jù)分區(qū),以追加寫的方式將該小 文件寫入該數(shù)據(jù)分區(qū);
[0011] 步驟4、當(dāng)某個(gè)數(shù)據(jù)分區(qū)存儲(chǔ)的數(shù)據(jù)量到達(dá)閾值時(shí),將該數(shù)據(jù)分區(qū)從寫入窗口中剔 除,當(dāng)數(shù)據(jù)分區(qū)數(shù)量少于P時(shí),參考存儲(chǔ)集群中存儲(chǔ)節(jié)點(diǎn)的實(shí)時(shí)負(fù)載狀態(tài)和計(jì)算性能創(chuàng)建一 個(gè)新的數(shù)據(jù)分區(qū),并納入寫入窗口。
[0012] 所述步驟1中,數(shù)據(jù)副本數(shù)K是指存儲(chǔ)系統(tǒng)為了實(shí)現(xiàn)數(shù)據(jù)容災(zāi)而將同一份數(shù)據(jù)復(fù)制 為多個(gè)備份的數(shù)量。
[0013] 所述步驟2中,數(shù)據(jù)分區(qū)的數(shù)量P-般等于存儲(chǔ)節(jié)點(diǎn)總數(shù)量。
[0014] 所述步驟3具體包括以下步驟:
[0015] A1、以隨機(jī)的方式從寫入窗口中選出一個(gè)數(shù)據(jù)分區(qū)作為待寫入分區(qū);
[0016] A2、若待寫入分區(qū)的可寫標(biāo)志位為不可寫,則執(zhí)行步驟A3;若待寫入分區(qū)的可寫標(biāo) 志位為可寫,則執(zhí)行步驟A4;
[0017] A3、按序號(hào)遞減的方式遍歷寫入窗口找到一個(gè)可寫標(biāo)志位為可寫的數(shù)據(jù)分區(qū)并作 為待寫入分區(qū),然后執(zhí)行步驟A4;若寫入窗口中不存在可寫標(biāo)志位為可寫的數(shù)據(jù)分區(qū),則參 考存儲(chǔ)集群中存儲(chǔ)節(jié)點(diǎn)的實(shí)時(shí)負(fù)載狀態(tài)和計(jì)算性能創(chuàng)建一個(gè)新的數(shù)據(jù)分區(qū)作為待寫入分 區(qū),并納入寫入窗口,然后執(zhí)行步驟A4;
[0018] A4、將待寫入分區(qū)的可寫標(biāo)志位設(shè)置為不可寫,然后執(zhí)行步驟A5;
[0019] A5、從待寫入分區(qū)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)中隨機(jī)選出1個(gè)作為第一個(gè)寫入小文件的存儲(chǔ) 節(jié)點(diǎn),該存儲(chǔ)節(jié)點(diǎn)再將小文件復(fù)制到待寫入分區(qū)的其它存儲(chǔ)節(jié)點(diǎn),然后執(zhí)行步驟A6;
[0020] A6、將待寫入分區(qū)的可寫標(biāo)志位設(shè)置為可寫。
[0021] 所述閾值由用戶設(shè)定。
[0022] 創(chuàng)建一個(gè)新的數(shù)據(jù)分區(qū)包括以下步驟:
[0023] B1、從N個(gè)網(wǎng)段中隨機(jī)選出K個(gè)網(wǎng)段;
[0024] B2、在選出的每個(gè)網(wǎng)段中,將Μ個(gè)存儲(chǔ)節(jié)點(diǎn)按照實(shí)時(shí)性能排名分?jǐn)?shù)進(jìn)行排序,然后 從性能較高的Μ/3個(gè)存儲(chǔ)節(jié)點(diǎn)中隨機(jī)選出1個(gè)節(jié)點(diǎn);若(Μ/3)〈3,則從性能較高的2個(gè)存儲(chǔ)節(jié) 點(diǎn)中隨機(jī)選出1個(gè);
[0025] Β3、在選出的Κ個(gè)存儲(chǔ)節(jié)點(diǎn)創(chuàng)建大文件,構(gòu)建一個(gè)數(shù)據(jù)分區(qū),并將該數(shù)據(jù)分區(qū)的可 寫標(biāo)志位設(shè)置為可寫。
[0026] 所述實(shí)時(shí)性能排名分?jǐn)?shù)按照以下公式計(jì)算:
[0028]其中,S表示實(shí)時(shí)性能排名分?jǐn)?shù);D表示存儲(chǔ)節(jié)點(diǎn)實(shí)時(shí)的可用存儲(chǔ)空間,Q表示該存 儲(chǔ)節(jié)點(diǎn)的性能等級(jí),取值范圍為1到1 〇的正整數(shù),Rcpli表示該存儲(chǔ)節(jié)點(diǎn)實(shí)時(shí)的利用率, RM_ry表示該存儲(chǔ)節(jié)點(diǎn)實(shí)時(shí)的內(nèi)存利用率。
[0029]本發(fā)明的有益效果體現(xiàn)在:
[0030] 1、動(dòng)態(tài)的負(fù)載均衡:本方法根據(jù)存儲(chǔ)節(jié)點(diǎn)的實(shí)時(shí)負(fù)載狀態(tài)、計(jì)算性能,將海量小文 件均衡地分布在各個(gè)存儲(chǔ)節(jié)點(diǎn),實(shí)現(xiàn)對(duì)海量小文件的有效存儲(chǔ);
[0031] 2、容災(zāi):一個(gè)文件同時(shí)存在的多個(gè)副本被分布在不同的存儲(chǔ)節(jié)點(diǎn),這些存儲(chǔ)節(jié)點(diǎn) 分布在不同的網(wǎng)段,增強(qiáng)存儲(chǔ)集群的容災(zāi)特性;
[0032] 3、平滑擴(kuò)容:增加存儲(chǔ)節(jié)點(diǎn)時(shí),新加入的節(jié)點(diǎn)由于負(fù)載較輕,在創(chuàng)建數(shù)據(jù)分區(qū)時(shí), 該存儲(chǔ)節(jié)點(diǎn)被命中的概率較大,甚至?xí)恢北幻?,一定時(shí)間后,機(jī)器負(fù)載即可到達(dá)均衡。 無(wú)需在系統(tǒng)擴(kuò)容階段進(jìn)行不必要的數(shù)據(jù)迀移。
【附圖說(shuō)明】
[0033] 圖1是基于主從架構(gòu)的分布式存儲(chǔ)系統(tǒng)的示意圖;
[0034]圖2是創(chuàng)建數(shù)據(jù)分區(qū)的示意圖;
[0035] 圖3是寫入操作的示意圖,圖3中X表示隨機(jī)選出的數(shù)據(jù)分區(qū)的可寫標(biāo)志位為不可 寫,也指明了遍歷的起點(diǎn),-表示遍歷方向,最終找到了序號(hào)為8的數(shù)據(jù)分區(qū)進(jìn)行寫入,小方 框表示待寫入數(shù)據(jù)的存儲(chǔ)節(jié)點(diǎn)。
【具體實(shí)施方式】
[0036] 下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)描述,實(shí)施例實(shí)際上僅僅是說(shuō)明性的, 不宜理解為對(duì)本發(fā)明保護(hù)范圍的限制。
[0037] 為了更有效地存儲(chǔ)海量小文件,在使用分布式存儲(chǔ)方案應(yīng)對(duì)海量小文件帶來(lái)的空 間利用率問題與磁盤I/O挑戰(zhàn)的時(shí)候,能使數(shù)據(jù)副本根據(jù)存儲(chǔ)節(jié)點(diǎn)的性能狀態(tài)均衡地分布 在存儲(chǔ)集群中,并讓存儲(chǔ)集群能夠提供友好的容災(zāi)與擴(kuò)容機(jī)制。為此,本發(fā)明提出了一種基 于動(dòng)態(tài)數(shù)據(jù)路由策略的分布式存儲(chǔ)方法,該方法可根據(jù)存儲(chǔ)節(jié)點(diǎn)的實(shí)時(shí)負(fù)載狀態(tài)、計(jì)算性 能,將海量小文件均衡地分布在各個(gè)存儲(chǔ)節(jié)點(diǎn)。同時(shí),較好地實(shí)現(xiàn)了存儲(chǔ)集群的容災(zāi)與平滑 擴(kuò)容。
[0038]如圖1所示,基于主從架構(gòu)的分布式存儲(chǔ)系統(tǒng)主要包括用戶接口、代理集群、存儲(chǔ) 節(jié)點(diǎn)幾個(gè)部分;
[0039] 1、用戶接口負(fù)責(zé)用戶接入,代理集群負(fù)責(zé)數(shù)據(jù)分布策略的邏輯處理,存儲(chǔ)節(jié)點(diǎn)是 存儲(chǔ)文件的地方,并定時(shí)向代理集群反饋機(jī)器性能。
[0040] 2、在存儲(chǔ)集群初始化階段,將數(shù)據(jù)副本數(shù)設(shè)置為K,存儲(chǔ)節(jié)點(diǎn)被分配在N(圖1中,m+ 1 =N)個(gè)網(wǎng)段,每個(gè)網(wǎng)段包含Μ(圖1中,n+1 =M)個(gè)存儲(chǔ)節(jié)點(diǎn),要求N大于K,K一般為3。
[0041] 3、客戶端通過(guò)用戶接口向本系統(tǒng)發(fā)起寫入請(qǐng)求,其步驟包括:
[0