日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DOCKER存储驱动之DEVICE MAPPER简介

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DOCKER存储驱动之DEVICE MAPPER简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Device Mapper是一個基于kernel的框架,它增強了很多Linux上的高級卷管理技術。Docker的devicemapper驅動在鏡像和容器管理上,利用了該框架的超配和快照功能。為了區別,本文使用Device Mapper指驅動中的框架,而devicemapper指Docker的存儲驅動。
  注意:商業支持的Docker Engine(CS-Engine)建議在RHEL和CentOS上使用devicemapper存儲驅動。

AUFS之外的另一種選擇

  Docker最初運行在Ubuntu和Devian上,并且使用AUFS作為存儲后端。當Docker變得流行后,很多想使用它的公司正在使用RHEL。不幸的是,因為Linux主線kernel并不包含AUFS,所以RHEL并沒有支持AUFS。
  為了改變這種情況,Red Hat開發者研究將AUFS包含進kernel主線。最后,他們認為開發一種新的存儲后端是更好的主意。此外,他們打算使用已經存在的Device Mapper技術作為新存儲后端的基礎。
  Red Hat與Docker公司合作貢獻這個新驅動。因為這次合作,Docker Engine被重新設計為存儲驅動插件化。因此devicemapper成為Docker支持的第二個存儲驅動。
  Device Mapper在2.6.9之后就被何如Linux kernel主線,也是RHEL家族發布包的核心部分。這意味著devicemapper存儲驅動基于穩定的代碼,有著大量的工作產品和極強的社區支持。

鏡像分層和共享

  devicemapper驅動把每個鏡像和容器都存儲在它自己的虛擬設備中,這些設備是超配的copy-on-write快照設備。Device Mapper技術工作在塊級別而不是文件級別,也就是說devicemapper存儲驅動的超配和copy-on-write操作直接操作塊,而不是整個文件。
  注意:快照也是使用的thin設備或者虛擬設備。
  使用devicemapper時,Docker如下創建鏡像:
    devicemapper存儲驅動創建一個thin池。
    這個池是在塊設備或者loop mounted sparse file上創建的。
    然后創建一個基礎設備。
    該基礎設備是一個帶文件系統的thin設備??梢酝ㄟ^docker info命令中的Backing filesystem值,來查看后端使用的是哪種文件系統。
    每個新的鏡像(和鏡像層)都是該基礎設備的快照。
    這些都是超配的copy-on-write快照。也就是說它們初始化的時候是空的,只有在有數據寫向它們時,才會從池中消耗空間。
  使用devicemapper,容器層是基于鏡像的快照。和鏡像一樣,容器快照也是超配的copy-on-write快照。容器快照保存了容器的所有更新,當向容器寫數據時,devicemapper按需從池中分配空間給容器層。
  下圖展示了一個thin池、基礎設備和兩個鏡像。
  
  如果你仔細觀察圖片,你會發現每個鏡像層都是它下層的快照,鏡像的最底層是池中基礎設備的快照。這個基礎設備是Device Mapper產生的,并不是一個Docker鏡像層。
  而容器又是鏡像的一個快照,下圖展示了兩個容器在整個存儲驅動的層次。
  

devicemapper的讀操作

  下圖顯示了在一個容器中讀取一個塊(地址是0x44f)的過程。
  
    應用在容器中請求訪問塊0x44f。
    因為容器是鏡像的一個thin快照,它沒有實際的數據。但它有指針,指向鏡像棧中數據所在的鏡像快照。
    存儲驅動根據指針找到對應鏡像層a005的快照塊0xf33。
    devicemapper拷貝鏡像快照中塊0xf33的數據到容器內存中。
    容器驅動將數據返回給請求應用。

寫操作

   使用devicemapper驅動,寫數據到容器是通過一個按需分配操作來完成的。更新已有的數據使用了copy-on-write操作。不過Device Mapper是基于塊存儲的技術,所以這些操作都發生在塊的級別。
   例如,要對容器中的一個大文件作小的修改,devicemapper驅動不拷貝整個文件,它只拷貝要修改的內容對應的塊,每個塊大小為64KB。

寫數據

  向容器寫55KB的數據:
    應用向容器發起寫56KB數據的請求;
    按需分配操作給容器快照分配了一個新的64KB的塊。
    如果寫的數據大于64KB,就需要分配多個塊給容器快照。
    數據寫向新分配的塊。

覆寫已有數據

  第一次修改已有的數據:
    應用向容器發起修改數據的請求;
    copy-on-write操作定位到需要更新的塊;
    分配新的塊給容器快照,并拷貝數據到這些塊中;
    修改的數據寫向新分配的這些塊。
  容器中的應用并不會感知到這些按需分配和copy-on-write操作。然而,這些操作還是可能會對應用的讀寫帶來一些延遲。

Docker中配置devicemapper

  devicemapper是部分Linux發行版的默認Docker存儲驅動,這其中就包括RHEL和它的分支。當前,以前發行版支持該驅動:
   ●RHEL/CentOS/Fedora
   ●Ubuntu
   ●Debian
   ●Arch Linux
  Docker host使用loop-lvm的配置模式來運行devicemapper。該模式使用系數文件來創建thin池,這些池用于鏡像和容器快照。并且這些模式是開箱即用的,無需額外配置。不過,不建議在產品部署中使用loop-lvm模式。
  可以通過docker info命令來查看是否使用了該模式。

$?sudo?docker?infoContainers:?0Images:?0Storage?Driver:?devicemapperPool?Name:?docker-202:2-25220302-poolPool?Blocksize:?65.54?kBBacking?Filesystem:?xfs[...]Data?loop?file:?/var/lib/docker/devicemapper/devicemapper/dataMetadata?loop?file:?/var/lib/docker/devicemapper/devicemapper/metadataLibrary?Version:?1.02.93-RHEL7?(2015-01-28)[...]

  通過上面輸出可得出,Docker host使用devicemapper存儲驅動。并且,還使用了loop-lvm模式,因為/var/lib/docker/devicemapper/devicemapper下有Data loop file和Metadata loop file這兩個文件。這些都是loopback映射的稀疏文件。

在產品中配置direct-lvm模式

  產品部署中應該使用direct-lvm模式,該模式使用塊設備來創建thin池。下面的步驟描述了如何在Docker host使用direct-lvm模式得devicemapper存儲驅動。
  注意:如果你已經在Docker host上運行了Docker daemon,并且有一些想保存的鏡像,那么在執行以下步驟之前,把它們push到Docker Hub,或者你的私有Docker Registry。
  以下步驟會創建一個邏輯卷,配置為thin池,用作后端的存儲池。假設你有一個稀疏塊設備/dev/xvdf,并且該設備有足夠的空間來完成這個任務。在你的環境中,設備標識符和卷的大小可能不同,在你執行下面過程時,你應該替換為適合你環境的值。另外,以下的步驟應該在Docker Daemon停止的時候來執行。
   1) 進入Docker host,并停止Docker daemon;
   2) 安裝LVM2和thin-provisioning-tools安裝包;
   LVM2安裝包提供了用戶空間的工具,用于管理邏輯卷。
   thin-provisioning-tools用于激活和管理池。

#?on?Ubuntu$?sudo?apt?-y?install?lvm2#?On?CentOS$?sudo?yum?install?-y?lvm2

   3) 創建一個物理卷/dev/xvdf來替換塊設備;

$?pvcreate?/dev/xvdf

   4) 創建卷組docker;

$?vgcreate?docker?/dev/xvdf

   5) 創建名為thinpool和thinpoolmeta的虛擬卷;
   在該示例中,數據大小是docker卷組大小的95%,留下這些空閑空間,是用于數據或元數據的自動擴容。

$?lvcreate?--wipesignatures?y?-n?thinpool?docker?-l?95%VG$?lvcreate?--wipesignatures?y?-n?thinpoolmeta?docker?-l?1%VG

   6) 把池轉換為thin池;

$?lvconvert?-y?--zero?n?-c?512K?--thinpool?docker/thinpool?--poolmetadata?docker/thinpoolmeta

   7) 通過lvm文件來配置thin池的自動擴容;

$?vi?/etc/lvm/profile/docker-thinpool.profile

   8) 指定thin_pool_autoextend_threshold值;
   該值是lvm嘗試擴容到可用空間時,當前已空間使用量的百分比(100=禁止)。

thin_pool_autoextend_threshold?=?80

   9) 修改thin_pool_autoextend_percent;
   該值是thin池要擴容的百分比(100=禁止)。

thin_pool_autoextend_percent?=?20

   10) 檢查上面的步驟,你的docker-thinpool.profile文件應該是類似下面的內容:
   一個/etc/lvm/profile/docker-thinpool.profile示例文件:

activation?{ thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20 }

   11) 應用新的lvm profile文件;

$?lvchange?--metadataprofile?docker-thinpool?docker/thinpool

   12) 確認lv是否被修改;

$?lvs?-o+seg_monitor

   13) 如果之前Docker daemon被啟動過,那么需要將之前的graph driver目錄給挪走;
   移動graph driver會刪除所有的鏡像容器和卷。下面的命令將/var/lib/docker的內容移動到另一個目錄中。

$?mkdir?/var/lib/docker.bk $?mv?/var/lib/docker/*?/var/lib/docker.bk

   14) 使用特殊的devicemapper選項來配置Docker daemon;
   有兩種方法來配置Docker daemon的devicemapper存儲驅動。你可以運行daemon時加上以下參數:

--storage-driver=devicemapper?\--storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool?\--storage-opt=dm.use_deferred_removal=true?\--storage-opt=dm.use_deferred_deletion=true

   也可以在daemon配置文件中配置,如默認的配置文件/etc/docker/daemon.json中,可如下配置:

{"storage-driver":?"devicemapper","storage-opts":?[?????"dm.thinpooldev=/dev/mapper/docker-thinpool",?????"dm.use_deferred_removal=true",?????"dm.use_deferred_deletion=true"] }

   注意:總是使用dm.use_deferred_removal=true和dm.use_deferred_deletion=true選項,以防止無意地泄露映射資源信息。
   15) (可選的)如果使用了systemd,并且修改了daemon配置文件,需要重載systemd信息;

$?systemctl?daemon-reload

   16) 重啟Docker daemon。

$?systemctl?start?docker

  當你啟動Docker daemon后,確保一直監控者thin池和卷組的可用空間。當卷組自動擴容時,可能會占滿所有空間??梢允褂胠vs或lvs -a命令來監控邏輯卷,可以查看到數據和元數據的大小。另外,還可以使用vgs命令來監控卷組的可用空間。
  當到達閾值后,日志會顯示thin池的自動擴容信息,可使用以下命令來查看日志:

$?journalctl?-fu?dm-event.service

  當你確認你的配置文件無誤時,就可以刪除之前的備份目錄了。

$?rm?-rf?/var/lib/docker.bk

  你還可以使用dm.min_free_space參數。該值保證黨可用空間到達或者接近最小值時,操作失敗會有提示??梢圆榭锤嗟尿寗舆x項。

檢查devicemapper結構體

  可以通過lsblk命令查看devicemapper存儲驅動創建的pool相關的設備文件。

$?sudo?lsblkNAME???????????????MAJ:MIN?RM??SIZE?RO?TYPE?MOUNTPOINT xvda???????????????202:0????0????G??0?disk └─xvda1????????????202:1????0????G??0?part?/ xvdf???????????????202:80???0???0G??0?disk ├─vg--docker-data??????????253:0????0???0G??0?lvm │?└─docker-202:1-1032-pool?253:2????0???0G??0?dm └─vg--docker-metadata??????253:1????0????G??0?lvm└─docker-202:1-1032-pool?253:2????0???0G??0?dm

  下圖顯示了上面示例的鏡像信息。
  
  圖中,pool的名稱叫做Docker-202:1-1032-pool,橫跨data和metadata兩個設備。devicemapper的pool名稱格式為:

Docker-MAJ:MIN-INO-pool

  MAJ,MIN和INFO分別表示major、minor設備號,和inode號。
  有兩個主要的目錄。/var/lib/docker/devicemapper/mnt目錄包含鏡像和容器層的映射點。/var/lib/docker/devicemapper/metadata目錄為每個鏡像層和容器快照都對應了一個文件,文件以JSON格式保存每個快照的元數據。

Device Mapper和Docker性能

  理解按需分配和copy-on-write可以讓你對容器性能有個整體的了解。

按需分配性能影響

  devicemapper存儲驅動在按需分配操作時會給容器分配一個新的塊。也就是說每次應用向容器某個位置寫數據時,一個或多個塊就會從池里面分配,并且映射給容器。
  所有的塊都是64KB大小,一個小于64KB的寫請求也會導致分配64KB的塊,大于64KB的寫請求就要求多個64KB的塊。這會影響容器的性能,尤其容器有很多小的寫請求時。然而,一旦一個塊分配給容器后,后續的讀寫都會直接操作這個新分配的塊。

Copy-on-write性能影響

  每次容器第一次更新已有數據時,devicemapper存儲驅動都會執行copy-on-write操作,該操作會將數據從鏡像快照拷貝到容器快照。這在容器性能上有著明顯的影響。
  所有的copy-on-write操作都有64KB的粒度。因此,要修改1GB文件的32KB內容時,只需要拷貝64KB大小的塊到容器即可。如果要拷貝整個大文件到容器層時,該特性較于文件層的copy-on-write操作有著明顯的性能優勢。
  然而,實際中,如果容器執行大量的小的寫請求時(<64KB),devicemapper性能差于AUFS。

其他device mapper性能注意事項

  還有一些點會影響devicemapper存儲驅動的性能。
   模式。Docker運行devicemapper存儲驅動的默認模式是loop-lvm。該模式使用稀疏文件,并且性能堪憂。在產品中不建議使用該模式,產品環境中建議使用direct-lvm,這樣存儲驅動就可以直接寫向塊設備。
   高速存儲。為了更好的性能,可以將Data文件和Metadata文件放在高速存儲(如SSD)上。當然,也可以直接連接到SAN或NAS array上。
   內存使用。devicemapper不是內存最高效的Docker存儲驅動。啟動同一個容器的n份拷貝需要將其文件大小的n份拷貝加載到內存中,這對于Docker host的內存有一定影響。因此,devicemapper存儲驅動可能不是Pass或其他高密度用例的最優方案。
  最后一點,數據卷提供了更好和可預測的性能。因此,應該將負載高的寫請求寫到數據卷中。


轉載于:https://blog.51cto.com/welcomeweb/1921289

總結

以上是生活随笔為你收集整理的DOCKER存储驱动之DEVICE MAPPER简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。