溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker五種存儲(chǔ)驅(qū)動(dòng)原理及應(yīng)用場(chǎng)景是怎樣的

發(fā)布時(shí)間:2021-12-03 17:18:33 來(lái)源:億速云 閱讀:130 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹Docker五種存儲(chǔ)驅(qū)動(dòng)原理及應(yīng)用場(chǎng)景是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

Docker最開(kāi)始采用AUFS作為文件系統(tǒng),也得益于AUFS分層的概念,實(shí)現(xiàn)了多個(gè)Container可以共享同一個(gè)image。但由于AUFS未并入Linux內(nèi)核,且只支持Ubuntu,考慮到兼容性問(wèn)題,在Docker 0.7版本中引入了存儲(chǔ)驅(qū)動(dòng), 目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五種存儲(chǔ)驅(qū)動(dòng)。就如Docker官網(wǎng)上說(shuō)的,沒(méi)有單一的驅(qū)動(dòng)適合所有的應(yīng)用場(chǎng)景,要根據(jù)不同的場(chǎng)景選擇合適的存儲(chǔ)驅(qū)動(dòng),才能有效的提高Docker的性能。如何選擇適合的存儲(chǔ)驅(qū)動(dòng),要先了解存儲(chǔ)驅(qū)動(dòng)原理才能更好的判斷,本文介紹一下Docker五種存儲(chǔ)驅(qū)動(dòng)原理詳解及應(yīng)用場(chǎng)景及IO性能測(cè)試的對(duì)比。在講原理前,先講一下寫(xiě)時(shí)復(fù)制和寫(xiě)時(shí)分配兩個(gè)技術(shù)。

一、原理說(shuō)明

寫(xiě)時(shí)復(fù)制(CoW)

所有驅(qū)動(dòng)都用到的技術(shù)——寫(xiě)時(shí)復(fù)制(CoW)。CoW就是copy-on-write,表示只在需要寫(xiě)時(shí)才去復(fù)制,這個(gè)是針對(duì)已有文件的修改場(chǎng)景。比如基于一個(gè)image啟動(dòng)多個(gè)Container,如果為每個(gè)Container都去分配一個(gè)image一樣的文件系統(tǒng),那么將會(huì)占用大量的磁盤(pán)空間。而CoW技術(shù)可以讓所有的容器共享image的文件系統(tǒng),所有數(shù)據(jù)都從image中讀取,只有當(dāng)要對(duì)文件進(jìn)行寫(xiě)操作時(shí),才從image里把要寫(xiě)的文件復(fù)制到自己的文件系統(tǒng)進(jìn)行修改。所以無(wú)論有多少個(gè)容器共享同一個(gè)image,所做的寫(xiě)操作都是對(duì)從image中復(fù)制到自己的文件系統(tǒng)中的復(fù)本上進(jìn)行,并不會(huì)修改image的源文件,且多個(gè)容器操作同一個(gè)文件,會(huì)在每個(gè)容器的文件系統(tǒng)里生成一個(gè)復(fù)本,每個(gè)容器修改的都是自己的復(fù)本,相互隔離,相互不影響。使用CoW可以有效的提高磁盤(pán)的利用率。

用時(shí)分配(allocate-on-demand)

而寫(xiě)時(shí)分配是用在原本沒(méi)有這個(gè)文件的場(chǎng)景,只有在要新寫(xiě)入一個(gè)文件時(shí)才分配空間,這樣可以提高存儲(chǔ)資源的利用率。比如啟動(dòng)一個(gè)容器,并不會(huì)為這個(gè)容器預(yù)分配一些磁盤(pán)空間,而是當(dāng)有新文件寫(xiě)入時(shí),才按需分配新空間。

AUFS

AUFS(AnotherUnionFS)是一種Union FS,是文件級(jí)的存儲(chǔ)驅(qū)動(dòng)。AUFS能透明覆蓋一或多個(gè)現(xiàn)有文件系統(tǒng)的層狀文件系統(tǒng),把多層合并成文件系統(tǒng)的單層表示。簡(jiǎn)單來(lái)說(shuō)就是支持將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下的文件系統(tǒng)。這種文件系統(tǒng)可以一層一層地疊加修改文件。無(wú)論底下有多少層都是只讀的,只有最上層的文件系統(tǒng)是可寫(xiě)的。當(dāng)需要修改一個(gè)文件時(shí),AUFS創(chuàng)建該文件的一個(gè)副本,使用CoW將文件從只讀層復(fù)制到可寫(xiě)層進(jìn)行修改,結(jié)果也保存在可寫(xiě)層。在Docker中,底下的只讀層就是image,可寫(xiě)層就是Container。

Overlay

Overlay是Linux內(nèi)核3.18后支持的,也是一種Union FS,和AUFS的多層不同的是Overlay只有兩層:一個(gè)upper文件系統(tǒng)和一個(gè)lower文件系統(tǒng),分別代表Docker的鏡像層和容器層。當(dāng)需要修改一個(gè)文件時(shí),使用CoW將文件從只讀的lower復(fù)制到可寫(xiě)的upper進(jìn)行修改,結(jié)果也保存在upper層。在Docker中,底下的只讀層就是image,可寫(xiě)層就是Container。

Device mapper

Device mapper是Linux內(nèi)核2.6.9后支持的,提供的一種從邏輯設(shè)備到物理設(shè)備的映射框架機(jī)制,在該機(jī)制下,用戶可以很方便的根據(jù)自己的需要制定實(shí)現(xiàn)存儲(chǔ)資源的管理策略。前面講的AUFS和OverlayFS都是文件級(jí)存儲(chǔ),而Device mapper是塊級(jí)存儲(chǔ),所有的操作都是直接對(duì)塊進(jìn)行操作,而不是文件。Device mapper驅(qū)動(dòng)會(huì)先在塊設(shè)備上創(chuàng)建一個(gè)資源池,然后在資源池上創(chuàng)建一個(gè)帶有文件系統(tǒng)的基本設(shè)備,所有鏡像都是這個(gè)基本設(shè)備的快照,而容器則是鏡像的快照。所以在容器里看到文件系統(tǒng)是資源池上基本設(shè)備的文件系統(tǒng)的快照,并不有為容器分配空間。當(dāng)要寫(xiě)入一個(gè)新文件時(shí),在容器的鏡像內(nèi)為其分配新的塊并寫(xiě)入數(shù)據(jù),這個(gè)叫用時(shí)分配。當(dāng)要修改已有文件時(shí),再使用CoW為容器快照分配塊空間,將要修改的數(shù)據(jù)復(fù)制到在容器快照中新的塊里再進(jìn)行修改。Device mapper 驅(qū)動(dòng)默認(rèn)會(huì)創(chuàng)建一個(gè)100G的文件包含鏡像和容器。每一個(gè)容器被限制在10G大小的卷內(nèi),可以自己配置調(diào)整。

Btrfs

Btrfs被稱(chēng)為下一代寫(xiě)時(shí)復(fù)制文件系統(tǒng),并入Linux內(nèi)核,也是文件級(jí)級(jí)存儲(chǔ),但可以像Device mapper一直接操作底層設(shè)備。Btrfs把文件系統(tǒng)的一部分配置為一個(gè)完整的子文件系統(tǒng),稱(chēng)之為subvolume 。那么采用 subvolume,一個(gè)大的文件系統(tǒng)可以被劃分為多個(gè)子文件系統(tǒng),這些子文件系統(tǒng)共享底層的設(shè)備空間,在需要磁盤(pán)空間時(shí)便從底層設(shè)備中分配,類(lèi)似應(yīng)用程序調(diào)用 malloc()分配內(nèi)存一樣。為了靈活利用設(shè)備空間,Btrfs 將磁盤(pán)空間劃分為多個(gè)chunk 。每個(gè)chunk可以使用不同的磁盤(pán)空間分配策略。比如某些chunk只存放metadata,某些chunk只存放數(shù)據(jù)。這種模型有很多優(yōu)點(diǎn),比如Btrfs支持動(dòng)態(tài)添加設(shè)備。用戶在系統(tǒng)中增加新的磁盤(pán)之后,可以使用Btrfs的命令將該設(shè)備添加到文件系統(tǒng)中。Btrfs把一個(gè)大的文件系統(tǒng)當(dāng)成一個(gè)資源池,配置成多個(gè)完整的子文件系統(tǒng),還可以往資源池里加新的子文件系統(tǒng),而基礎(chǔ)鏡像則是子文件系統(tǒng)的快照,每個(gè)子鏡像和容器都有自己的快照,這些快照則都是subvolume的快照。


當(dāng)寫(xiě)入一個(gè)新文件時(shí),為在容器的快照里為其分配一個(gè)新的數(shù)據(jù)塊,文件寫(xiě)在這個(gè)空間里,這個(gè)叫用時(shí)分配。而當(dāng)要修改已有文件時(shí),使用CoW復(fù)制分配一個(gè)新的原始數(shù)據(jù)和快照,在這個(gè)新分配的空間變更數(shù)據(jù),變結(jié)束再更新相關(guān)的數(shù)據(jù)結(jié)構(gòu)指向新子文件系統(tǒng)和快照,原來(lái)的原始數(shù)據(jù)和快照沒(méi)有指針指向,被覆蓋。

ZFS

ZFS 文件系統(tǒng)是一個(gè)革命性的全新的文件系統(tǒng),它從根本上改變了文件系統(tǒng)的管理方式,ZFS 完全拋棄了“卷管理”,不再創(chuàng)建虛擬的卷,而是把所有設(shè)備集中到一個(gè)存儲(chǔ)池中來(lái)進(jìn)行管理,用“存儲(chǔ)池”的概念來(lái)管理物理存儲(chǔ)空間。過(guò)去,文件系統(tǒng)都是構(gòu)建在物理設(shè)備之上的。為了管理這些物理設(shè)備,并為數(shù)據(jù)提供冗余,“卷管理”的概念提供了一個(gè)單設(shè)備的映像。而ZFS創(chuàng)建在虛擬的,被稱(chēng)為“zpools”的存儲(chǔ)池之上。每個(gè)存儲(chǔ)池由若干虛擬設(shè)備(virtual devices,vdevs)組成。這些虛擬設(shè)備可以是原始磁盤(pán),也可能是一個(gè)RAID1鏡像設(shè)備,或是非標(biāo)準(zhǔn)RAID等級(jí)的多磁盤(pán)組。于是zpool上的文件系統(tǒng)可以使用這些虛擬設(shè)備的總存儲(chǔ)容量。


下面看一下在Docker里ZFS的使用。首先從zpool里分配一個(gè)ZFS文件系統(tǒng)給鏡像的基礎(chǔ)層,而其他鏡像層則是這個(gè)ZFS文件系統(tǒng)快照的克隆,快照是只讀的,而克隆是可寫(xiě)的,當(dāng)容器啟動(dòng)時(shí)則在鏡像的最頂層生成一個(gè)可寫(xiě)層。


當(dāng)要寫(xiě)一個(gè)新文件時(shí),使用按需分配,一個(gè)新的數(shù)據(jù)快從zpool里生成,新的數(shù)據(jù)寫(xiě)入這個(gè)塊,而這個(gè)新空間存于容器(ZFS的克隆)里。
當(dāng)要修改一個(gè)已存在的文件時(shí),使用寫(xiě)時(shí)復(fù)制,分配一個(gè)新空間并把原始數(shù)據(jù)復(fù)制到新空間完成修改。

二、存儲(chǔ)驅(qū)動(dòng)的對(duì)比及適應(yīng)場(chǎng)景

AUFS VS Overlay

AUFS和Overlay都是聯(lián)合文件系統(tǒng),但AUFS有多層,而Overlay只有兩層,所以在做寫(xiě)時(shí)復(fù)制操作時(shí),如果文件比較大且存在比較低的層,則AUSF可能會(huì)慢一些。而且Overlay并入了linux kernel mainline,AUFS沒(méi)有,所以可能會(huì)比AUFS快。但Overlay還太年輕,要謹(jǐn)慎在生產(chǎn)使用。而AUFS做為docker的第一個(gè)存儲(chǔ)驅(qū)動(dòng),已經(jīng)有很長(zhǎng)的歷史,比較的穩(wěn)定,且在大量的生產(chǎn)中實(shí)踐過(guò),有較強(qiáng)的社區(qū)支持。目前開(kāi)源的DC/OS指定使用Overlay。

Overlay VS Device mapper

Overlay是文件級(jí)存儲(chǔ),Device mapper是塊級(jí)存儲(chǔ),當(dāng)文件特別大而修改的內(nèi)容很小,Overlay不管修改的內(nèi)容大小都會(huì)復(fù)制整個(gè)文件,對(duì)大文件進(jìn)行修改顯示要比小文件要消耗更多的時(shí)間,而塊級(jí)無(wú)論是大文件還是小文件都只復(fù)制需要修改的塊,并不是整個(gè)文件,在這種場(chǎng)景下,顯然device mapper要快一些。因?yàn)閴K級(jí)的是直接訪問(wèn)邏輯盤(pán),適合IO密集的場(chǎng)景。而對(duì)于程序內(nèi)部復(fù)雜,大并發(fā)但少I(mǎi)O的場(chǎng)景,Overlay的性能相對(duì)要強(qiáng)一些。

Device mapper VS Btrfs Driver VS ZFS

Device mapper和Btrfs都是直接對(duì)塊操作,都不支持共享存儲(chǔ),表示當(dāng)有多個(gè)容器讀同一個(gè)文件時(shí),需要生活多個(gè)復(fù)本,所以這種存儲(chǔ)驅(qū)動(dòng)不適合在高密度容器的PaaS平臺(tái)上使用。而且在很多容器啟停的情況下可能會(huì)導(dǎo)致磁盤(pán)溢出,造成主機(jī)不能工作。Device mapper不建議在生產(chǎn)使用。Btrfs在docker build可以很高效。
ZFS最初是為擁有大量?jī)?nèi)存的Salaris服務(wù)器設(shè)計(jì)的,所在在使用時(shí)對(duì)內(nèi)存會(huì)有影響,適合內(nèi)存大的環(huán)境。ZFS的COW使碎片化問(wèn)題更加嚴(yán)重,對(duì)于順序?qū)懮傻拇笪募?,如果以后隨機(jī)的對(duì)其中的一部分進(jìn)行了更改,那么這個(gè)文件在硬盤(pán)上的物理地址就變得不再連續(xù),未來(lái)的順序讀會(huì)變得性能比較差。ZFS支持多個(gè)容器共享一個(gè)緩存塊,適合PaaS和高密度的用戶場(chǎng)景。
 

三、IO性能對(duì)比

測(cè)試工具:IOzone(是一個(gè)文件系統(tǒng)的benchmark工具,可以測(cè)試不同的操作系統(tǒng)中文件系統(tǒng)的讀寫(xiě)性能)
測(cè)試場(chǎng)景:從4K到1G文件的順序和隨機(jī)IO性能
測(cè)試方法:基于不同的存儲(chǔ)驅(qū)動(dòng)啟動(dòng)容器,在容器內(nèi)安裝IOzone,執(zhí)行命令:

./iozone -a -n 4k -g 1g -i 0 -i 1 -i 2 -f /root/test.rar -Rb ./iozone.xls
測(cè)試項(xiàng)的定義和解釋

Write:測(cè)試向一個(gè)新文件寫(xiě)入的性能。
Re-write:測(cè)試向一個(gè)已存在的文件寫(xiě)入的性能。
Read:測(cè)試讀一個(gè)已存在的文件的性能。
Re-Read:測(cè)試讀一個(gè)最近讀過(guò)的文件的性能。
Random Read:測(cè)試讀一個(gè)文件中的隨機(jī)偏移量的性能。
Random Write:測(cè)試寫(xiě)一個(gè)文件中的隨機(jī)偏移量的性能。

通過(guò)以上的性能數(shù)據(jù)可以看到:

  • AUFS在讀的方面性能相比Overlay要差一些,但在寫(xiě)的方面性能比Overlay要好。

  • device mapper在512M以上文件的讀寫(xiě)性能都非常的差,但在512M以下的文件讀寫(xiě)性能都比較好。

  • btrfs在512M以上的文件讀寫(xiě)性能都非常好,但在512M以下的文件讀寫(xiě)性能相比其他的存儲(chǔ)驅(qū)動(dòng)都比較差。

  • ZFS整體的讀寫(xiě)性能相比其他的存儲(chǔ)驅(qū)動(dòng)都要差一些。 簡(jiǎn)單的測(cè)試了一些數(shù)據(jù),對(duì)測(cè)試出來(lái)的數(shù)據(jù)原理還需要進(jìn)一步的解析。

關(guān)于Docker五種存儲(chǔ)驅(qū)動(dòng)原理及應(yīng)用場(chǎng)景是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI