zoukankan      html  css  js  c++  java
  • docker with devicemapper storage driver

    storage driver的选择依据很多的条件,比如发行版版本,团队技术积累,稳定性等。
    device mapper是redhat/centos中最适合的, 稳定性也可以,内核原生支持,基于块设备,对于高负载情况下可以性能较好,支持quota。
    缺点是:占用内存较多,启动同一个镜像的多个实例,需要多次加载并在内存中保存多个实例的信息,在高密度的情况下不适用;在小文件的情况下性能不如aufs,overlay。
    接下里我们就对device mappper做个剖析。

    Device Mapper介绍

    首先请看:Linux 内核中的 Device Mapper 机制

    device mapper中允许有不同的target driver,docker结合使用了thin provisioningsnapshot两种技术,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信息如下:

    [root@gaorong-pc ~]# 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创建一个文件来记录信息,如下:

    [root@gaorong-pc 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直接输出:

    [root@gaorong-pc ~]# 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

    docker官方介绍:Use the Device Mapper storage driver
    moby repo: devicemapper - a storage backend based on Device Mapper 包含docker info dm 各个字段含义
    docker device mapper flag配置
    DOCKER基础技术:DEVICEMAPPER 左耳朵耗子出品, 五颗星
    剖析Docker文件系统:Aufs与Devicemapper
    device mapper Document 必看其中的thin-provisioning, snapshot两章,包含一些底层的使用方式,与参数细节
    dockercon 各种storage driver的使用: Deep dive into Docker storage drivers: video PPT

    2019.3.10 update: 使用 Device Mapper来改变Docker容器的大小

  • 相关阅读:
    Python3全栈学习目录
    五句话搞定javavscript作用域
    Python线程池
    luogu4016 负载平衡问题
    luogu2756 飞行员配对方案问题
    luogu1251 餐巾计划问题
    luogu3386 【模板】二分图匹配 匈牙利算法 hdu2063 过山车 dinic
    luogu3381 【模板】最小费用最大流
    luogu3376 【模板】网络最大流 dinic
    luogu2740 [USACO4.2]草地排水Drainage Ditches 最大流EK
  • 原文地址:https://www.cnblogs.com/gaorong/p/9739995.html
Copyright © 2011-2022 走看看