韋偉 于兆勇 李冰利
摘? 要: 近些年各個(gè)領(lǐng)域的數(shù)據(jù)都出現(xiàn)爆炸性的增長(zhǎng), 而市面上為用戶(hù)提供的存儲(chǔ)服務(wù)也越來(lái)越多,但大多數(shù)存在存儲(chǔ)容量受限,增加容量時(shí)價(jià)格昂貴,災(zāi)備空間有限等問(wèn)題。文章研究了Linux的一個(gè)內(nèi)核模塊Network Block Device(NBD),并利用NBD來(lái)實(shí)現(xiàn)遠(yuǎn)程存儲(chǔ)設(shè)備在本地服務(wù)器上的彈性?huà)燧d,從而實(shí)現(xiàn)本地服務(wù)的彈性擴(kuò)容。
關(guān)鍵詞: Linux內(nèi)核; 內(nèi)核模塊; 網(wǎng)絡(luò)塊設(shè)備; 存儲(chǔ)
中圖分類(lèi)號(hào):TP399? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? 文章編號(hào):1006-8228(2021)07-28-03
Discussion on the elastic expansion using Network Block Device
Wei Wei, Yu Zhaoyong, Li Bingli
(AVIC The First Aircraft Institute, Xi'an, Shannxi 710089, China)
Abstract: In recent years, the data in various fields are explosively increased, and the storage services available for users have being more and more, but most of them have the problems of limited storage capacity, high price when increasing capacity, limited disaster recovery space and so on. This paper studies Network Block Device (NBD), a kernel module of Linux, and uses NBD to realize the elastic mounting of remote storage devices on local servers, so as to realize the elastic expansion of local services.
Key words: Linux kernel; kernel module; Network Block Device; storage
0 引言
目前,互聯(lián)網(wǎng)蓬勃發(fā)展,大數(shù)據(jù)時(shí)代已悄然來(lái)臨。各行各業(yè),無(wú)時(shí)無(wú)刻都會(huì)有巨大的數(shù)據(jù)量產(chǎn)生,這些數(shù)據(jù)也包括個(gè)人日常生活產(chǎn)生的數(shù)據(jù),與每個(gè)人息息相關(guān)。
數(shù)據(jù)是無(wú)限的財(cái)富,如果應(yīng)用好這些大數(shù)據(jù),將會(huì)給企業(yè)和個(gè)人帶來(lái)意想不到的收獲及驚喜。但是想要更好地分析應(yīng)用這些數(shù)據(jù),首先就要使數(shù)據(jù)得到便捷安全的存儲(chǔ)。目前市面上為用戶(hù)提供的存儲(chǔ)服務(wù)有很多,各自都有其不同的特點(diǎn),但大多數(shù)存在存儲(chǔ)容量受限,增加容量或者限時(shí)價(jià)格昂貴,或者單個(gè)文件傳輸大小受到一定限制,災(zāi)備空間有限等問(wèn)題。本文重點(diǎn)研究Linux內(nèi)核模塊中的網(wǎng)絡(luò)塊設(shè)備N(xiāo)BD(Network Block Device),利用網(wǎng)絡(luò)塊設(shè)備來(lái)實(shí)現(xiàn)本地服務(wù)器上的彈性?huà)燧d,從而實(shí)現(xiàn)本地服務(wù)的擴(kuò)容。
1 Linux內(nèi)核
Linux為開(kāi)源電腦操作系統(tǒng)內(nèi)核,最早Linux內(nèi)核是90年代初由Linus發(fā)布的,其采取開(kāi)源社區(qū)的形式,全球無(wú)數(shù)程序員每天都在為內(nèi)核中無(wú)償?shù)奶峁┧枷牒痛a的幫助,使得Linux內(nèi)核變得越來(lái)越強(qiáng)大,現(xiàn)在已經(jīng)發(fā)展到最新的5.5版本,是一個(gè)成熟的商用的操作系統(tǒng)。
Linux內(nèi)核結(jié)構(gòu)示意圖如圖1所示。包括兩個(gè)方面,一個(gè)是用戶(hù)空間,另一個(gè)是內(nèi)核空間。用戶(hù)空間主要作用是運(yùn)行應(yīng)用程序,常用的是glibc庫(kù),它能夠封裝系統(tǒng)調(diào)用接口,用戶(hù)空間運(yùn)行的進(jìn)程有自己的獨(dú)立的虛擬地址空間,和內(nèi)核地址空間區(qū)分開(kāi)來(lái)。內(nèi)核地址空間有三層,分別是系統(tǒng)調(diào)用層、Linux內(nèi)核層和依賴(lài)體系結(jié)構(gòu)的代碼層。系統(tǒng)調(diào)用層為用戶(hù)和內(nèi)核空間通信通信提供方式;Linux內(nèi)核層是獨(dú)立于體系結(jié)構(gòu)的內(nèi)核代碼,它適用于任何體系結(jié)構(gòu);依賴(lài)體系結(jié)構(gòu)的代碼層(BSP)作用是兼容不用處理器或者平臺(tái)[1]。本文所研究的網(wǎng)絡(luò)塊設(shè)備N(xiāo)BD,位于Linux的內(nèi)核空間的內(nèi)核層。
2 網(wǎng)絡(luò)塊設(shè)備
網(wǎng)絡(luò)塊設(shè)備1997年由Pavel Machek開(kāi)發(fā)的,它是一個(gè)輕量級(jí)且快速的開(kāi)源網(wǎng)絡(luò)存儲(chǔ)軟件,能夠?qū)⑽挥谶h(yuǎn)端機(jī)器上的存儲(chǔ)空間映射為本地的虛擬磁盤(pán),提供給本地用戶(hù)使用。在大家的共同努力下,網(wǎng)絡(luò)塊設(shè)備越來(lái)越趨于成熟穩(wěn)定,而且能夠支持SMP、64位體系結(jié)構(gòu)等特性[2]。目前它是Linux內(nèi)核的規(guī)范組件,并且在一定的領(lǐng)域中被廣泛使用。它的主要作用能夠讓用戶(hù)通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)某個(gè)塊設(shè)或者設(shè)備鏡像。這個(gè)功能正好能夠很好解決用戶(hù)存在的存儲(chǔ)容量受限,或者單個(gè)文件傳輸大小受到一定的限制,容災(zāi)等問(wèn)題。
在Linux中,每個(gè)網(wǎng)絡(luò)塊設(shè)備均為一個(gè)node,通常,網(wǎng)絡(luò)塊設(shè)備訪(fǎng)問(wèn)的不是本地的物理存儲(chǔ),而是將遠(yuǎn)端的存儲(chǔ)設(shè)備映射成本地塊設(shè)備的虛擬驅(qū)動(dòng),實(shí)際訪(fǎng)問(wèn)的是掛載在本地的遠(yuǎn)端存儲(chǔ)設(shè)備[3]。也就是說(shuō),A用戶(hù)在本地能夠訪(fǎng)問(wèn)遠(yuǎn)端B用戶(hù)機(jī)器上的固定的物理磁盤(pán),這樣可以將資源最大化的使用起來(lái)。網(wǎng)絡(luò)塊設(shè)備包括客戶(hù)端和服務(wù)端兩部分,其基本原理如圖2所示。
2.1 網(wǎng)絡(luò)塊設(shè)備服務(wù)器端
nbd_server是網(wǎng)絡(luò)塊設(shè)備服務(wù)器端的核心對(duì)象,由channel這個(gè)通道對(duì)象來(lái)完成網(wǎng)絡(luò)傳輸,文件服務(wù)器fileserver來(lái)完成讀寫(xiě)數(shù)據(jù)集的操作[4]。服務(wù)器端最初一級(jí)的進(jìn)程初始化數(shù)據(jù)文件集和一些基本參數(shù)后進(jìn)行無(wú)限的循環(huán)等待,以接受來(lái)自不同用戶(hù)的登錄。有用戶(hù)登錄成功,產(chǎn)生第二級(jí)進(jìn)程,然后再派生出若干第三級(jí)線(xiàn)程,等待這些線(xiàn)程完成,線(xiàn)程全部結(jié)束則表示傳輸完畢。
2.2 網(wǎng)絡(luò)塊設(shè)備客戶(hù)端
網(wǎng)絡(luò)塊設(shè)備客戶(hù)端一方面是響應(yīng)塊設(shè)備的讀寫(xiě)請(qǐng)求的服務(wù)方,另一方面是服務(wù)器端的客戶(hù)方??蛻?hù)端上的驅(qū)動(dòng)程序主要完成與本地文件的交互,以及向網(wǎng)絡(luò)發(fā)送傳送讀寫(xiě)請(qǐng)求。網(wǎng)絡(luò)塊設(shè)備是基于TCP的網(wǎng)路傳輸,服務(wù)器端和客戶(hù)端通過(guò)BSD Socket接口實(shí)現(xiàn)網(wǎng)絡(luò)傳輸,Linux系統(tǒng)一般提供多達(dá)256個(gè)網(wǎng)絡(luò)塊設(shè)備[5]。
nbd_client為客戶(hù)端的核心對(duì)象,它獨(dú)立地完成和驅(qū)動(dòng)層的交互,其子對(duì)象Storageserver則來(lái)完成網(wǎng)絡(luò)傳輸,對(duì)象channel來(lái)完成傳輸通道的任務(wù)。這樣不僅可以使程序更加清晰,也可以在不同的對(duì)象上添加多種多樣的功能。
3 網(wǎng)絡(luò)塊設(shè)備使用
3.1 網(wǎng)絡(luò)塊設(shè)備服務(wù)器端的操作
⑴ 安裝nbd-server。
# apt-get install ndb-server
⑵ 服務(wù)器端啟動(dòng)nbd-server,監(jiān)聽(tīng)1234端口,使用nbd-disk0映像文件,即將/var/tmp/nbd-disk0這塊磁盤(pán)共享出來(lái),供客戶(hù)端共享使用。
# nbd-server 1234 /var/tmp/nbd-disk0
3.2 網(wǎng)絡(luò)塊設(shè)備客戶(hù)端的操作
⑴ 安裝 nbd-client。
# apt-get install nbd-client
⑵ 客戶(hù)端需要加載NBD模塊,否則不支持NBD功能。
# modprobe nbd
⑶ 查看NBD設(shè)備是否建立。
# lsmod | grep nbd? nbd 26400 0
⑷ 查看本機(jī)的NBD設(shè)備是否加載,不加載不可以使用。
# ls /dev/nbd* -hl
brw-r-----1 root disk 43, 0 Nov 27 06:40/dev/nbd0
⑸ 將/dev/nbd0設(shè)備與主機(jī)連接。/dev/nbd0是本機(jī)的一個(gè)磁盤(pán),192.168.1.1是服務(wù)器的IP,1234是服務(wù)器端共享NBD設(shè)備的端口。
# nbd-client 192.168.1.1 1234 /dev/nbd0
⑹ 連接成功后,可以查看到nbd-client進(jìn)程。
# ps -ef | grep nbd
root 3156 1 0 06:44 pts/0 00:00:00 nbd-client
192.168.1.1 1234 /dev/nbd0
# mkfs.ext3 /dev/nbd0 //需要格式化這個(gè)塊設(shè)備。
# mkdir /mnt/nbd0 //掛載這個(gè)塊設(shè)備。
# mount /dev/nbd0 /mnt/nbd0
# cd /mnt/nbd0
# nbd-client -d /dev/nbd0 //斷開(kāi)這個(gè)塊設(shè)備。
每次客戶(hù)端讀寫(xiě)網(wǎng)絡(luò)塊設(shè)備,網(wǎng)絡(luò)塊設(shè)備內(nèi)核驅(qū)動(dòng)將通過(guò)TCP發(fā)送請(qǐng)求,服務(wù)器端執(zhí)行請(qǐng)求,同時(shí)回復(fù)客戶(hù)端。它可以在低磁盤(pán)空間或者無(wú)磁盤(pán)空間的機(jī)器上使用,掛載其他服務(wù)器上的空間充當(dāng)自己的空間[6]。它和Linux內(nèi)核中的NFS 網(wǎng)絡(luò)文件系統(tǒng)(Network File System)不同,NFS能夠?qū)崿F(xiàn)通過(guò)網(wǎng)絡(luò)掛載各種文件系統(tǒng)并進(jìn)行訪(fǎng)問(wèn),但是它只能實(shí)現(xiàn)簡(jiǎn)單對(duì)文件系統(tǒng)內(nèi)的文件進(jìn)行讀寫(xiě)操作,不能進(jìn)行改變掛載點(diǎn)的分區(qū)格式這種更底層的操作。網(wǎng)絡(luò)塊設(shè)備則可以在客戶(hù)端虛擬的塊設(shè)備上創(chuàng)建任何的文件系統(tǒng),從而達(dá)到動(dòng)態(tài)彈性擴(kuò)容、災(zāi)備等目的。
4 驗(yàn)證測(cè)試結(jié)果
本次實(shí)驗(yàn)主要是測(cè)試在存儲(chǔ)容量不足時(shí),通過(guò)掛載三個(gè)網(wǎng)絡(luò)塊設(shè)備來(lái)實(shí)現(xiàn)動(dòng)態(tài)彈性擴(kuò)容,并且測(cè)試添加新的節(jié)點(diǎn)之后能否正常運(yùn)行以及對(duì)讀寫(xiě)速率的影響程度。
測(cè)試系統(tǒng)為三臺(tái)Linux客戶(hù)端和一臺(tái)Linux服務(wù)器,均運(yùn)行Ubuntu系統(tǒng),內(nèi)核版本都為linux5.5,Linux內(nèi)核中網(wǎng)絡(luò)塊設(shè)備版本為3.8,客戶(hù)端已經(jīng)加載網(wǎng)絡(luò)塊設(shè)備內(nèi)核模塊,該實(shí)驗(yàn)是在廣域網(wǎng)全雙工百兆網(wǎng)絡(luò)環(huán)境下進(jìn)行的。測(cè)試結(jié)果如表1所示。
從表1可以看出,通過(guò)掛載三個(gè)網(wǎng)絡(luò)塊設(shè)備來(lái)實(shí)現(xiàn)動(dòng)態(tài)彈性擴(kuò)容,并且添加新的節(jié)點(diǎn)之后不影響正常運(yùn)行并且對(duì)讀寫(xiě)速率的影響不大。
5 結(jié)束語(yǔ)
經(jīng)試驗(yàn)證明,Linux內(nèi)核中的網(wǎng)絡(luò)塊設(shè)備能夠很好的運(yùn)用遠(yuǎn)程存儲(chǔ)實(shí)現(xiàn)本地存儲(chǔ)的動(dòng)態(tài)擴(kuò)容,后期還可以?huà)燧d多余設(shè)備進(jìn)行災(zāi)備等實(shí)驗(yàn),這樣能很好解決本地存儲(chǔ)空間不足的問(wèn)題。這給目前海量數(shù)據(jù)存儲(chǔ)提出了一個(gè)新的思路,在提倡降本增效的今天,具有非常重要的意義。網(wǎng)絡(luò)塊設(shè)備還可以和其他的存儲(chǔ)架構(gòu)如Hadoop結(jié)合,在集群的基礎(chǔ)上實(shí)現(xiàn)彈性擴(kuò)容。
參考文獻(xiàn)(References):
[1] 陳莉君,康華.Linux操作系統(tǒng)原理與應(yīng)用[M].清華大學(xué)出版社,2006.
[2] Wikipedia. Network block device.2014,4,http://en.wikipedia.org/wiki/Network_block_device
[3] 馬琦,郭玉東.Linux下網(wǎng)絡(luò)塊設(shè)備的設(shè)計(jì)和實(shí)現(xiàn)[J].微機(jī)發(fā)展.2013.5:12-13,27
[4] 劉玉珍,單丹,連自鋒.Linux下網(wǎng)絡(luò)塊設(shè)備的研究與實(shí)現(xiàn)[J].世界科技研究與發(fā)展.2011.2:265-2
[5] 陳莉君,王森,康華. 日志結(jié)構(gòu)云存儲(chǔ)中緩存的設(shè)計(jì)與實(shí)現(xiàn)[J].西安郵電大學(xué)學(xué)報(bào),2013.18(5):76-80
[6] 韋偉,李冰利,張偉東.云存儲(chǔ)系統(tǒng)中網(wǎng)絡(luò)塊設(shè)備的研究和應(yīng)用[J].計(jì)算機(jī)與數(shù)字工程,2015.12:2243-2246