徐驍,夏敏,張鵬,陳潔,張照星
(1.公安部戶政管理研究中心,北京100070;2.北京大學(xué)軟件與微電子學(xué)院,北京102600)
隨著互聯(lián)網(wǎng)應(yīng)用的發(fā)展,每天都會(huì)產(chǎn)生海量的用戶數(shù)據(jù),如何快速、高效地處理和存儲(chǔ)這些數(shù)據(jù)成為大數(shù)據(jù)時(shí)代的研究重點(diǎn)。為解決海量數(shù)據(jù)的存儲(chǔ)與處理的難題,云存儲(chǔ)技術(shù)應(yīng)運(yùn)而生。文獻(xiàn)[1-5]的研究發(fā)現(xiàn):當(dāng)前的主流云存儲(chǔ)架構(gòu)中,為確保數(shù)據(jù)安全,云存儲(chǔ)系統(tǒng)會(huì)為每一個(gè)數(shù)據(jù)塊復(fù)制出多個(gè)副本,并將這些的副本分散存儲(chǔ)在不同的物理節(jié)點(diǎn),即可確保某一節(jié)點(diǎn)上的數(shù)據(jù)塊失效時(shí),集群中的其他節(jié)點(diǎn)仍有該數(shù)據(jù)塊的有效副本,從而保證數(shù)據(jù)安全。
網(wǎng)盤是各類云存儲(chǔ)技術(shù)應(yīng)用中非常重要且越來越普及的一種應(yīng)用形式。在網(wǎng)盤的使用過程中難免會(huì)出現(xiàn)如下場(chǎng)景:兩個(gè)用戶先后上傳了相同的文件;用戶將別人分享的文件轉(zhuǎn)存到自己的網(wǎng)盤。這時(shí)如果網(wǎng)盤直接使用云存儲(chǔ)接口,那么云存儲(chǔ)集群中就會(huì)存在相同的文件副本。當(dāng)用戶上傳的相同文件越來越多、分享越來越多,云存儲(chǔ)集群中必將產(chǎn)生大量的冗余副本。原本用于確保數(shù)據(jù)安全的副本變成了占用大量存儲(chǔ)資源的累贅。不僅如此,相同文件的重復(fù)傳輸會(huì)占用大量的網(wǎng)絡(luò)帶寬,冗余副本在集群中負(fù)載均衡會(huì)消耗計(jì)算資源。因此在使用云存儲(chǔ)組件開發(fā)網(wǎng)盤類應(yīng)用時(shí),要對(duì)重復(fù)上傳的文件進(jìn)行處理。
高校的教堂管理系統(tǒng)往往需要集成課件上件下載功能,因此產(chǎn)生重復(fù)文件的機(jī)會(huì)大大增加。針對(duì)這個(gè)問題作者在將Swift云存儲(chǔ)組件應(yīng)用到課件管理子系統(tǒng)中時(shí)提出了一種對(duì)冗余文件去重的方法。
云存儲(chǔ)是在云計(jì)算的概念基礎(chǔ)上發(fā)展出來的新興技術(shù)[6]。它將傳統(tǒng)的集群技術(shù)、網(wǎng)絡(luò)技術(shù)、分布式文件系統(tǒng)等技術(shù)結(jié)合起來,使分散在網(wǎng)絡(luò)中的存儲(chǔ)設(shè)備能夠協(xié)同工作,并作為一個(gè)整體對(duì)外提供統(tǒng)一的存儲(chǔ)服務(wù)[7]。
文獻(xiàn)[1][8]詳細(xì)論述了一種能夠適應(yīng)極速增長的數(shù)據(jù)處理需求的分布式文件系統(tǒng):谷歌文件系統(tǒng)(Google File System,GFS)。GFS通過集群中的Master節(jié)點(diǎn)來管理數(shù)據(jù)塊在Chunkserver節(jié)點(diǎn)中的分布,均衡各Chunkserver的負(fù)載,為Client節(jié)點(diǎn)提供最新的可用副本,并回收不再使用的存儲(chǔ)空間。受到文獻(xiàn)[1][2]的啟發(fā),Apache基金會(huì)發(fā)布了開源的Hadoop框架,提出了Hadoop分布式文件系統(tǒng)(Hadoop Distributed File System,HDFS)[3]。HDFS認(rèn)為每個(gè)數(shù)據(jù)塊在本地節(jié)點(diǎn)、同一機(jī)架的不同節(jié)點(diǎn)以及不同機(jī)架上的節(jié)點(diǎn)都應(yīng)該有一個(gè)副本。2006年,亞馬遜在原云服務(wù)(Amazon Web Service,AWS)的基礎(chǔ)上又推出了簡單存儲(chǔ)服務(wù)(Sim-ple Storage Service,S3)[4],它能夠通過 Web Service方式或RESTful API方式存取云存儲(chǔ)集群中的文件,便于整合到各類Web應(yīng)用中[9-10]。2010年,美國國家宇航局(NASA)與Rackspace聯(lián)合發(fā)布了開源云計(jì)算平臺(tái)Openstack[5],其中包括Swift云存儲(chǔ)組件。Swift一方面采用了3副本的副本管理策略,另一方面提供了與S3相兼容的RESTful API[11]。
綜上,云存儲(chǔ)系統(tǒng)中普遍使用副本冗余的技術(shù)來確保云存儲(chǔ)系統(tǒng)能夠在廉價(jià)設(shè)備上實(shí)現(xiàn)高可靠和高容錯(cuò)。同時(shí)冗余副本的存在也帶來一些隱患包括:(1)占用更多的存儲(chǔ)空間;(2)各節(jié)點(diǎn)間的數(shù)據(jù)傳輸需要占用網(wǎng)絡(luò)帶寬;(3)冗余副本的負(fù)載均衡會(huì)消耗計(jì)算資源。因此在云存儲(chǔ)系統(tǒng)內(nèi)部需要更優(yōu)的副本管理策略來達(dá)到安全與效率的平衡,在云存儲(chǔ)系統(tǒng)外部,也應(yīng)該減少潛在的冗余副本。
網(wǎng)盤應(yīng)用是各類云存儲(chǔ)技術(shù)應(yīng)用中非常重要且越來越普及的一種應(yīng)用形式。筆者調(diào)研了國內(nèi)比較有代表性的網(wǎng)盤應(yīng)用,并比較了它們的功能特點(diǎn)。從而提出了云存儲(chǔ)系統(tǒng)在網(wǎng)盤應(yīng)用中需要注意的問題。
百度網(wǎng)盤是百度于2012年推出的一項(xiàng)云存儲(chǔ)服務(wù),通過客戶端,用戶能夠“秒傳”熱門資源。用戶能夠生成分享鏈接,也可以將別人通過百度網(wǎng)盤分享的資源轉(zhuǎn)存到自己的百度網(wǎng)盤中[12]。
騰訊微云是騰訊公司為用戶精心打造的一項(xiàng)智能云服務(wù),用戶可以通過微云方便地在手機(jī)和電腦之間同步文件、推送照片和傳輸數(shù)據(jù)[13]。它與QQ、微信、郵箱等產(chǎn)品進(jìn)行了深度整合,用戶既可以通過QQ、微信、郵箱等分享微云中的文件,也可以把別人分享的文件方便地轉(zhuǎn)存到微云中。
115網(wǎng)盤是廣東一一五科技有限公司于2009年推出的網(wǎng)絡(luò)數(shù)據(jù)在線存儲(chǔ)服務(wù)[14]。115的文件分享功能十分強(qiáng)大,用戶可以收藏和轉(zhuǎn)存別人分享的文件,可以將文件分享給指定的一個(gè)或者多個(gè)用戶(現(xiàn)由于公司原因關(guān)閉了分享功能)。通過PC客戶端,115網(wǎng)盤可以“秒傳”熱門文件,并支持文件斷點(diǎn)續(xù)傳[14]。
綜上可見,主流的網(wǎng)盤應(yīng)用都會(huì)具備:1、文件的“秒傳”功能;2、文件的分享功能;3、文件的轉(zhuǎn)存功能。這些功能反映了網(wǎng)盤應(yīng)用中,必將會(huì)保存大量的相同文件。如果這些重復(fù)的文件在云存儲(chǔ)組件中不加以處理,按照云存儲(chǔ)系統(tǒng)中一個(gè)數(shù)據(jù)塊有多個(gè)數(shù)據(jù)副本的管理策略,將會(huì)給云存儲(chǔ)系統(tǒng)帶來巨大的壓力。
課件管理子系統(tǒng)的每一個(gè)用戶有自己的“存儲(chǔ)空間”,用戶可以在自己的“存儲(chǔ)空間”里創(chuàng)建、修改、刪除文件,各個(gè)用戶的“存儲(chǔ)空間”互不干擾;教師用戶向課程中添加、刪除課程資料文件的過程,即分享文件的過程;學(xué)生用戶可以訪問并下載某一課程中的資料,也可以將資料轉(zhuǎn)存到自己的“存儲(chǔ)空間”。
課件管理子系統(tǒng)要解決由文件共享、不同用戶上傳同一文件帶來的冗余問題。當(dāng)一個(gè)文件被多次共享、轉(zhuǎn)存或者上傳,云存儲(chǔ)組件中應(yīng)該只有一份文件及其必要的副本,而不應(yīng)該出現(xiàn)多個(gè)同樣的文件。
作者選用了開源的Swift云存儲(chǔ)組件作為課件管理子系統(tǒng)的存儲(chǔ)層,采用MySQL數(shù)據(jù)庫為課件管理子系統(tǒng)提供管理信息的存儲(chǔ),使用PHP的Yii框架作為開發(fā)框架實(shí)現(xiàn)系統(tǒng)邏輯,最上層通過JS及HTML技術(shù)做頁面展示。
(1)Swift組件網(wǎng)絡(luò)設(shè)計(jì)
為確保數(shù)據(jù)的安全,作者將Swift集群部署在私網(wǎng)網(wǎng)段中,對(duì)外提供服務(wù)的Web服務(wù)器通過雙網(wǎng)卡,一塊與外網(wǎng)相連,一塊與私網(wǎng)相連。在Swift集群內(nèi)部部署一臺(tái)代理節(jié)點(diǎn)服務(wù)器和若干臺(tái)數(shù)據(jù)節(jié)點(diǎn)服務(wù)器,它們之間通過私網(wǎng)的交換機(jī)相連。如圖1所示。
圖1 Swift集群網(wǎng)絡(luò)拓?fù)鋱D
(2)API封裝設(shè)計(jì)
Swift通過RESTful API對(duì)外提供最基礎(chǔ)的存儲(chǔ)服務(wù),包括請(qǐng)求認(rèn)證、創(chuàng)建容器、刪除容器、上傳文件、下載文件、刪除文件和復(fù)制文件。為方便應(yīng)用系統(tǒng)內(nèi)部調(diào)用Swift服務(wù),將它們用PHP進(jìn)行封裝。實(shí)現(xiàn)功能如表1所示。
表1 API與封裝對(duì)應(yīng)關(guān)系表
(3)去重方案設(shè)計(jì)
為了避免將重復(fù)的文件上傳到Swift集群中,作者將存儲(chǔ)邏輯與去重邏輯分離,Swift集群只負(fù)責(zé)存儲(chǔ)文件。數(shù)據(jù)庫則記錄了(1)用戶與文件的持有關(guān)系;(2)存儲(chǔ)于Swift集群中所有文件的哈希值。在上傳文件之前,先計(jì)算出待上傳文件的哈希值,再與數(shù)據(jù)庫中現(xiàn)有的文件哈希值進(jìn)行比較,如果此文件已經(jīng)存在于Swift集群,那么系統(tǒng)直接生成一條用戶持有該文件的關(guān)聯(lián)記錄,不再重復(fù)上傳文件。去重流程如圖2所示。
用戶之間的文件分享關(guān)系,實(shí)際上是文件與用戶之間一種特殊的臨時(shí)的“持有”關(guān)系,用戶可以將文件轉(zhuǎn)存到自己的“存儲(chǔ)空間”把分享關(guān)系轉(zhuǎn)變成持有關(guān)系。當(dāng)一個(gè)文件被多個(gè)用戶持有時(shí),任何一個(gè)用戶刪除自己的文件,不會(huì)影響到其他用戶持有此文件。而一個(gè)文件被分享給其他用戶時(shí),若持有此文件的用戶刪除文件,其他用戶也將無法訪問到被刪除的文件。為了保證安全,用戶在通過網(wǎng)頁查看文件的時(shí)候,系統(tǒng)實(shí)時(shí)生成各個(gè)文件的下載鏈接,此鏈接具有時(shí)效性,且只能供當(dāng)前登錄用戶下載。
圖2 上傳文件的去重流程圖
(4)數(shù)據(jù)庫設(shè)計(jì)
根據(jù)上述分析,設(shè)計(jì)數(shù)據(jù)庫E-R圖如圖3所示。其中,對(duì)象表用于存儲(chǔ)Swift集群中各對(duì)象的元信息(包括對(duì)象名、對(duì)象類型、對(duì)象大小等)、哈希值以及管理信息(包括對(duì)象編號(hào)、上傳時(shí)間、上傳用戶、刪除標(biāo)識(shí)等)。用戶表用于存儲(chǔ)用戶信息,包括用戶編號(hào)、用戶名、加密后的登錄密碼等。持有關(guān)系表存儲(chǔ)了用戶編號(hào)和對(duì)象編號(hào),以及用戶對(duì)持有對(duì)象的命名(持有名)、存儲(chǔ)路徑(持有路徑)以及必要的管理信息。分享關(guān)系表與持有關(guān)系表類似,存儲(chǔ)了用戶編號(hào)、對(duì)象編號(hào)、對(duì)象哈希值以及分享的狀態(tài)信息(包括分享狀態(tài)、分享時(shí)間、分享鏈接等)。持有關(guān)系表和分享關(guān)系表中都有隨機(jī)數(shù)字段,用于判斷和校驗(yàn)文件的持有狀態(tài)和分享狀態(tài)是否有效。
圖3 數(shù)據(jù)庫E-R圖
筆者將最基礎(chǔ)的存儲(chǔ)邏輯封裝成OpenstackTool工具類,實(shí)現(xiàn)了請(qǐng)求認(rèn)證、創(chuàng)建容器、新建目錄、上傳文件、下載文件、刪除文件、復(fù)制文件等基本功能。其中upload()方法實(shí)現(xiàn)了文件上傳功能,它將Swift請(qǐng)求認(rèn)證得到的token、對(duì)象類型、對(duì)象名作為PUT請(qǐng)求頭部參數(shù),把待上傳文件作為PUT請(qǐng)求體,向Swift的代理節(jié)點(diǎn)發(fā)送PUT請(qǐng)求。download()方法實(shí)現(xiàn)了文件下載功能,它將token、待下載對(duì)象名、對(duì)象類型、對(duì)象大小作為GET請(qǐng)求參數(shù),向Swift代理節(jié)點(diǎn)發(fā)送GET請(qǐng)求,返回目標(biāo)文件內(nèi)容。deleteFile()方法實(shí)現(xiàn)的是刪除文件功能,它把容器名、目錄名、待刪除的對(duì)象名拼接在Swift URL中,將token作為請(qǐng)求頭部參數(shù),向Swift節(jié)點(diǎn)發(fā)送DELETE請(qǐng)求,如果文件刪除將返回成功,否則返回錯(cuò)誤信息。copyFile()方法實(shí)現(xiàn)了文件復(fù)制功能,它將目標(biāo)路徑、目標(biāo)對(duì)象名拼接到Swift URL之后,把token、源對(duì)象、對(duì)象大?。◤?fù)制操作時(shí),對(duì)象大小設(shè)置為0)作為PUT請(qǐng)求頭部參數(shù),向Swift代理節(jié)點(diǎn)發(fā)送PUT請(qǐng)求。
由于去重的邏輯滲透于課件管理子系統(tǒng)的文件上傳、文件分享、文件轉(zhuǎn)存、文件刪除等環(huán)節(jié)中,因此作者通過三個(gè)類中的四個(gè)方法來實(shí)現(xiàn)去重邏輯。首先是UploadController類中的actionUpload()方法,實(shí)現(xiàn)了上傳中檢測(cè)重復(fù)文件、遇重復(fù)文件秒傳的去重邏輯。它先將待上傳文件的哈希值作為查詢條件,到數(shù)據(jù)庫中查詢?cè)撐募欠駷橹貜?fù)文件。若是,則向數(shù)據(jù)庫持有關(guān)系表中添加一條新記錄,將原對(duì)象與當(dāng)前用戶相關(guān)聯(lián),并把對(duì)象的持有計(jì)數(shù)加1;若否,則在對(duì)象表中插入一個(gè)新對(duì)象記錄,再向持有關(guān)系表插入新持有記錄,最后調(diào)用OpenstackTool工具類中的upload()方法將文件上傳到Swift集群。其次是ShareController類中的actionShare()方法,實(shí)現(xiàn)了向指定用戶分享文件時(shí)的去重邏輯。它會(huì)為每一個(gè)分享目標(biāo)用戶在分享關(guān)系表中新建一條分享記錄,再更新持有此文件的用戶的持有記錄,將共享狀態(tài)設(shè)置成已共享的狀態(tài)。此信息只有分享者有權(quán)限修改或者刪除。actionSave()方法,實(shí)現(xiàn)了用戶轉(zhuǎn)存共享文件時(shí)的去重邏輯。它根據(jù)分享信息,為用戶生成一條持有信息,并將相應(yīng)對(duì)象的持有計(jì)數(shù)加1。這樣,即使原用戶刪除或者停止共享該文件對(duì)象,當(dāng)前用戶也依舊持有該文件。最后是NetDiskTool工具類中的deleteSingleFile()方法,實(shí)現(xiàn)了刪除文件時(shí)的去重邏輯。由于Swift集群中只保存了一份文件及其相應(yīng)副本,deleteSingleFile()方法在刪除文件前,會(huì)判斷它的持有計(jì)數(shù),如果計(jì)數(shù)大于1,則說明還有別的用戶持有此文件,此時(shí)僅刪除與此用戶相關(guān)的持有記錄,并將該對(duì)象的持有計(jì)數(shù)減1。如果計(jì)數(shù)小于等于1,說明此用戶是持有該對(duì)象的最后一個(gè)用戶,此時(shí)不僅要?jiǎng)h除該用戶的持有記錄,還要?jiǎng)h除Swift集群中存儲(chǔ)的對(duì)象和對(duì)象表中的對(duì)象記錄。
筆者首先對(duì)Swift集群進(jìn)行了測(cè)試,以確保存儲(chǔ)層可以正常工作并能夠通過RESTful API對(duì)外提供服務(wù)。然后對(duì)課件管理子系統(tǒng)進(jìn)行測(cè)試,重點(diǎn)測(cè)試與去重策略相關(guān)的若干功能。
Swift集群部署在4臺(tái)PC服務(wù)器上,其中一臺(tái)部署為Swift代理節(jié)點(diǎn),三臺(tái)部署為Swift存儲(chǔ)節(jié)點(diǎn)。4臺(tái)服務(wù)器均處于私網(wǎng)環(huán)境,需要遠(yuǎn)程登錄到Web服務(wù)器上才能對(duì)其進(jìn)行測(cè)試。
筆者首先使用Swift提供的命令行工具對(duì)Swift集群的可用性進(jìn)行測(cè)試。使用“swift upload”命令上傳測(cè)試文件,然后使用“swift list”命令查看已上傳的文件。如圖4所示。
圖4 Swift基礎(chǔ)功能測(cè)試
使用curl命令,向Swift發(fā)送GET請(qǐng)求,下載剛才的測(cè)試文件,并另存為downloaded-test.txt。如圖5所示。
圖5 Swift API測(cè)試
通過測(cè)試,說明Swift集群搭建完成,并且可能通過RESRful API對(duì)外提供服務(wù)。
課件管理子系統(tǒng)部署在Web服務(wù)器上,此服務(wù)器通過雙網(wǎng)卡來實(shí)現(xiàn)內(nèi)外網(wǎng)的聯(lián)通。首先測(cè)試通過外網(wǎng)訪問課件管理子系統(tǒng),然后測(cè)試系統(tǒng)是否可以調(diào)用Swift接口來存儲(chǔ)文件。如圖6圖7圖8所示。
圖6 課件管理子系統(tǒng)上傳結(jié)果
通過測(cè)試,說明課件管理子系統(tǒng)不僅能夠從外網(wǎng)訪問,還可以調(diào)用私網(wǎng)的Swift存儲(chǔ)服務(wù)。
將4.2中的測(cè)試文件改名后,使用課件管理子系統(tǒng)再次上傳同一文件,然后通過“swift list”命令查看Swift集群中保存了幾份文件,通過SQL語句查詢對(duì)象表中的記錄數(shù)和持有關(guān)系表的記錄數(shù)。如圖9圖10所示。
圖7 上傳后對(duì)象表記錄情況
圖8 上傳后持有表記錄情況
圖9 上傳重復(fù)文件后對(duì)象表記錄情況
圖10 上傳重復(fù)文件后持有關(guān)系表記錄情況
然后使用分享和轉(zhuǎn)存功能,將此文件分享給用戶B,用戶B將文件轉(zhuǎn)存到自己的目錄。分別通過“swift list”命令和SQL語句,查詢Swift集群中的文件數(shù)以及對(duì)象表中的記錄、持有關(guān)系表的記錄、分享關(guān)系表的記錄。如圖11圖12圖13圖14所示。
圖11 分享文件后分享關(guān)系表記錄情況
圖12 轉(zhuǎn)存文件后對(duì)象表記錄情況
圖13 轉(zhuǎn)存文件后持有關(guān)系表記錄情況
圖14 Swift中各對(duì)象情況
通過測(cè)試,筆者提出的去重策略有效地避免了Swift集群中出現(xiàn)冗余文件,減少了Swift集群的壓力,達(dá)到了預(yù)期的效果。
筆者發(fā)現(xiàn)當(dāng)前主流的云存儲(chǔ)組件對(duì)重復(fù)上傳的文件不進(jìn)行任何處理,如果直接應(yīng)用于網(wǎng)盤應(yīng)用的開發(fā),將會(huì)產(chǎn)生大量的重復(fù)文件,占用存儲(chǔ)資源、消耗網(wǎng)絡(luò)帶寬、影響用戶體驗(yàn)。于是作者基于Swift云存儲(chǔ)組件,使用PHP的開發(fā)框架,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)針對(duì)文件冗余的去重方法。該方法在文件上傳云之前進(jìn)行重復(fù)文件的判斷,通過業(yè)務(wù)邏輯實(shí)現(xiàn)對(duì)Swift集群中已有的文件進(jìn)行共享和轉(zhuǎn)存操作,從源頭上消除了產(chǎn)生冗余的可能。但是當(dāng)前判斷重復(fù)文件的工作仍在服務(wù)器端進(jìn)行,仍會(huì)消耗網(wǎng)絡(luò)帶寬。下一步,應(yīng)開發(fā)相應(yīng)的客戶端,將判斷重復(fù)文件的工作轉(zhuǎn)移到客戶端,以減少帶寬的消耗,從而更好地改善用戶體驗(yàn)。
[1]Ghemawat S,Gobioff H,Leung S T.The Google File System[C].Nineteenth ACM Symposium on Operating Systems Principles.ACM,2003:29-43.
[2]Dean J,Ghemawat S.MapReduce:Simplified Data Processing on Large Clusters[C].Conference on Symposium on Opearting Systems Design&Implementation.USENIX Association,2008:10-10.
[3]Shvachko K,Kuang H,Radia S,et al.The Hadoop Distributed File System[C].MASS Storage Systems and Technologies.IEEE,2010:1-10.
[4]Amazon Web Services,Inc.Amazon Simple Storage Service文檔[EB/OL].https://aws.amazon.com/cn/documentation/s3/,2017-11-10.
[5]The OpenStack Foundation.OpenStack Documentation[EB/OL].https://docs.openstack.org/pike/,2017-11-10.
[6]李邐.淺析云計(jì)算背景下云存儲(chǔ)的優(yōu)勢(shì)與劣勢(shì)[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2013(23):18-19.
[7]百度百科.云存儲(chǔ)[EB/OL].https://baike.baidu.com/item/云存儲(chǔ),2017-11-10.
[8]Geek_Ma.Google文件系統(tǒng)(GFS)翻譯學(xué)習(xí)[EB/OL].http://www.cnblogs.com/geekma/archive/2013/06/09/3128372.html,2017-10-12.
[9]Prabhakar Chaganti.用Amazon Simple Storage Service(S3)在云中存儲(chǔ)數(shù)據(jù)[EB/OL].https://www.ibm.com/developerworks/cn/web/ar-cloudaws2/,2017-11-10
[10]Andrew Glover.使用Amazon S3云服務(wù)輕松實(shí)現(xiàn)存儲(chǔ)[EB/OL].https://www.ibm.com/developerworks/cn/java/j-s3/,2017-11-10.
[11]The OpenStack Foundation.OpenStack Wiki[EB/OL].https://wiki.openstack.org/wiki,2017-11-10.
[12]百度.百度網(wǎng)盤幫助中心[EB/OL].https://yun.baidu.com/disk/help,2017-11-10.
[13]騰訊.騰訊微云[EB/OL].https://www.weiyun.com/,2017-11-10.
[14]115科技.115幫助中心[EB/OL].http://115.com/115501,2017-11-10.