基于Docker的私有云系統(tǒng)的設(shè)計(jì)
摘要:隨著移動(dòng)設(shè)備的興起,數(shù)據(jù)與日劇增,每天都會(huì)產(chǎn)生大量的數(shù)據(jù)。云計(jì)算為中小型企業(yè)或者個(gè)人提供數(shù)據(jù)的存儲(chǔ)與計(jì)算服務(wù),節(jié)省了存儲(chǔ)計(jì)算成本。但是云計(jì)算帶來(lái)便利同時(shí)也存在一定的風(fēng)險(xiǎn),用戶一般將數(shù)據(jù)存儲(chǔ)在公有云中,而公有云系統(tǒng)中多個(gè)用戶共享計(jì)算資源,用戶無(wú)法確切地知道可控的資源運(yùn)行在何處,存儲(chǔ)在公有云中的數(shù)據(jù),有極大地風(fēng)險(xiǎn)被非法使用。本文在分析云安全風(fēng)險(xiǎn)的基礎(chǔ)上,提出一種基于Docker技術(shù)的私有云設(shè)計(jì)方案并進(jìn)行驗(yàn)證。
本文引用地址:http://www.ex-cimer.com/article/201603/288908.htm引言
未來(lái)幾年是個(gè)人云計(jì)算的時(shí)代,每個(gè)人每天都在使用著大數(shù)據(jù),是大數(shù)據(jù)中的一員。比如一個(gè)家庭拍攝的各種圖片、視頻和各種傳感器數(shù)據(jù),在一兩年很快就會(huì)達(dá)到TB級(jí),而且這樣的增長(zhǎng)速度會(huì)越來(lái)越快。隨著物聯(lián)網(wǎng)進(jìn)程的加快,每個(gè)人每天將產(chǎn)生大量的個(gè)人隱私數(shù)據(jù),這些數(shù)據(jù)可能包括健康數(shù)據(jù)、家電數(shù)據(jù)和個(gè)人移動(dòng)位置信息等等,人們會(huì)對(duì)這些數(shù)據(jù)的安全性更加關(guān)注,而公有云的劣勢(shì)將無(wú)限放大。研究開(kāi)發(fā)私有云系統(tǒng)將會(huì)從本質(zhì)上對(duì)這個(gè)問(wèn)題進(jìn)行一定的緩解。私有云相比于傳統(tǒng)的公有云有以下幾點(diǎn)好處:
第一點(diǎn),防止數(shù)據(jù)被竊取。公有云存儲(chǔ)服務(wù)往往是和用戶的某些平臺(tái)賬號(hào)綁定在一起的,或者與用戶的某個(gè)郵箱綁定在一起的,一旦平臺(tái)賬號(hào)或郵箱被黑客獲取,所有的數(shù)據(jù)就一覽無(wú)余了。再加之網(wǎng)絡(luò)上社工庫(kù)泛濫,很多用戶喜歡在各種網(wǎng)絡(luò)服務(wù)上使用相同的密碼,往往是某一個(gè)賬號(hào)失竊,所有數(shù)據(jù)全部暴露。
第二點(diǎn),防止數(shù)據(jù)被主動(dòng)泄漏。用戶將數(shù)據(jù)托管在第三方的云平臺(tái)上,無(wú)法保證云服務(wù)提供商不把用戶數(shù)據(jù)提供給其他人使用。
第三點(diǎn),防止數(shù)據(jù)遺失。2009年底微軟的SIDEKICK事件,導(dǎo)致郵件服務(wù)器中斷一周,而用戶數(shù)據(jù)卻未曾備份而丟失。還有2010年,阿里云服務(wù)器磁盤(pán)錯(cuò)誤,導(dǎo)致TeamCola數(shù)據(jù)丟失等等。
從以上幾點(diǎn)可以看到,構(gòu)建家庭私有云是非常必要的。能夠保證自己的私人數(shù)據(jù)與其他互聯(lián)網(wǎng)賬號(hào)無(wú)關(guān),不被搜索引擎索引,不被別人監(jiān)視。用戶部署的私有云能夠保證服務(wù)器運(yùn)行并做好數(shù)據(jù)備份。如果僅在家庭或公司內(nèi)部使用可以部署在內(nèi)網(wǎng),安全系數(shù)更高。
在私有云的環(huán)境下(如圖1所示),用戶的云端服務(wù)器再也不是云服務(wù)商所提供,而是用戶擁有自己的服務(wù)器,用戶可以使用手持終端與自己的私有云服務(wù)器隨時(shí)隨地通信。這種情況下,除了私有云服務(wù)器本身不可抗外力的因素,服務(wù)器與數(shù)據(jù)是百分之百安全的,用戶只需要利用APP登錄自己的云端服務(wù)器就可以實(shí)現(xiàn)私人數(shù)據(jù)的存儲(chǔ)與重要數(shù)據(jù)的同步。
1 Docker與Seafile的介紹
Docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類(lèi)似iPhone的 app)。幾乎沒(méi)有性能開(kāi)銷(xiāo),可以很容易地在機(jī)器和數(shù)據(jù)中心運(yùn)行。最重要的是,他們不依賴于任何語(yǔ)言、框架或包裝系統(tǒng)。Docker能簡(jiǎn)化我們的云存儲(chǔ)搭建過(guò)程,還能使其更安全地運(yùn)行,更方便的維護(hù)。
Docker共享一個(gè)操作系統(tǒng),使用容器的概念抽象起來(lái),可以將Docker理解成一種沙盒(Sandbox),每個(gè)Docker容器內(nèi)運(yùn)行一個(gè)應(yīng)用,不同容器之間互相隔離,每個(gè)容器擁有自己的IP地址,并且可以在網(wǎng)絡(luò)中被識(shí)別。因此Docker容器是一個(gè)可訪問(wèn)網(wǎng)絡(luò)的獨(dú)立設(shè)備,這在概念上類(lèi)似于虛擬機(jī),使得Docker容器與傳統(tǒng)的chroot的概念不同。Docker技術(shù)可以使容器跨越物理機(jī)器的障礙,不同主機(jī)之間的容器可以建立通信機(jī)制,可以實(shí)現(xiàn)用戶應(yīng)用數(shù)據(jù)更好的備份,可以簡(jiǎn)化分布式系統(tǒng)構(gòu)建的過(guò)程,如圖2所示。Docker作為一種操作系統(tǒng)層次上的虛擬化方式,不需要額外的虛擬機(jī)管理應(yīng)用和虛擬機(jī)操作系統(tǒng),Docker可以直接復(fù)用本地物理主機(jī)的操作系統(tǒng),因此更加輕量級(jí),可以大大減少對(duì)硬件配置的要求。比起傳統(tǒng)的虛擬機(jī)技術(shù)有很多新的特性,表1是Docker與傳統(tǒng)的虛擬機(jī)技術(shù)在特性上的比較。
Docker提供了一種靈活的分層技術(shù),你可以使用所需的組件來(lái)配置自己的容器。有一個(gè)叫作層的容器組件,一層就是一個(gè)容器鏡像。一般從基礎(chǔ)層開(kāi)始,基礎(chǔ)層通常就是你想在容器中使用的操作系統(tǒng)的類(lèi)型(容器管理器只提供您所需的操作系統(tǒng)的部分,并非主機(jī)操作系統(tǒng))。如果想在容器中運(yùn)行其他腳本文件,需要構(gòu)建容器的配置和增加層。這樣使得程序的開(kāi)發(fā)使用是十分靈活的。例如在圖2中,一個(gè)應(yīng)用程序或服務(wù)容器需要PHP 5.5框架,就需要配置相應(yīng)的容器。另一個(gè)應(yīng)用程序或者服務(wù)需要PHP5.6框架,同樣僅需利用PHP 5.6配置對(duì)應(yīng)的容器即可。它不像虛擬機(jī)那樣,改變當(dāng)前運(yùn)行的版本時(shí)需要進(jìn)行大量的配置和安裝步驟。利用容器,僅需在容器配置文件過(guò)程中重新定義下該層即可。
Seafile是2013年國(guó)內(nèi)一個(gè)團(tuán)隊(duì)開(kāi)發(fā)的開(kāi)源云存儲(chǔ)系統(tǒng),提供了豐富的文件同步和管理功能,還有更好的數(shù)據(jù)隱私保護(hù)以及群組協(xié)作功能。在本文中,利用Seafile實(shí)現(xiàn)用戶對(duì)數(shù)據(jù)的上傳、下載、同步功能。除此之外,Seafile還有完善的隱私保護(hù),用你的密碼來(lái)加密文件,實(shí)現(xiàn)共享,可靠的文件儲(chǔ)存,完整的快照、恢復(fù)說(shuō)明,支持實(shí)時(shí)數(shù)據(jù)備份。提供操作歷史、鏡像恢復(fù)功能,可恢復(fù)在指定時(shí)間內(nèi)被刪除的文件,減少誤操作的影響,日志功能齊全,便于審計(jì),免費(fèi)并易于部署,界面友好。
2 私有云系統(tǒng)構(gòu)建
分析本系統(tǒng)可知,主要是數(shù)據(jù)的存儲(chǔ)和管理,所以由兩層組成:數(shù)據(jù)存儲(chǔ)層和服務(wù)提供層。
2.1 分布式存儲(chǔ)環(huán)境建立
本項(xiàng)目中,以Docker容器為計(jì)算存儲(chǔ)節(jié)點(diǎn),構(gòu)建分布式環(huán)境,采用的分布式文件系統(tǒng)為MooseFS。MooseFS是一款網(wǎng)絡(luò)分布式文件系統(tǒng)。它把數(shù)據(jù)分散在多臺(tái)服務(wù)器上,但對(duì)于用戶來(lái)講,看到的只是一個(gè)源。MFS像其他類(lèi)unix文件系統(tǒng)一樣,包含了層級(jí)結(jié)構(gòu)(目錄樹(shù)),存儲(chǔ)著文件屬性(權(quán)限,最后訪問(wèn)和修改時(shí)間),可以創(chuàng)建特殊的文件(塊設(shè)備、字符設(shè)備、管道和套接字),符號(hào)鏈接,硬鏈接。在圖3中可以看到,數(shù)據(jù)存儲(chǔ)層使用的是MooseFS文件系統(tǒng),主要由Master、Metalogger和Chunkserver這些部分組成。master負(fù)責(zé)在整個(gè)系統(tǒng)中管理數(shù)據(jù)。是整個(gè)系統(tǒng)的維護(hù)者。Metalogger做master數(shù)據(jù)備份的節(jié)點(diǎn)。chunkserver是mfs系統(tǒng)中的數(shù)據(jù)存儲(chǔ)者,真正的用戶數(shù)據(jù)按照算法被分成chunk,并分發(fā)到各個(gè)chunkserver上,這樣就保證了數(shù)據(jù)的安全性,本項(xiàng)目中低層存儲(chǔ)部署的方案如圖3所示。
這里需要注意的一點(diǎn)是,MooseFS的客戶端程序也就是加載MooseFS磁盤(pán)系統(tǒng)的命令是使用fuse編寫(xiě)的,因此要想掛載MooseFS的服務(wù)器,必要的前提條件就是先安裝fuse,這樣編譯MooseFS的時(shí)候才能順利通過(guò)。接下來(lái),來(lái)看看此分布式文件的讀寫(xiě)過(guò)程。
讀取數(shù)據(jù)的時(shí)候分為六步,如圖4所示(圖中粗線為數(shù)據(jù)流方向,細(xì)線為控制消息方向)。首先應(yīng)用程序向客戶端發(fā)起訪問(wèn)請(qǐng)求,提交訪問(wèn)表(filename,byte range);然后客戶端將訪問(wèn)表轉(zhuǎn)換成可以識(shí)別的形式(filename,chunk index),然后發(fā)給master節(jié)點(diǎn);接下來(lái)master節(jié)點(diǎn)返回給客戶端數(shù)據(jù)塊句柄以及數(shù)據(jù)塊的位置;客戶端按照master節(jié)點(diǎn)提供的信息,發(fā)送數(shù)據(jù)塊句柄以及數(shù)據(jù)讀取范圍到相應(yīng)的chunkserver上;chunkserver將所請(qǐng)求的數(shù)據(jù)發(fā)回給客戶端;最后客戶端將數(shù)據(jù)拷貝到應(yīng)用程序中。
寫(xiě)入數(shù)據(jù)到MooseFS中比較復(fù)雜一些,共分為九步,如圖6所示。因?yàn)榉植际较到y(tǒng)中存在三個(gè)備份,在讀取數(shù)據(jù)的時(shí)候只需要從這三個(gè)其中之一讀取即可,但是寫(xiě)入數(shù)據(jù)的時(shí)候,必須往這三個(gè)備份里面都寫(xiě)入數(shù)據(jù)。首先,應(yīng)用程序發(fā)起寫(xiě)入數(shù)據(jù)的請(qǐng)求,將文件名與數(shù)據(jù)發(fā)送給客戶端;接下來(lái)客戶端將請(qǐng)求表(文件名,數(shù)據(jù))轉(zhuǎn)換成塊句柄(文件名,塊索引),然后發(fā)送給master節(jié)點(diǎn);master節(jié)點(diǎn)將塊句柄和三個(gè)備份的位置全部返回給客戶端;然后客戶端將數(shù)據(jù)寫(xiě)到所有待寫(xiě)Chunkserver的內(nèi)部buffer中;客戶端發(fā)送寫(xiě)指令到主備份Chunkserver,主備份Chunkserver按照一定的順序依次從buffer中把數(shù)據(jù)寫(xiě)入到數(shù)據(jù)塊中,主備份Chunkserver寫(xiě)入操作完成后,由主備份Chunkserver發(fā)送同樣寫(xiě)操作指令給次備份Chunkserver執(zhí)行寫(xiě)任務(wù),次備份Chunkserver寫(xiě)入數(shù)據(jù)完成后,向主備份Chunkserver報(bào)告寫(xiě)入狀態(tài),然后主備份Chunkserver向客戶端返回寫(xiě)入狀態(tài)。如果以上任意一個(gè)Chunkserver寫(xiě)入失敗,客戶端會(huì)建議新的節(jié)點(diǎn)進(jìn)行再次寫(xiě)入。
2.2 用戶接口通信模塊設(shè)計(jì)
與用戶交互的接口主要使用Seafile完成。Seafile服務(wù)端主要由Httpserver、Seahub、Seafile 、Ccnet和Task Deamon這幾大模塊組成。這幾個(gè)模塊的功能是:Ccnet主要負(fù)責(zé)通信,是內(nèi)部的RPC服務(wù)進(jìn)程,連接其他幾個(gè)組件;Seahub主要提供網(wǎng)頁(yè)頁(yè)面,供用戶管理自己在服務(wù)器上的數(shù)據(jù)和賬戶信息;Httpserver主要負(fù)責(zé)網(wǎng)頁(yè)端的文件上傳與下載;Seafile是整個(gè)架構(gòu)的核心,其功能是實(shí)現(xiàn)對(duì)原始文件的上傳、下載和同步,是整個(gè)框架進(jìn)行數(shù)據(jù)處理的實(shí)際執(zhí)行者;Task Deamon主要處理后臺(tái)郵件收發(fā)等任務(wù)。在模塊的實(shí)現(xiàn)方面,Ccnet、Seafile和HttpServer這三個(gè)模塊,主要使用C語(yǔ)言編寫(xiě),架構(gòu)上主要采用libevent事件循環(huán)與線程池處理異步任務(wù)。Seahub使用python Django框架實(shí)現(xiàn),主要通過(guò)一個(gè)輕量級(jí)的python http服務(wù)器Gunicorn來(lái)提供網(wǎng)站支持服務(wù),Seahub是作為Gunicorn一個(gè)進(jìn)程來(lái)運(yùn)行。Task Deamon主要采用python實(shí)現(xiàn)。Seafile的架構(gòu)如圖6所示。
3 整體系統(tǒng)搭建與測(cè)試
本項(xiàng)目從小型化、易使用的角度出發(fā),針對(duì)的環(huán)境主要是家庭,綜合考慮之下,使用的硬件為Wandboard Quad作為私有云的運(yùn)行環(huán)境,Wandboard Quad是一塊ARM開(kāi)發(fā)板,其配置如圖7所示。
采用Wandboard Quad的原因主要是由于它支持SATA接口,這樣就可以將大容量廉價(jià)的硬盤(pán)接入開(kāi)發(fā)板中做私有云系統(tǒng)的存儲(chǔ)設(shè)備。系統(tǒng)整體的測(cè)試架構(gòu)如圖7所示。利用Docker容器技術(shù)將計(jì)算資源有效整合,擴(kuò)充出五個(gè)節(jié)點(diǎn),然后在此基礎(chǔ)上利用MooseFS文件系統(tǒng)實(shí)現(xiàn)對(duì)單機(jī)資源的有效利用,實(shí)現(xiàn)對(duì)分塊區(qū)域的高效使用,而且此系統(tǒng)也可與其他系統(tǒng)進(jìn)行動(dòng)態(tài)擴(kuò)展,可以實(shí)現(xiàn)高的容錯(cuò)。然后在結(jié)合Seafile云存儲(chǔ)系統(tǒng)實(shí)現(xiàn)對(duì)松散資源的集中管理,加密存儲(chǔ),從某種意義上解決了傳統(tǒng)存儲(chǔ)存在空間、加密和共享上的瓶頸。實(shí)現(xiàn)了私有云存儲(chǔ)系統(tǒng),保證了數(shù)據(jù)的隱私性,且易于擴(kuò)展。
在測(cè)試中,在Wandboard Quad開(kāi)發(fā)板上移植Ubuntu系統(tǒng)鏡像,然后編譯Linux內(nèi)核使得內(nèi)核版本在Linux3.8以上,再編譯Uboot,設(shè)置系統(tǒng)啟動(dòng)參數(shù)。本項(xiàng)目中為了便于調(diào)試,采用tftp的方式進(jìn)行Linux系統(tǒng)的啟動(dòng),系統(tǒng)的內(nèi)核鏡像從上位機(jī)交叉開(kāi)發(fā)環(huán)境/tftpboot/Wandboard目錄下獲取內(nèi)核鏡像。首次啟動(dòng)開(kāi)發(fā)板,進(jìn)入U(xiǎn)boot環(huán)境需要設(shè)置參數(shù),其具體的參數(shù)如下:
setenv ethact sms0
setenv ethaddr 00:10:75:2A:AE:E0
setenv gatewayip 10.234.56.1
setenv netmask 255.255.255.0
setenv serverip 10.234.56.32
setenv usbethaddr 00:10:75:2A:AE:E0
setenv ipaddr 10.234.56.120
setenv bootargs console=${console},${baudrate} ${optargs} root=/dev/ram video=${video}
usb start
tftp 0x40008000 Wandboard/zImage
bootm
經(jīng)過(guò)上面的一系列工作完成后。Ubuntu系統(tǒng)就可以成功在Wandboard Quad開(kāi)發(fā)板上運(yùn)行,然后再進(jìn)行網(wǎng)絡(luò)環(huán)境的配置,接下來(lái)繼續(xù)移植Docker到Wandboard Quad開(kāi)發(fā)板,接下來(lái)再完成MooseFS分布式系統(tǒng)的構(gòu)建,分布式系統(tǒng)的Master節(jié)點(diǎn)擔(dān)任seafile服務(wù)器的角色。用戶訪問(wèn)私有云的時(shí)候,docker通過(guò)內(nèi)部的端口映射,直接可以將用戶的請(qǐng)求發(fā)送到內(nèi)部的master節(jié)點(diǎn)上,然后由master節(jié)點(diǎn)完成數(shù)據(jù)的存儲(chǔ)訪問(wèn)任務(wù)。
4 總結(jié)
本文以最新的容器化技術(shù)Docker為基礎(chǔ)搭建私有云存儲(chǔ)系統(tǒng),致力于解決家庭環(huán)境中,數(shù)據(jù)存儲(chǔ)的問(wèn)題。以小型化、易部署為目標(biāo),在Wandboard Quad開(kāi)發(fā)板上搭建驗(yàn)證。本系統(tǒng)可以實(shí)現(xiàn)家庭用戶對(duì)數(shù)據(jù)存儲(chǔ)的需求,而且便攜,占用的面積較少,而且采用Docker技術(shù),系統(tǒng)的可集成度很高,當(dāng)用戶需要添加某個(gè)應(yīng)用時(shí),可以直接創(chuàng)建一個(gè)Docker容器,直接運(yùn)行,不用考慮兼容性的問(wèn)題,極大地簡(jiǎn)化了部署服務(wù)的周期,并且,為了數(shù)據(jù)的可靠性,防止單點(diǎn)硬件故障,用戶可以使用兩塊Wandboard Quad板進(jìn)行部署,或者多塊,利用MooseFS分布式系統(tǒng)的容錯(cuò)性,可以實(shí)現(xiàn)多數(shù)據(jù)的高可靠性地存儲(chǔ)。
參考文獻(xiàn):
[1]Smart City Planning in the Era of Big Data: International Experience.2014.10
[2]http://en.wikipedia.org/wiki/Docker_(software)
[3]https://github.com/docker/libcontainer
[4]https://crosbymichael.com/the-lost-packages-of-docker.html
[5]楊保華,戴王劍,曹亞侖.《Docker技術(shù)入門(mén)與實(shí)戰(zhàn)》.2015.2機(jī)械工業(yè)出版社.
[6](日)池田宗廣,大巖尚宏,島本裕志等。Linux內(nèi)核精髓。機(jī)械工業(yè)出版社華章公司。2013.6
[7]Daniel P. Bovet, Marco Cesati. Understanding the Linux Kernel, 3rd Edition. O'Reilly, 2005
[8]http://mkaczanowski.com/building-arm-cluster-part-2-create-and-write-system-image-with-goback/
本文來(lái)源于中國(guó)科技期刊《電子產(chǎn)品世界》2016年第3期第46頁(yè),歡迎您寫(xiě)論文時(shí)引用,并注明出處。
評(píng)論