數據存儲原理
The Ceph storage system supports the notion of ‘Pools’, which are logical partitions for storing objects.
Ceph Clients retrieve a Cluster Map from a Ceph Monitor, and write objects to pools. The pool’s size or number of replicas, the CRUSH rule and the number of placement groups determine how Ceph will place the data.
Ceph存儲系統支持“池”的概念,“池”是用於存儲對象的邏輯分區。
Ceph客戶端從Ceph監控器檢索集群映射,並將對象寫入池中。池的大小或副本數,CRUSH規則和放置組的數量決定了Ceph將如何放置數據。
Pools set at least the following parameters:
Ownership/Access to Objects
The Number of Placement Groups, and
The CRUSH Rule to Use.
池至少設置以下參數:
所有權/對對象的訪問展示位置組數,以及使用的CRUSH規則。
Each pool has a number of placement groups. CRUSH maps PGs to OSDs dynamically. When a Ceph Client stores objects, CRUSH will map each object to a placement group.
每個存儲池中有很多的歸置組(PG),當一個Ceph 客戶端存儲一個對象時,CURSH 將映射每個對象到一個歸置組中,CRUSH map 動態映射 PGs 到OSDs。
Mapping objects to placement groups creates a layer of indirection between the Ceph OSD Daemon and the Ceph Client. The Ceph Storage Cluster must be able to grow (or shrink) and rebalance where it stores objects dynamically. If the Ceph Client “knew” which Ceph OSD Daemon had which object, that would create a tight coupling between the Ceph Client and the Ceph OSD Daemon. Instead, the CRUSH algorithm maps each object to a placement group and then maps each placement group to one or more Ceph OSD Daemons. This layer of indirection allows Ceph to rebalance dynamically when new Ceph OSD Daemons and the underlying OSD devices come online. The following diagram depicts how CRUSH maps objects to placement groups, and placement groups to OSDs.
為了創建文件對象到歸置組的映射,在 Ceph OSD Daemon 和 Ceph Client 創建一個間接層;Ceph 存儲集群能夠存儲數據時動態的增長(或縮減)和再平衡。如果 Ceph Client 知道哪個 Ceph OSD 進程擁有哪個對象,那么會在 Ceph Clinet 與 OSD 進程間創建一個緊密的耦合,CRUSH 算法把文件對象映射成歸置組,每個 PG 又映射成一個或多個 OSD;當一個新的Ceph OSD 進程和底層 OSD 設置加入后,這個中間層允許Ceph 動態再平衡數據;下圖描述了CRUSH 如何映射,對象到PG,PG再到OSD。
With a copy of the cluster map and the CRUSH algorithm, the client can compute exactly which OSD to use when reading or writing a particular object.
通過集群映射和CRUSH算法的副本,客戶機可以精確地計算在讀寫特定對象時要使用哪個OSD。
在上面這張數據流轉圖中,每一台主機上面可以存在多個 osd ,每一個 osd,我們通常認為是一個磁盤,當然如果你使用的是 filestore 引擎,這里就是一個目錄。我們這里使用默認bluestore 引擎,代表一塊磁盤,注意就算是使用一個目錄,也應該是整個磁盤當作一個分區,格式化完成以后,掛載到某個目錄下面,我們應該這么使用才對。
Osd: 對象存儲設備 Object storage device,每一塊磁盤就叫做一個osd,每台主機上面有多個 osd,多台主機構成 Rados cluster (RADOS 存儲集群),在這個集群內,除了存儲節點外,還有一類節點叫 mon,叫元數據節點,ceph 不是沒有元數據集群節點嗎?而ceph集群沒有說叫元數據節點,而是叫監視器mon——>monitor,它是用來管理整個集群的,比如你總共有多少個節點,每一個節點上面有多少個 osd,每一個 osd 是否健康,每一個 osd 位於哪個節點上等等,它會持有整個集群的運行圖,或者叫運行狀態、元數據,或者叫集群元數據,注意不是文件元數據。如果這個集群元數據節點掛了,整個集群將無法工作了,因此需要為這個 mon 節點需要做高可用,它使用 paxos 協議來實現集群的一致性,就像 etcd 使用 raft 協議一樣,每一個節點都有完整的副本,它屬於節點級冗余,這里的 mon 也是節點級冗余,為了確保數據在各節點上面是強一致的,每個節點都可寫,寫完之后,同步給其它節點,同時寫的話,如果修改了同一個鍵,同步給另外的節點,發現不一樣,是不是就沖突了,為了避免這種情況,他使用了一種叫分布式強一致性協議 paxos,它也是分布式最早的一種協議,mon 就是使用 paxos 協議在多個節點來協作的,這叫集群元數據 ;有了集群,為了監控整個集群,我們需要對 RADOS 集群中的 mon 做查詢 ,就需要頻繁訪問這個 mon,或者監控軟件需要周期性采集數據,而 mon 是實時查詢集群數據的,大家知道這種實時查詢代價是很高的,因此 mon 不太適用於頻繁的周期性的采集集群數據的這種監控操作,但是監控又是必須的,所以 ceph 的新版本,引入了一個新組件,叫做 mgr,manager 的簡寫,這個組件專門維護這種查詢類的操作,他的查詢方式是在集群空閑的時候去查詢,然后把查詢到的集群信息緩存下來,等有監控來采集數據時,直接返回並響應,這叫mgr。有了這些組件才是一個完整的RADOS集群。
當我們要把一個文件存入到集群時,怎么存呢?通常情況下,當你接入ceph存儲集群,你必須通過一個客戶端來實現,基礎架構篇講過了三種(rbd、rgw、cephfs),或者根據 API 自研,無論通過哪種方式,都需要借助 API 接口把文件切分成固定大小的對象,而這個對象存儲到哪里去?好了,到了抽象的概念了,ceph 的存儲空間是沒有目錄的,所有的對象都是存儲在一個平面上的,注意,所有的對象都在同一個平面上,所以所有的對象都不能重名,但是即便如此,我們存儲1億個對象,放在同一個命名空間下就可以管理了,但是將來遷移可以管理都不是很方便,因此 RADIOS 把它的存儲切分成了多個分區,你可以理解為多個大磁盤,方便管理,每一個分區就叫一個存儲池(pool),存儲池的大小取決於下面的存儲空間的大小,它和我們真正意義上的分區,不是一回事,你可以把存儲池類比為 k8s 里面的命名空間就行了。而我們不能叫它命名空間,我們叫存儲池,而存儲池存放的數據有可能也很大;而存儲池可以進一步划分,並非是必備組件,它是可選的,它被叫做名稱空間,每一個存儲池進一步切分成名稱空間,這是兩級管理的邏輯組件,接着是三級,每一個存儲池中有多個 PG 存在,PG 叫歸置組,存儲池 pool 是抽象的概念,歸置組 PG 也是抽象的概念,事實上,並不存在任何一個 PG,它是一個看不見,摸不着的,更不是一個實體。那么任何一個文件存放到 RADOS 存儲系統的時候,如何存儲呢?一個對象放在了哪一個osd上面?這中間是靠 cursh 算法來完成,每個對象存放在哪個存儲池上面是固定的,存儲池必須創建才能使用,這點各位要注意,但 PG 是不可捉摸的東西,它是一個虛擬的中間層,當我們把一個對象真正存入到 osd 中時,一定是要向某個存儲池請求的,而后,我們需要把對象的名字,做一致性 hash 計算,計算完以后,會落到某個 PG 上面,比如說我們規定存儲池中有64個 PG,比如說我們對象的名字對64做一致性hash計算,映射到 hash 環上,hash 環上並沒有 PG,某個對象,一定屬於某個存儲池的某個 PG上 面來的;但 PG 是假的,虛擬的,事實上,是不存在的,要注意這點,只是一個計算的結果,把每一個 PG 存放在 osd 上面,PG 怎么到 osd,關鍵點來了,這是cursh 算法的第二步,我們需要把 PG 根據這個存儲池的副本冗余數量和存儲池的類型,找到足量的 osd 來存,存儲池有類型,存儲池的類型就是管理存儲池冗余數據的,數據冗余無非是做數據分片的副本,這兒不叫分片,叫 PG,我們叫主 PG,也叫活動 PG 和副本 PG,我們這樣來稱呼就行了,一個 PG 里面的對象是統一被管理的,寫的時候,一定是先寫主 PG,然后再由主 PG 同步給副本 PG,當然如何同步是 OSD 內部管理的,所以我們的存儲池和 crush 算法一定要確保哪個是主 PG 哪個是副本 PG,如果冗余1份,就是1主1副PG,如果冗余5份,就是1主5從,一般來講傳統的存儲池,只冗余2份,一共3份,但是這樣一來,我們的存儲資源的利用率也只有1/3。
ceph 集群也支持另外的一種存儲池,叫糾刪碼存儲池,類似於 RAID,這樣一來,利用率變高了,一樣的有冗余能力。文件存儲到存儲系統分為兩步;
-
文件被按固定大小的切分成塊,映射為存儲池中的 PG;
-
把 PG 映射為 osd, 這兩步都是由 crush 算法完成的;
當然了 ceph 不光是要完成映射,萬一哪個 osd 壞了,還要把壞的修復過來,這是內部的工作邏輯,自行修復。
RDB 基礎
1. 使用 create 創建 pool 池(還有一種是通過init 的方式創建)
# 查看集群中的 pools
[root@ceph-node01 ~]# ceph osd lspools
# 使用 create 方式創建 pool 池
[root@ceph-node01 ~]# ceph osd pool create ceph-demo 64 64
pool 'ceph-demo' created
# 再次查看
[root@ceph-node01 ~]# ceph osd lspools
1 ceph-demo
[root@ceph-node01 ~]#
創建命令時需要指定PG、PGP數量,還可以指定復制模型還是糾刪碼模型,副本數量等等
[root@ceph-node01 ~]# ceph osd pool create
Invalid command: missing required parameter pool(<poolname>)
osd pool create <poolname> <int[0-]> {<int[0-]>} {replicated|erasure} {<erasure_code_profile>} {<rule>} {<int>} {<int>} {<int[0-]>} {<int[0-]>} {<float[0.0-1.0]>} : create pool
Error EINVAL: invalid command
[root@ceph-node01 ~]#
獲取 pool 池屬性信息,可以重新設置,有很多參數,都可以如下設置
# 獲取 pg 個數
[root@ceph-node01 ~]# ceph osd pool get ceph-demo pg_num
pg_num: 64
# 獲取 pgp 個數
[root@ceph-node01 ~]# ceph osd pool get ceph-demo pgp_num
pgp_num: 64
# 獲取副本數
[root@ceph-node01 ~]# ceph osd pool get ceph-demo size
size: 3
# 獲取使用模型
[root@ceph-node01 ~]# ceph osd pool get ceph-demo crush_rule
crush_rule: replicated_rule
# 設置副本數
[root@ceph-node01 ~]# ceph osd pool set ceph-demo size 2
# 設置 pg 數量
[root@ceph-node01 ~]# ceph osd pool set ceph-demo pg_num 128
# 設置 pgp 數量
[root@ceph-node01 ~]# ceph osd pool set ceph-demo pgp_num 128
- 創建完 pool 后,需要初始化 pool
[root@ceph-node01 ceph-deploy]# rbd pool init ceph-demo
這里先不做,看下報錯,然后我們排查問題;
- 創建 rbd 塊設備
# 查看 塊設備
[root@ceph-node01 ~]# rbd -p ceph-demo ls
# 創建 塊設備方式一
[root@ceph-node01 ~]# rbd create -p ceph-demo --image rbd-demo.img --size 10G
# 創建 塊設備方式二
[root@ceph-node01 ~]# rbd create ceph-demo/rbd-demo2.img --size 10G
# 查看 塊設備
[root@ceph-node01 ~]# rbd -p ceph-demo ls
rbd-demo.img
rbd-demo2.img
[root@ceph-node01 ~]#
查看塊設備信息
[root@ceph-node01 ceph-deploy]# rbd info ceph-demo/rbd-demo2.img
rbd image 'rbd-demo2.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects) # 每塊 4 M,默認
snapshot_count: 0
id: 6150b827120b # 塊設備 ID 號
block_name_prefix: rbd_data.6150b827120b
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Oct 3 23:40:53 2020
access_timestamp: Sat Oct 3 23:40:53 2020
modify_timestamp: Sat Oct 3 23:40:53 2020
[root@ceph-node01 ceph-deploy]#
- 刪除塊設備
[root@ceph-node01 ~]# rbd rm -p ceph-demo --image rbd-demo2.img
Removing image: 100% complete...done.
[root@ceph-node01 ~]#
- 設備掛載
由於沒有虛擬機進行掛載,所以需要使用內核 map 進行掛載;
[root@ceph-node01 ~]# rbd map ceph-demo/rbd-demo.img
rbd: sysfs write failed
RBD image feature set mismatch. Try disabling features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
[root@ceph-node01 ~]#
映射的過程當中出現錯誤,這是因為 Centos7 當中不支持這幾個特性,我們可以在創建時指定 features 。
[root@ceph-node01 ~]# rbd feature disable ceph-demo/rbd-demo.img deep-flatten
[root@ceph-node01 ~]# rbd feature disable ceph-demo/rbd-demo.img fast-diff
[root@ceph-node01 ~]# rbd feature disable ceph-demo/rbd-demo.img object-map
rbd: failed to update image features: 2020-09-29 10:29:37.787 7fc8a06ddc80 -1 librbd::Operations: one or more requested features are already disabled(22) Invalid argument
[root@ceph-node01 ~]# rbd feature disable ceph-demo/rbd-demo.img exclusive-lock
[root@ceph-node01 ~]#
再次掛載,掛載成功
[root@ceph-node01 ~]# rbd map ceph-demo/rbd-demo.img
/dev/rbd0
[root@ceph-node01 ~]#
查看設備列表
[root@ceph-node01 ~]# rbd device list
id pool namespace image snap device
0 ceph-demo rbd-demo.img - /dev/rbd0
[root@ceph-node01 ~]#
通過fdisk 查看設備列表
[root@ceph-node01 ~]# fdisk -l
......
磁盤 /dev/rbd0:10.7 GB, 10737418240 字節,20971520 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):4194304 字節 / 4194304 字節
[root@ceph-node01 ~]#
- 使用 rbd 設備
# 格式化為 ext4
[root@ceph-node01 ~]# mkfs.ext4 /dev/rbd0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: 完成
文件系統標簽=
OS type: Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=1024 blocks, Stripe width=1024 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: 完成
正在寫入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
# 查看設備
[root@ceph-node01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 50G 0 disk
├─vda1 252:1 0 500M 0 part /boot
└─vda2 252:2 0 49.5G 0 part
├─centos-root 253:0 0 44.5G 0 lvm /
└─centos-swap 253:1 0 5G 0 lvm [SWAP]
vdb 252:16 0 100G 0 disk
└─ceph--f80dea0c--8b8c--46aa--95aa--35589c59b708-osd--block--136f6cf7--05a0--4325--aa92--ad316560edff
253:2 0 100G 0 lvm
vdc 252:32 0 100G 0 disk
rbd0 251:0 0 10G 0 disk
[root@ceph-node01 ~]#
mount rbd 設備
[root@ceph-node01 ~]# mkdir /mnt/rbd-demo
[root@ceph-node01 ~]# mount /dev/rbd0 /mnt/rbd-demo/
[root@ceph-node01 ~]# df -h
文件系統 容量 已用 可用 已用% 掛載點
。。。
/dev/rbd0 9.8G 37M 9.2G 1% /mnt/rbd-demo
[root@ceph-node01 ~]# cd /mnt/rbd-demo
[root@ceph-node01 rbd-demo]# ls
lost+found
[root@ceph-node01 rbd-demo]# echo `date` >test
[root@ceph-node01 rbd-demo]# ll
總用量 20
drwx------ 2 root root 16384 9月 29 10:36 lost+found
-rw-r--r-- 1 root root 43 9月 29 10:41 test
[root@ceph-node01 rbd-demo]#
- 塊設備擴容
設備可以擴容,也可以縮容,但不建議使用縮容,有可能產生數據丟失。
[root@ceph-node01 rbd-demo]# rbd resize ceph-demo/rbd-demo.img --size 20G
Resizing image: 100% complete...done.
[root@ceph-node01 rbd-demo]# rbd -p ceph-demo info --image rbd-demo.img
rbd image 'rbd-demo.img':
size 20 GiB in 5120 objects # 已經擴容到了20G
order 22 (4 MiB objects)
snapshot_count: 0
id: 12e14e0cad6b
block_name_prefix: rbd_data.12e14e0cad6b
format: 2
features: layering
op_features:
flags:
create_timestamp: Tue Sep 29 10:13:59 2020
access_timestamp: Tue Sep 29 10:13:59 2020
modify_timestamp: Tue Sep 29 10:13:59 2020
[root@ceph-node01 rbd-demo]#
我們通過 fdisk -l 發現設備也擴容成功了,但 df -h 文件系統沒有擴容,我們要使用文件系統能夠識別到這個空間,就需要使用 resize2fs 命令;
[root@ceph-node01 rbd-demo]# resize2fs /dev/rbd0
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/rbd0 is mounted on /mnt/rbd-demo; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/rbd0 is now 5242880 blocks long.
[root@ceph-node01 rbd-demo]# df -h
文件系統 容量 已用 可用 已用% 掛載點
。。。
/dev/rbd0 20G 44M 19G 1% /mnt/rbd-demo
[root@ceph-node01 rbd-demo]#
塊設備擴容一般會涉及ny三方面的內容:
- 底層存儲的擴容;
- 磁盤分區的擴容;
- 文件系統的擴容;
這里第 2 步省略了,我們直接使用了整塊盤,其實在虛擬化環境中,也不建議對磁盤再分區。
RBD 數據寫入流程
- 一個對象會切割成多個object(默認是4M)
[root@ceph-node01 ~]# rbd -p ceph-demo info rbd-demo.img
rbd image 'rbd-demo.img':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 12e14e0cad6b
block_name_prefix: rbd_data.12e14e0cad6b
format: 2
features: layering
op_features:
flags:
create_timestamp: Tue Sep 29 10:13:59 2020
access_timestamp: Tue Sep 29 10:13:59 2020
modify_timestamp: Tue Sep 29 10:13:59 2020
[root@ceph-node01 ~]#
這里最多有 5120 個object,object 的前綴都是以rbd_data. 開頭;
查看 object 信息;
[root@ceph-node01 ~]# rados -p ceph-demo ls|grep rbd_data.12e14e0cad6b
rbd_data.12e14e0cad6b.000000000000042f
rbd_data.12e14e0cad6b.0000000000000060
rbd_data.12e14e0cad6b.0000000000000020
rbd_data.12e14e0cad6b.0000000000000c00
。。。
[root@ceph-node01 ~]#
查看每個object的大小
[root@ceph-node01 ~]# rados -p ceph-demo stat rbd_data.12e14e0cad6b.000000000000042f
ceph-demo/rbd_data.12e14e0cad6b.000000000000042f mtime 2020-10-04 00:50:12.000000, size 4194304
[root@ceph-node01 ~]#
注意,當前查看的這個 object的大小為 4M,有些 object 有可能小於 4M,但不可能大小4M;
- 查看 object 落在哪個 PG 上面
[root@ceph-node01 ~]# ceph osd map ceph-demo bd_data.12e14e0cad6b.000000000000042f
osdmap e37 pool 'ceph-demo' (1) object 'bd_data.12e14e0cad6b.000000000000042f' -> pg 1.46b3a134 (1.34) -> up ([2,1], p2) acting ([2,1], p2)
[root@ceph-node01 ~]#
資源池 ceph-demo中的1號對象,然后是objcect id,經過crush算法得到 PG為1.34,最終落到OSD 2和 1上面 ,通過ceph osd tree,可以查看對應的節點;
[root@ceph-node01 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.39067 root default
-3 0.09769 host ceph-node01
0 hdd 0.09769 osd.0 up 1.00000 1.00000
-5 0.09769 host ceph-node02
1 hdd 0.09769 osd.1 up 1.00000 1.00000
-7 0.19530 host ceph-node03
2 hdd 0.19530 osd.2 up 1.00000 1.00000
[root@ceph-node01 ~]#
osd.2 對應的是 ceph-node03 節點,osd.1 對應的是 ceph-node02 節點;
[root@ceph-node01 ~]# for i in `rados -p ceph-demo ls |grep rbd_data.12e14e0cad6b`
> do
> ceph osd map ceph-demo $i
> done
osdmap e37 pool 'ceph-demo' (1) object 'rbd_data.12e14e0cad6b.000000000000042f' -> pg 1.38cd6b20 (1.20) -> up ([2,1], p2) acting ([2,1], p2)
osdmap e37 pool 'ceph-demo' (1) object 'rbd_data.12e14e0cad6b.0000000000000060' -> pg 1.cf585158 (1.58) -> up ([2,0], p2) acting ([2,0], p2)
osdmap e37 pool 'ceph-demo' (1) object 'rbd_data.12e14e0cad6b.0000000000000020' -> pg
。。。
'rbd_data.12e14e0cad6b.0000000000000421' -> pg 1.8116d2df (1.5f) -> up ([2,0], p2) acting ([2,0], p2)
[root@ceph-node01 ~]#
通過上面可以看到 rbd-demo.img 存儲分布到了不同的 PG,然后 PG 又映射到了不同的 OSD 上面;
RBD 特性之一瘦分配
瘦分配隨着空間使用的情況,自動的擴這個空間,大約使用了144M;
[root@ceph-node01 ~]# for i in `rados -p ceph-demo ls |grep rbd_data.12e14e0cad6b`; do rados -p ceph-demo stat $i | gawk '{print $NF}'; done>size.log
[root@ceph-node01 ~]# cat size.log |gawk 'BEGIN{SUM=0}{SUM+=$1}END{print SUM/1024/1024}'
144.652
[root@ceph-node01 ~]#
現在我們自動化通過監控 watch -n 1 'rados -p ceph-demo ls |grep rbd_data.12e14e0cad6b|wc -l' object 數量的變化來查看動態擴空間來說明瘦分配機制,打開另一個窗口,向 /mnt/ rbd-demo/ 目錄中寫入1G的數據文件,可以看到動態分配磁盤空間;
[root@ceph-node01 rbd-demo]# dd if=/dev/zero of=/mnt/rbd-demo/test.log count=1024 bs=1014k
記錄了1024+0 的讀入
記錄了1024+0 的寫出
1063256064字節(1.1 GB)已復制,1.61673 秒,658 MB/秒
[root@ceph-node01 rbd-demo]#
再次進行計算,大約占了一個多G的量,通過df對比下;
[root@ceph-node01 ~]# for i in `rados -p ceph-demo ls |grep rbd_data.12e14e0cad6b`; do rados -p ceph-demo stat $i | gawk '{print $NF}'; done>size.log
[root@ceph-node01 ~]# cat size.log |gawk 'BEGIN{SUM=0}{SUM+=$1}END{print SUM/1024/1024}'
1158.67
[root@ceph-node01 ~]#
通過df 查看空間,基本與上面計算的一致;
[root@ceph-node01 ~]# df -h
文件系統 容量 已用 可用 已用% 掛載點
。。。
/dev/rbd0 20G 1.1G 18G 6% /mnt/rbd-demo
[root@ceph-node01 ~]#
總結
數據存儲流程
- 文件對象;
- 切割成大小為4M的 object 對象;
- object 對象通過CRUSH 算法映射到 PG;
- PG 通過CRUSH算法映射到OSD;
基本使用
創建 pool 池:ceph osd pool create ceph-demo 64 64
在 Pool 池中創建 rbd 對象:
rbd create -p ceph-demo --image rbd-demo.img --size 10G
使用內核map 掛載rbd對象:rbd map ceph-demo/rbd-demo.img
格式化塊設備:mkfs.ext4 /dev/rbd0
掛載塊設備:mount /dev/rbd0 /mnt/rbd-demo/
設置 pool 池信息:ceph osd pool set ceph-demo size 2
擴容 rbd 塊設備:rbd resize ceph-demo/rbd-demo.img --size 20G
擴容掛載后文件系統:resize2fs /dev/rbd0
刪除塊設備:rbd rm -p ceph-demo --image rbd-demo2.img
信息查看
查看pool池中的rbd塊設備:rbd -p ceph-demo ls
查看塊設備詳細信息方式一:rbd info ceph-demo/rbd-demo2.img、
查看塊設備詳細信息方式二:rbd -p ceph-demo info rbd-demo.img
查看本機rbd設備列表:rbd device list
查看塊設備對應的所有 objects :rados -p ceph-demo ls|grep rbd_data.12e14e0cad6b
單個object對象映射的PG及OSD信息/大小等:ceph osd map ceph-demo bd_data.12e14e0cad6b.000000000000042f