zoukankan      html  css  js  c++  java
  • ceph之image(转)

    原文地址:http://www.cnblogs.com/sammyliu/p/4843812.html?utm_source=tuicool&utm_medium=referral

    2 卷(image)

    2.1 image 之用户所见

    Image 对应于 LVM 的 Logical Volume,它将被条带化为 N 个子数据块,每个数据块将会被以对象(object)形式保存在 RADOS 对象存储中的简单块设备(simple block devicees)。比如:

    复制代码
    #创建 100 MB 大小的名字为 ‘myimage’ 的 RBD Image,默认情况下,它被条带化为 4MB 大小的 25 个对象 (注意 rdb create 命令的 size 参数的单位为 MB)
    rbd create mypool/myimage --size 100
    
    #同样是 100MB 大小的 RBD Image,但是它被被条带化为 8MB 大小的13 个对象
    rbd create mypool/myimage --size 100 --order 23

    #将 image mount 到linux 主机称为一个 deivce /dev/rbd1
    rbd map mypool/myimage

    #向 /dev/rbd1 写入数据
    dd if=/dev/zero of=/dev/rbd1 bs=1047586 count=4 #删除 image rbd rm mypool/myimage

    复制代码
    #查看image被哪些节点lock
    root@ceph01:~# rbd lock list shawn-mysql-d84f54856f-ceph
    There is 1 exclusive lock on this image.
    Locker        ID                           Address                  
    client.124205 kubelet_lock_magic_dev-node3 172.16.71.203:0/79720481 

     删除一个image的lock

    rbd lock remove shawn-mysql-d84f54856f-ceph kubelet_lock_magic_dev-node3 client.124205

    2.2 image 之 ceph 系统所见

    接下来我们来看看 image 的一些内部信息。

    (1)创建新的对象

    首先在一个空的 pool 中创建一个 100 GB 的 image 

    root@ceph1:~# rbd create -p pool100 image1 --size 102400 --image-format 2
    root@ceph1:~# rbd list pool100
    image1

    这时候在 pool 中看到多了一些对象:

    root@ceph1:~# rados -p pool100 ls
    rbd_directory
    rbd_id.image1
    rbd_header.a89c2ae8944a

    从名字也能看出来,这些 object 存放的不是 image 的数据,而是 ID,header 之类的元数据信息。其中,rbd_directory 中保存了pool内所有image的 ID 和 name 信息:

    复制代码
    root@ceph1:~# rados -p pool100 listomapvals rbd_directory
    id_a89c2ae8944a
    value: (10 bytes) :
    0000 : 06 00 00 00 69 6d 61 67 65 31                   : ....image1
    
    name_image1
    value: (16 bytes) :
    0000 : 0c 00 00 00 61 38 39 63 32 61 65 38 39 34 34 61 : ....a89c2ae8944a
    复制代码

    而 rbd_header 保存的是一个 RBD 镜像的元数据:

    复制代码
    root@ceph1:~# rados -p pool100 listomapvals rbd_header.a89c2ae8944a
    features
    value: (8 bytes) :
    0000 : 01 00 00 00 00 00 00 00                         : ........
    
    object_prefix
    value: (25 bytes) :
    0000 : 15 00 00 00 72 62 64 5f 64 61 74 61 2e 61 38 39 : ....rbd_data.a89
    0010 : 63 32 61 65 38 39 34 34 61                      : c2ae8944a
    
    order
    value: (1 bytes) :
    0000 : 16                                              : .
    
    size
    value: (8 bytes) :
    0000 : 00 00 00 00 19 00 00 00                         : ........
    
    snap_seq
    value: (8 bytes) :
    0000 : 00 00 00 00 00 00 00 00                         : ........
    复制代码

    这些信息正是下面命令的信息来源:

    复制代码
    root@ceph1:~# rbd -p pool100 info image1
    rbd image 'image1':
        size 102400 MB in 25600 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.a89c2ae8944a
        format: 2
        features: layering
    复制代码

    同时还能看出来,该 image 的数据对象的名称前缀是 rbd_header.a89c2ae8944a。而对于一个新建的 image,因为没有数据对象,其实际占用的存储空间只是元数据对象所占的非常小的空间。

    (2)向该对象中写入数据 8MB 的数据(该 pool 中一个 object 是 4MB)

    复制代码
    root@ceph1:~# rbd map pool100/image1
    root@ceph1:~# rbd showmapped
    id pool    image  snap device    
    1  pool100 image1 -    /dev/rbd1 
    root@ceph1:~# dd if=/dev/zero of=/dev/rbd1 bs=1048576 count=8 8+0 records in 8+0 records out 8388608 bytes (8.4 MB) copied, 0.316369 s, 26.5 MB/s
    复制代码

    在来看看 pool 中的对象:

    root@ceph1:~# rados -p pool100 ls
    rbd_directory
    rbd_id.image1
    rbd_data.a89c2ae8944a.0000000000000000
    rbd_data.a89c2ae8944a.0000000000000001
    rbd_header.a89c2ae8944a

    可以看出来多了 2 个 4MB 的 object。继续看第一个对象所在的 OSD:

    root@ceph1:~# ceph osd map pool100 rbd_data.a89c2ae8944a.0000000000000000
    osdmap e81 pool 'pool100' (7) object 'rbd_data.a89c2ae8944a.0000000000000000' -> pg 7.df059252 (7.52) -> up ([8,6,7], p8) acting ([8,6,7], p8)

    PG 的 ID 是 7.52,主 OSD 是 8,从 OSD 是 6 和 7。从 OSD 树中可以获知 OSD 8 所在的节点为 ceph3:

    root@ceph3:/data/osd2/current/7.52_head# ceph osd tree
    # id    weight    type name    up/down    reweight
    -1    0.1399    root default    
    -4    0.03998        host ceph3
    5    0.01999            osd.5    up    1    
    8    0.01999            osd.8    up    1

    登录 ceph3,查看 /var/lib/ceph/osd 目录,能看到 ceph-8 目录:

    root@ceph3:/var/lib/ceph/osd# ls -l
    total 0
    lrwxrwxrwx 1 root root  9 Sep 18 02:59 ceph-5 -> /data/osd
    lrwxrwxrwx 1 root root 10 Sep 18 08:22 ceph-8 -> /data/osd2

    查看 7.52 开头的目录,可以看到两个数据文件:

    root@ceph3:/data/osd2/current# find . -name '*a89c2ae8944a*'
    ./7.5c_head/rbduheader.a89c2ae8944a__head_36B2DADC__7
    ./7.52_head/rbdudata.a89c2ae8944a.0000000000000001__head_9C6139D2__7
    ./7.52_head/rbdudata.a89c2ae8944a.0000000000000000__head_DF059252__7

    可见:

    (1)RBD image 是简单的块设备,可以直接被 mount 到主机,成为一个 device,用户可以直接写入二进制数据。

    (2)image 的数据被保存为若干在 RADOS 对象存储中的对象。

    (3)image 的数据空间是 thin provision 的,意味着ceph 不预分配空间,而是等到实际写入数据时按照 object 分配空间。

    (4)每个 data object 被保存为多份。

    (5)pool 将 RBD 镜像的ID和name等基本信息保存在 rbd_directory 中,这样,rbd ls 命令就可以快速返回一个pool中所有的 RBD 镜像了。

    (6)每个 RBD 镜像的元数据将保存在一个对象中,命名为 rbd_header.<image id>。

    (7)RBD 镜像保存在多个对象中,这些对象的命名为 rbd_data.<image id>.<顺序编号序列>。

    (8)RADOS 对象以 OSD 文件系统上的文件形式被保存,其文件名为 udata<image id>.<顺序编号序列>.<其它字符串>。

  • 相关阅读:
    .net项目的svn Global ignore pattern
    Ionic开发中常见问题和解决方案记录
    iOS开发:mac使用svn管理项目
    iOS开发:本地数据存储-NSUserDefaults
    iOS开发:插件记录
    iOS开发:告诉git不要跟踪UserInterfaceState.xcuserstate
    发布 windows 10 universal app 时微软账号验证失败
    iOS开发:UINavigationController常用操作
    iOS开发:Swift多线程NSOperation的使用
    iOS开发:Swift多线程GCD的使用
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/6692975.html
Copyright © 2011-2022 走看看