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/rbd\uheader.a89c2ae8944a__head_36B2DADC__7
./7.52_head/rbd\udata.a89c2ae8944a.0000000000000001__head_9C6139D2__7
./7.52_head/rbd\udata.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>.<順序編號序列>.<其它字符串>。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM