成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Docker 環(huán)境 Storage Pool 用完解決方案:resize-device-mapper

snowell / 1092人閱讀

摘要:從本質(zhì)上來看,精簡(jiǎn)目標(biāo)實(shí)際上使用了兩個(gè)存儲(chǔ)設(shè)備一個(gè)大的是存儲(chǔ)塊池自己,還有一個(gè)小的存儲(chǔ)了一些元數(shù)據(jù)。另外一個(gè)非常好的選擇是把你的磁盤或者磁盤陣列放到的物理卷中,并且創(chuàng)建兩個(gè)邏輯卷一個(gè)是數(shù)據(jù),一個(gè)是元數(shù)據(jù)。

問題引出

今日筆者docker下出現(xiàn)詭異問題,在容器中vim編輯文件,保存是,一直提示 “E667: Fsync failed”,而且在同一個(gè)宿主機(jī)上的容器均有此問題,遂懷疑環(huán)境故障,且與存儲(chǔ)相關(guān),后偶然運(yùn)行命令“docker info”,發(fā)現(xiàn)異常信息:

Containers: 26
Images: 12
Storage Driver: devicemapper
 Pool Name: docker-8:3-6684808-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: 
 Metadata file: 
 Data Space Used: 107.4 GB
 Data Space Total: 107.4 GB
 Metadata Space Used: 65.48 MB
 Metadata Space Total: 2.147 GB
 Udev Sync Supported: true
 Library Version: 1.02.89-RHEL6 (2014-09-01)
Execution Driver: native-0.2
Kernel Version: 2.6.32-504.el6.x86_64
Operating System: 
CPUs: 8
Total Memory: 15.58 GiB
Name: lx-vm01.lianjia.com.vm
ID: T2YG:HFF3:DEZP:5SDU:4B2K:B76F:AUHD:YYVA:DXPS:AVZL:X4WQ:BQFZ
Username: liuyanglong
Registry: [https://index.docker.io/v1/]

其中可看到,Data Space Used 已和 Data Space Total一樣,storage Pool用完,呃。。。。
docker start默認(rèn)分配的device mapper的storage pool就是100G,它會(huì)把你所有的容器存儲(chǔ)到一個(gè) 100G 的簡(jiǎn)短文件中,并且限制每個(gè)容器最大為 10GB

以下解決方案來自:http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/

它的工作原理

要真正理解我們要做的事情,首先來了解 Device Mapper 插件的工作原理。

它是基于 Device Mapper 的“精簡(jiǎn)目標(biāo)”的特性。它實(shí)際上是目標(biāo)塊設(shè)備的快照,之所以被稱為“精簡(jiǎn)”是因?yàn)樗试S精簡(jiǎn)配置。精簡(jiǎn)配置意味著你有一個(gè)(希望很大)可用存儲(chǔ)塊的池,接著你可以從那個(gè)池中創(chuàng)建任意大小的塊設(shè)備(虛擬磁盤,如有需要);在你實(shí)際讀寫后,這些存儲(chǔ)塊將會(huì)被標(biāo)記為已使用(或者從池中拿走)。

這意味著你是可以超額使用這個(gè)池,比如在一個(gè) 100GB 的池里面創(chuàng)建幾千個(gè) 10GB 的卷,甚至可能是一個(gè) 100TB 的卷在一個(gè) 1GB 的池里面。只要你的實(shí)際讀寫的塊的容量不大于池的大小,你怎么做都 OK 。

除此之外,精簡(jiǎn)目標(biāo)的方式是可以做快照的。這表明無論何時(shí),你都可以創(chuàng)建一個(gè)存在的卷的淺拷貝。在用戶看來,就像你有兩個(gè)一樣的卷,它們可以獨(dú)立地各自修改。即使你做了一個(gè)完整的拷貝,除了在時(shí)間上它是瞬間發(fā)生的(即使是很大的卷),它們不會(huì)兩次重復(fù)使用存儲(chǔ)。額外的存儲(chǔ)只有當(dāng)其中任何一卷有變化的時(shí)候才會(huì)發(fā)生,然后精簡(jiǎn)目標(biāo)會(huì)從池里面分配一個(gè)存儲(chǔ)快。

從本質(zhì)上來看,“精簡(jiǎn)目標(biāo)”實(shí)際上使用了兩個(gè)存儲(chǔ)設(shè)備:一個(gè)(大)的是存儲(chǔ)塊池自己,還有一個(gè)小的存儲(chǔ)了一些元數(shù)據(jù)。這些元數(shù)據(jù)中包括了卷、快照、以及每個(gè)卷的塊或者快照同存儲(chǔ)池中塊的映射信息。

當(dāng) Docker 使用 Device Mapper 存儲(chǔ)插件的時(shí)候,它會(huì)在 /var/lib/docker/devicemapper/devicemapper/data/var/lib/docker/devicemapper/devicemapper/metadata 下創(chuàng)建兩個(gè)文件(如果它們不存在)來存儲(chǔ)對(duì)應(yīng)的存儲(chǔ)池和相關(guān)的元數(shù)據(jù)。這非常方便,你不需要做任何安裝部署的工作(你不需要額外的分區(qū)來存儲(chǔ) Docker 容器,或者建立 LVM 或其他類似的東西)。然而它也有兩個(gè)缺點(diǎn):

存儲(chǔ)池會(huì)有一個(gè)默認(rèn) 100GB 的容量

它將會(huì)被稀疏文件所支持。從磁盤的使用效率的觀點(diǎn)來看,這還不錯(cuò)的(就像在精簡(jiǎn)池中的卷,它一開始是小的,只有當(dāng)實(shí)際需要寫的時(shí)候才會(huì)使用磁盤的存儲(chǔ)塊)。但是從性能的角度來看就不那么好了,因?yàn)?VFS 增加了一些額外的負(fù)擔(dān),特別是"第一次寫的時(shí)候"。

在了解如何調(diào)整容器的大小之前,我們來試試看如何給池增加更多空間。

我們需要一個(gè)更大的池

警告:下面的操作會(huì)刪除你所有的容器和鏡像,確保你已經(jīng)把之前的數(shù)據(jù)做了備份!

記住上面說過的,當(dāng)數(shù)據(jù)和元類信息文件不存在的時(shí)候 Docker 會(huì)創(chuàng)建它們,所以解決方案非常簡(jiǎn)單:在啟動(dòng)它們之前,在 Docker 里創(chuàng)建這些文件!

停止 Docker 守護(hù)進(jìn)程,因?yàn)槲覀儗⒁匦略O(shè)置我們的存儲(chǔ)插件,如果我們?cè)谶\(yùn)行的時(shí)候移除文件,那么糟糕的事情就將發(fā)生。

擦去 /var/lib/docker。(警告:正如前面提到的,這個(gè)操作會(huì)把你所有的容器和鏡像都刪除掉。)

創(chuàng)建存儲(chǔ)目錄: mkdir -p /var/lib/docker/devicemapper/devicemapper

創(chuàng)建你的池: dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=250 ,創(chuàng)建一個(gè) 250G 的稀疏文件。如果你指定 bs=1G count=250(不使用 seek 選項(xiàng)),那么它會(huì)創(chuàng)建一個(gè)普通文件(而不是一個(gè)稀疏文件)。

重啟 Docker 守護(hù)進(jìn)程。提示:在默認(rèn)情況下,如果你有 AUFS 的支持, Docker 會(huì)使用它;所以如果你要強(qiáng)制使用 Device Mapper 的插件,需要在啟動(dòng) Docker 的命令中增加 -s devicemapper 的選項(xiàng)。

使用 docker info 來檢查 Data Space Total 的值是否正確。

我們需要一個(gè)更快的池

警告:下面的操作也會(huì)刪除你所有的容器和鏡像。確保把你重要的鏡像保存在 registry 中,保存你容器里面的重要數(shù)據(jù)。

要獲得一個(gè)更快速的池,最簡(jiǎn)單的辦法就是使用一個(gè)真實(shí)的設(shè)備而不是一個(gè)基于文件的循環(huán)設(shè)備。過程幾乎一樣。假設(shè)你有一個(gè)完全空的硬盤, /dev/sdb,你想把它完全用于容器的存儲(chǔ),你可以這樣做:

停止 Docker 守護(hù)進(jìn)程

移除 /var/lib/docker (似曾相識(shí),對(duì)么?)

創(chuàng)建一個(gè)存儲(chǔ)目錄: mkdir -p /var/lib/docker/devicemapper/devicemapper

在目錄下創(chuàng)建一個(gè)數(shù)據(jù)軟鏈接,指向設(shè)備:

ln -s /dev/sdb /var/lib/docker/devicemapper/devicemapper/data

重啟 Docker

使用 docker info 來檢查 Data Space Total 的值是否正確

使用 RAID 和 LVM

如果你希望合并多塊相似的磁盤,可以使用 RADID10 軟件,這個(gè)會(huì)通過鏈接到 /dev/md 而實(shí)現(xiàn)。另外一個(gè)非常好的選擇是把你的磁盤(或者RAID磁盤陣列)放到 LVM 的物理卷中,并且創(chuàng)建兩個(gè)邏輯卷:一個(gè)是數(shù)據(jù),一個(gè)是元數(shù)據(jù)。對(duì)于元數(shù)據(jù)池的最佳的大小我沒有什么特別的建議,不過占數(shù)據(jù)池的 1% 看起來不錯(cuò)。

就像前面一樣,停止 Docker ,移除它的數(shù)據(jù)目錄,然后創(chuàng)建一個(gè)指向 /dev/mapper 設(shè)備的符號(hào)鏈接,然后重啟 Docker 。

ln -s /dev/mapper/vg_dockerdev-LogVol01 /var/lib/docker/devicemapper/devicemapper/data

之后重啟docker即可。

擴(kuò)容容器

默認(rèn)來說,如果你使用 Device Mapper 的存儲(chǔ)插件,所有的鏡像和容器是從一個(gè)初始 10G 的文件系統(tǒng)中創(chuàng)建的。讓我們來看看如何從一個(gè)更大的文件系統(tǒng)中創(chuàng)建一個(gè)容器。

首先,我們用 Ubuntu 的鏡像來創(chuàng)建我們的容器。我們不需要在這個(gè)容器里運(yùn)行任何東西,只需要這個(gè)文件(或者關(guān)聯(lián)的文件系統(tǒng))存在。為了演示,我們會(huì)在這個(gè)容器里運(yùn)行 df ,來看一下根文件系統(tǒng)的大小。

$ docker run -d ubuntu df -h /
4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603

由于需要修改 Device Mapper 管理中的一些卷的信息,我們現(xiàn)在用 root 的身份來運(yùn)行一些命令。所有以#開頭的命令都必須以 root 身份來執(zhí)行。只要能訪問 Docker 的 Socket 服務(wù),你也可以用普通用戶的身份來執(zhí)行其他的命令(以$開頭)。

讓我們看一下 /dev/mapper ,那里應(yīng)該有一個(gè)對(duì)應(yīng)容器文件系統(tǒng)的符號(hào)鏈接,以 docker-X:Y-Z- 開頭:

ls -l /dev/mapper/docker-*-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
lrwxrwxrwx 1 root root 7 Jan 31 21:04 /dev/mapper/docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603 -> ../dm-8

注意記住那個(gè)全名,我們未來會(huì)用到。

首先讓我們來看一下當(dāng)前卷的信息表:

 dmsetup table docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
0 20971520 thin 254:0 7

第二個(gè)數(shù)字是設(shè)備的大小,表示有多少個(gè) 512-bytes 的扇區(qū). 這個(gè)值略高于 10GB 的大小。

我們來計(jì)算一下一個(gè) 42GB 的卷需要多少扇區(qū),

$ echo $((42*1024*1024*1024/512))
88080384

精簡(jiǎn)快照目標(biāo)的一個(gè)神奇的特點(diǎn)是它不會(huì)限制卷的大小。當(dāng)你創(chuàng)建它的時(shí)候,一個(gè)精簡(jiǎn)的卷使用0個(gè)塊,當(dāng)你開始往塊里面寫入的時(shí)候,它們會(huì)從共用的塊池中進(jìn)行分配。你可以寫0個(gè)塊,或者是10億個(gè)塊,這個(gè)和精簡(jiǎn)快照目標(biāo)沒關(guān)系。文件系統(tǒng)的大小只和 Device Mapper 表有關(guān)系。

覺得困惑?不要擔(dān)心。我們只是需要裝載一個(gè)新的表,這個(gè)完全和之前的是一樣的,但是有更多的扇區(qū)。僅此而已。

舊表是 0 20971520 thin 254:0 7 。我們會(huì)改變第二個(gè)數(shù)字,要非常小心保持其他的值不變。你的卷可能不是 7 ,所以要使用正確的值!

這樣操作:

# echo 0 88080384 thin 254:0 7 | dmsetup load docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603

現(xiàn)在如果我們?cè)俅螜z查表的信息,步驟和前面一樣。首先使用下面的命令激活新表:

# dmsetup resume docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603

執(zhí)行完命令后,再次檢查一下表的信息,發(fā)現(xiàn)它會(huì)使用新的扇區(qū)數(shù)量。

我們已經(jīng)調(diào)整了塊設(shè)備的大小,但是我們?nèi)匀恍枰{(diào)整文件系統(tǒng)的大小,我們使用 resize2fs 來操作:

# resize2fs /dev/mapper/docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/mapper/docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603 is mounted on /var/lib/docker/devicemapper/mnt/4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 3
The filesystem on /dev/mapper/docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603 is now 11010048 blocks long

作為一個(gè)可選步驟,我們會(huì)重啟容器,檢查一下我們的確有了正確大小的空閑空間:

$ docker start 4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
$ docker logs 4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
df: Warning: cannot read table of mounted file systems: No such file or directory
Filesystem      Size  Used Avail Use% Mounted on
-               9.8G  164M  9.1G   2% /
df: Warning: cannot read table of mounted file systems: No such file or directory
Filesystem      Size  Used Avail Use% Mounted on
-                42G  172M   40G   1% /

想把整個(gè)過程自動(dòng)化起來?當(dāng)然沒問題。

CID=$(docker run -d ubuntu df -h /)
DEV=$(basename $(echo /dev/mapper/docker-*-$CID))
dmsetup table $DEV | sed "s/0 [0-9]* thin/0 $((42*1024*1024*1024/512)) thin/" | dmsetup load $DEV
dmsetup resume $DEV
resize2fs /dev/mapper/$DEV
docker start $CID
docker logs $CID
擴(kuò)容鏡像

不幸的是,當(dāng)前版本的 Docker 不能讓我們很方便地?cái)U(kuò)容鏡像。你可以把鏡像對(duì)應(yīng)的塊設(shè)備進(jìn)行擴(kuò)容,然后從它來創(chuàng)建一個(gè)容器,但是新的容器不會(huì)有正確的大小。

同樣,如果你提交了一個(gè)很大的容器,最后生成的鏡像也不會(huì)很大(這是由 Docker 為鏡像準(zhǔn)備文件系統(tǒng)的方法造成的)。

這意味著如果一個(gè)容器真的超過了 10GB ,在不使用一些其他的小技巧的情況下,你沒法正確的把它提交為一個(gè)鏡像。

總結(jié)

Docker 將來肯定會(huì)提供一些更好的方法來擴(kuò)容容器,所需的代碼變動(dòng)是很小的。管理一個(gè)精簡(jiǎn)的池和對(duì)應(yīng)的元信息比較復(fù)雜(因?yàn)檫@個(gè)需要很多不同的操作流程,以及一個(gè)潛在的數(shù)據(jù)遷移。鑒于移除了所有的東西來構(gòu)件新的池,也就沒有在本文提及),但是我們今天提到的一些解決方案相信已經(jīng)對(duì)你有所幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26421.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.5 - Docker丨Build, Ship, Run,

    摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術(shù)周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達(dá)的境界。周刊篩選的每篇內(nèi)容,是作者的獨(dú)到見解,踩坑總結(jié)和經(jīng)驗(yàn)分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動(dòng)感十足的清脆鍵盤響,我就能猜到公司程序員定...

    Panda 評(píng)論0 收藏0
  • 如何優(yōu)化Docker儲(chǔ)存

    摘要:修改配置文件在的配置文件最后一行的末尾添加,添加完之后的配置為重啟服務(wù)重啟的命令如下。修改后的結(jié)果如下啟動(dòng)服務(wù)刪除源文件以上就是儲(chǔ)存的優(yōu)化方案,希望對(duì)您能夠有所幫助,更好的使用容器技術(shù)。 各位同學(xué),大家在使用Docker的過程中,有沒有想過,Docker在本地存儲(chǔ)鏡像時(shí)把文件存儲(chǔ)在哪里了呢?有沒有對(duì)文件的總大小做一定的限制呢?能不能調(diào)整本地存儲(chǔ)的位置及總限制大小呢?今天,我們就從這些問...

    Amio 評(píng)論0 收藏0
  • docker容器根目錄為只讀的解決辦法

    摘要:?jiǎn)栴}描述今天在啟動(dòng)容器的時(shí)候發(fā)現(xiàn)一段時(shí)間后宿主機(jī)上所有的容器的根目錄全部變成了只讀,并且宿主機(jī)日志報(bào)磁盤相關(guān)的錯(cuò)容器內(nèi)結(jié)果如下宿主機(jī)報(bào)錯(cuò)如下 問題描述 今天在啟動(dòng)docker容器的時(shí)候發(fā)現(xiàn)一段時(shí)間后宿主機(jī)上所有的容器的根目錄全部變成了只讀,并且宿主機(jī)message日志報(bào)磁盤相關(guān)的錯(cuò) 容器內(nèi)mount結(jié)果如下 [root@zk-1 ~]# mount /dev/mapper/docker...

    luoyibu 評(píng)論0 收藏0
  • Docker相關(guān)環(huán)境全套安裝文檔兼小技能

    摘要:在年的月號(hào)之后,的版本命名開始發(fā)生變化,同時(shí)將版本和版本進(jìn)行分開,表示年月發(fā)布。離線安裝命名前安裝我們可以使用來對(duì)多個(gè)容器進(jìn)行管理。離線安裝安裝公司開源的企業(yè)級(jí)的管理項(xiàng)目。 以下環(huán)境皆為ubuntu16.04,主要安裝docker,docker-compose,docker倉(cāng)庫(kù)等。 Docker安裝 參考官方 A: 有源安裝 sudo apt-get remove docker doc...

    impig33 評(píng)論0 收藏0
  • 跟我學(xué) K8S--運(yùn)維: helm 安裝 ceph 到 kubernetes 集群

    摘要:參考官方文檔進(jìn)行操作本文假設(shè)環(huán)境正常運(yùn)行,并且已經(jīng)安裝。只能以單副本運(yùn)行部署運(yùn)行命令來安裝等待一段時(shí)間執(zhí)行完成后,通過如下命令確定集群是否成功運(yùn)行檢查的狀態(tài)檢查集群狀態(tài)至此,集群部署完成。 參考 ceph 官方文檔進(jìn)行操作: http://docs.ceph.com/docs/mas... 本文假設(shè)kubernetes 環(huán)境正常運(yùn)行,并且 host 已經(jīng)安裝 helm client。 ...

    marser 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<