1. 程式人生 > >docker with devicemapper storage driver

docker with devicemapper storage driver

storage driver的選擇依據很多的條件,比如發行版版本,團隊技術積累,穩定性等。 device mapper是redhat/centos中最適合的, 穩定性也可以,核心原生支援,基於塊裝置,對於高負載情況下可以效能較好,支援quota。 缺點是:佔用記憶體較多,啟動同一個映象的多個例項,需要多次載入並在記憶體中儲存多個例項的資訊,在高密度的情況下不適用;在小檔案的情況下效能不如aufs,overlay。 接下里我們就對device mappper做個剖析。

Device Mapper介紹

device mapper中允許有不同的target driver,docker結合使用了thin provisioning

snapshot兩種技術,thin provisioning 就是一種對disk超配的機制,snapshot 是COW的機制。

根據device mapper Document,device mapper thin provisioning snapshot使用方式大概分為以下幾步:

  1. 準備data與metadata device,可以是實際的物理裝置或LVM(loop-lvm 模式在生產環境一般不用)。data device用來存放實際的資料,metadata device 用來儲存元資料資訊。
  2. 利用data,metadata device建立一個thin pool (即thinp): dmsetup create poolname --table "0 20971520 thin-pool $metadata_dev $data_dev $data_block_size $low_water_mark"
  3. 建立對應的thinly-provisioned volume
  4. 建立snapshots並mount

建立完成後可以通過dmsetup status看到相關資訊,docker自己建立的thinpool資訊如下:

[[email protected] ~]# dmsetup status 
vg_root-dmdata: 0 419430400 linear 
vg_root-dmmeta: 0 62914560 linear 
docker-253:2-812-pool: 0 419430400 thin-pool 65465 11492/4161600 581965/3276800 - rw no_discard_passdown queue_if_no_space - 
docker-253:2-812-1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b: 0 20971520 thin 236288 20971519
.....

可以看到有data, metadata device, thin pool, thin volume物件,其中thinpool的輸出含義為: start_sector sector_num device_type transaction_id used_metadata_blocks/total_metadata_blocks used_data_blocks/total_data_blocks held_metadata_root ro|rw|out_of_data_space [no_]discard_passdown [error|queue]_if_no_space needs_check|- metadata_low_watermark 各個欄位具體含義參見device mapper thin-provisioning

Device Mapper在docker中的應用

docker使用devicemapper storage driver會自動完成上述物件的建立,將image和conainer layer資訊儲存在thinpool中,並mount到/var/lib/docker/devicemapper/目錄下暴露給container使用,其中metadata目錄下包含了各個layer的snapshot的資訊,他會為每個layer建立一個檔案來記錄資訊,如下:

[[email protected] devicemapper]# cat metadata/1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b
{"device_id":32867,"size":10737418240,"transaction_id":65437,"initialized":false,"deleted":false}

容器的writable layer是在真正啟動執行的時候active, 對應的thin volume才能被dmsetup status可見。可以參看這篇文章瞭解更多Docker內部儲存結構(devicemapper)解析(下篇)

data目錄包含了各個container的mountpoint, 可以df命令看到每個container的mount 資訊。 thinpool的資訊除了使用dmsetup指令檢視外,也可以通過docker info直接輸出:

[[email protected] ~]# docker info
Containers: 10
 Running: 4
 Paused: 0
 Stopped: 6
Images: 26
Server Version: 17.03.2-ce
Storage Driver: devicemapper
 Pool Name: docker-253:2-812-pool               
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file: /dev/vg_root/dmdata
 Metadata file: /dev/vg_root/dmmeta
 Data Space Used: 38.14 GB
 Data Space Total: 214.7 GB
 Data Space Available: 176.6 GB
 Metadata Space Used: 47.07 MB
 Metadata Space Total: 17.05 GB
 Metadata Space Available: 17 GB
 Thin Pool Minimum Free Space: 21.47 GB
 Udev Sync Supported: false
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Library Version: 1.02.82 (2013-10-04)
Logging Driver: json-file
Cgroup Driver: cgroupfs
........

注意其中Thin Pool Minimum Free Space欄位就是建立thinp時的$low_water_mark,它表示在當data device容量還剩下該閾值的時候就無法寫入資料了,也就是docker info中 "Data Space Available","Thin Pool Minimum Free Space"兩個欄位相等時此時就無法寫入資料了。 在docker的官方文件裡有詳細介紹: How the devicemapper storage driver works

refs