Ceph RBD 部署與管理
RBD塊存儲是ceph提供的3種存儲類型中使用最廣泛,最穩定的存儲類型。RBD塊類似於磁盤,可以掛載到物理機或虛擬機中,通常的掛載方式有兩種:
- Kernel模塊(KRBD)
- 利用QEMU模擬器通過LIBRBD方式
塊是一個有序字節,普通的一個塊大小為512字節。基於塊存儲是最常見的方式,常見的硬盤、軟盤和CD光驅等都是存儲數據最簡單快捷的設備。
在物理機上提供塊設備時,使用的是Kernel的RBD模塊,基於內核模塊驅動時,可以使用Linux自帶的頁緩存(Page Caching)來提高性能。
當在虛擬機(比如QUEM/KVM)提供塊設備時,通常是使用LIBVIRT調用librbd庫的方式提供塊設備。
部署RBD
在部署之前,需要檢查內核版本,看是否支持RBD,建議升級到4.5以上版本內核
[[email protected] ~]# uname -r
4.4.174-1.el7.elrepo.x86_64
[[email protected] ~]# modprobe rbd
一. 初始化集群
- 在部署RBD之前,需要先部署一個Ceph 集群,集群狀態如下:
[[email protected] ~]# ceph -s cluster: id: 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5 health: HEALTH_OK services: mon: 2 daemons, quorum local-node-2,local-node-3 mgr: ceph-mgr(active) osd: 9 osds: 9 up, 9 in data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 9.2 GiB used, 81 GiB / 90 GiB avail pgs: [[email protected] ~]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.08817 root default -3 0.02939 host local-node-1 0 hdd 0.00980 osd.0 up 1.00000 1.00000 1 hdd 0.00980 osd.1 up 1.00000 1.00000 2 hdd 0.00980 osd.2 up 1.00000 1.00000 -5 0.02939 host local-node-2 3 hdd 0.00980 osd.3 up 1.00000 1.00000 4 hdd 0.00980 osd.4 up 1.00000 1.00000 5 hdd 0.00980 osd.5 up 1.00000 1.00000 -7 0.02939 host local-node-3 6 hdd 0.00980 osd.6 up 1.00000 1.00000 7 hdd 0.00980 osd.7 up 1.00000 1.00000 8 hdd 0.00980 osd.8 up 1.00000 1.00000
- 初始pool
ceph osd pool create ceph_rbd 128
rbd pool init ceph_rbd
- 創建一個塊存儲的用戶:
ceph auth get-or-create client.{ID} mon ‘profile rbd‘ osd ‘profile {profile name} [pool={pool-name}][, profile ...]‘ EG: # ceph auth get-or-create client.docker mon ‘profile rbd‘ osd ‘profile rbd pool=ceph_rbd, profile rbd-read-only pool=images‘ [client.docker] key = AQDQkK1cpNAKJRAAnaw2ZYeFHsXrsTWX3QonkQ==
- 添加此用戶文件到配置目錄
[[email protected] ~]# cat /etc/ceph/ceph.client.docker.keyring
[client.docker]
key = AQDQkK1cpNAKJRAAnaw2ZYeFHsXrsTWX3QonkQ==
二. 創建塊設備鏡像
- 創建一個指定大小的塊設備鏡像,這裏的size單位為M。 ==在下面的所有命令中,如果不指定pool默認操作名為rbd的pool==
rbd create --size {megabytes} {pool-name}/{image-name}
eg:
[[email protected] ~]# rbd create --size 1024 ceph_rbd/docker_image
- 查看創建的鏡像
[[email protected] ~]# rbd ls ceph_rbd
docker_image
- 列出rbd池中將要延遲刪除塊設備
[[email protected] ~]# rbd trash ls ceph_rbd
- 檢索鏡像的信息:
[[email protected] ~]# rbd info ceph_rbd/docker_image
rbd image ‘docker_image‘:
size 1 GiB in 256 objects
order 22 (4 MiB objects)
id: 1bedc6b8b4567
block_name_prefix: rbd_data.1bedc6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Apr 10 14:52:48 2019
- 如果有需要,可以給鏡像擴容或者縮容
# 擴容
[[email protected] ~]# rbd resize --size 2048 ceph_rbd/docker_image
Resizing image: 100% complete...done.
# 縮容
[[email protected] ~]# rbd resize --size 1024 ceph_rbd/docker_image --allow-shrink
Resizing image: 100% complete...done.
Ceph的塊鏡像設備是精簡配置,在創建他們並指定大小時並不會使用物理存儲空間,直到存儲數據。但是它們可以通過--size指定最大容量的限制。
- 刪除塊設備鏡像
rbd rm ceph_rbd/docker_image
- 可以將暫時不用的鏡像移入trash
# rbd trash mv ceph_rbd/docker_image
# rbd trash ls ceph_rbd
1beb76b8b4567 docker_image
- 如果要恢復trash中的鏡像可以執行如下命令:
rbd trash restore ceph_rbd/1beb76b8b4567
# 此時trash中將不會有數據,原來的鏡像已經恢復
# rbd ls ceph_rbd
docker_image
- 如果要在恢復的時候重命名鏡像,執行如下命令:
rbd trash restore ceph_rbd/1beb76b8b4567 --image docker # 將鏡像重命名為docker
- 刪除trash中的鏡像,需要使用鏡像的ID
rbd trash rm ceph_rbd/1beb76b8b4567
提示:
- 即使這個鏡像存在快照,或者它自身某一個克隆正在被使用,都可以將鏡像移入trash,但是不能從trash中刪除。
- 如果想要刪除,可以使用-expires-at設置延遲時間(默認為now),如果延遲時間尚未到期,則除非使用-force,否則無法刪除
三. 使用內核模塊映射RBD
- 檢查集群版本和可調參數版本:
# 在內核版本為4.5以下的,建議使用hammer,否則會出現無法映射rbd的情況
[[email protected] ~]# ceph osd crush show-tunables
{
"choose_local_tries": 0,
"choose_local_fallback_tries": 0,
"choose_total_tries": 50,
"chooseleaf_descend_once": 1,
"chooseleaf_vary_r": 1,
"chooseleaf_stable": 0,
"straw_calc_version": 1,
"allowed_bucket_algs": 54,
"profile": "hammer",
"optimal_tunables": 0,
"legacy_tunables": 0,
"minimum_required_version": "hammer",
"require_feature_tunables": 1,
"require_feature_tunables2": 1,
"has_v2_rules": 0,
"require_feature_tunables3": 1,
"has_v3_rules": 0,
"has_v4_buckets": 1,
"require_feature_tunables5": 0,
"has_v5_rules": 0
}
# 設置版本
[[email protected] ~]# ceph osd crush tunables hammer
- 查看當前存在的鏡像
[[email protected] ~]# rbd list ceph_rbd
docker_image
3.在客戶端映射塊設備(需要安裝ceph)
[[email protected] ~]# rbd device map ceph_rbd/docker_image --id admin
/dev/rbd0
==提示:==
如果在執行映射步驟時出現以下報錯,說明當前內核rbd的一些特性並不支持,需要禁用某些特性:
# rbd device map ceph_rbd/docker_image --id admin
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
禁用特性:
# rbd feature disable ceph_rbd/docker_image exclusive-lock, object-map, fast-diff, deep-flatten
- 如果設置了密鑰認證策略,在映射的時候需要指定密鑰,可以是指定keyring文件,也可以是單獨保存密鑰的文件:
sudo rbd device map rbd/myimage --id admin --keyring /path/to/keyring
sudo rbd device map rbd/myimage --id admin --keyfile /path/to/file
eg:
#rbd device map ceph_rbd/docker_image --id docker --keyring /etc/ceph/ceph.client.docker.keyring
/dev/rbd0
- 查看映射的塊存儲
[[email protected] ~]# rbd device list
id pool image snap device
0 ceph_rbd docker_image - /dev/rbd0
[[email protected] ~]# lsblk | grep rbd
rbd0 252:0 0 1G 0 disk
- 使用rbd塊存儲
[[email protected] ~]# mkfs.xfs /dev/rbd
[[email protected] ~]# mount /dev/rbd0 /mnt
7 . 如果要卸載設備使用如下命令:
[[email protected] ~]# umount /mnt/
[[email protected] ~]# rbd device unmap /dev/rbd0
RBD的特性
當掛載的rbd 被卸載掉之後,塊設備中的數據一般情況下不會丟失(強制重啟後可能會損壞數據從而不可用),可以重新掛載到另一個主機上。
RBD支持復制,快照和在線擴容等功能。
RBD 快照
快照是映像在某個特定時間點的一份==只讀副本==。 Ceph 塊設備的一個高級特性就是你可以為映像創建快照來保留其歷史。 Ceph 還支持分層快照,讓你快速、簡便地克隆映像(如 VM 映像)。 Ceph 的快照功能支持 rbd 命令和多種高級接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack 。
如果在做快照時映像仍在進行 I/O 操作,快照可能就獲取不到該映像準確的或最新的數據,並且該快照可能不得不被克隆到一個新的可掛載的映像中。所以,我們建議在做快照前先停止 I/O 操作。如果映像內包含文件系統,在做快照前請確保文件系統處於一致的狀態或者使用
fsck
命令先檢查掛載的塊設備。要停止 I/O 操作可以使用 fsfreeze 命令。 對於虛擬機,qemu-guest-agent 被用來在做快照時自動凍結文件系統。
- 檢查文件系統,在創建快照前凍結IO操作(fsfreeze的更多操作參考: https://blog.pythian.com/fsfreeze-in-linux/),==執行此命令之後所有對此目錄文件的操作都會hang住==
fsfreeze -f /mnt
- 創建快照:
rbd snap create rbd/[email protected]
EG:
rbd snap create rbd/[email protected]
- 快照創建成功後解除IO凍結
fsfreeze -u /mnt/
- 查看快照
[[email protected] ~]# rbd snap ls rbd/test
SNAPID NAME SIZE TIMESTAMP
4 test-snap 1 GiB Tue Apr 16 14:49:27 2019
5 test-snap-2 1 GiB Tue Apr 16 15:56:18 2019
- 回滾,回滾後的鏡像會保留之前的快照數據,但是它是只讀的,不能對其進行寫入和刪除操作。
rbd snap rollback rbd/[email protected]
- 對於掛載的磁盤,需要卸載後重新掛載,如果掛載出現如下錯誤:
# mount /dev/rbd0 /mnt/
mount: wrong fs type, bad option, bad superblock on /dev/rbd0,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
# 當使用xfs_repair修復時出現如下報錯:
xfs_repair /dev/rbd0
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
ERROR: The filesystem has valuable metadata changes in a log which needs to
be replayed. Mount the filesystem to replay the log, and unmount it before
re-running xfs_repair. If you are unable to mount the filesystem, then use
the -L option to destroy the log and attempt a repair.
Note that destroying the log may cause corruption -- please attempt a mount
of the filesystem before doing this.
# 使用-L 參數修復:
xfs_repair -L /dev/rbd0
- 掛載後的文件,系統依然是只讀的。
mount /dev/rbd0 /mnt/
- 如果要刪除快照,執行如下命令:
rbd snap rm rbd/[email protected]
# 如果要刪除一個映像的所有快照,執行:
rbd snap purge rbd/foo
RBD 復制
Ceph 可以從快照中克隆寫時復制副本,由於快照是只讀的,當需要對文件進行修改時,我們可以使用快照創建一個寫時復制的副本。(Openstack中,使用這種機制創建新的虛擬機,通常使用快照保存鏡像,復制這個快照創建新的虛擬機)
Ceph 僅支持克隆 format 2 的映像(即用 rbd create --image-format 2 創建的,這個在新版中是默認的)。內核客戶端從 3.10 版開始支持克隆的映像
具體的流程如下:
創建塊設備映像-->創建快照-->保護快照-->克隆快照
- 保護快照。克隆映像要訪問父快照。如果用戶不小心刪除了父快照,所有克隆映像都會損壞。為防止數據丟失,在克隆前必須先保護快照:
# 創建快照
rbd snap create rbd/[email protected]
#列出快照
# rbd snap list rbd/test
SNAPID NAME SIZE TIMESTAMP
10 test-snap 1 GiB Tue Apr 16 17:46:48 2019
# 保護快照,這樣就無法被刪除了
rbd snap protect rbd/[email protected]
- 克隆快照,需要指定父存儲池,父映像名和快照,子存儲池和子鏡像名,可以指定不同的存儲池:
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
EG:
rbd clone rbd/[email protected] rbd/test-new
查看新創建的鏡像:
# rbd ls
test
test-new
- 取消快照保護
rbd snap unprotect rbd/[email protected]
- 查看快照的生成的子鏡像
# rbd children rbd/[email protected]
rbd/test-new
[[email protected] ~]# rbd --pool rbd --image test-new info
rbd image ‘test-new‘:
size 1 GiB in 256 objects
order 22 (4 MiB objects)
id: ba9096b8b4567
block_name_prefix: rbd_data.ba9096b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Tue Apr 16 17:53:51 2019
parent: rbd/[email protected] # 此處顯示了父快照等關聯信息
overlap: 1 GiB
- 扁平化鏡像,使它和父鏡像脫離依賴關聯,防止父鏡像改動後對新鏡像產生影響:
rbd flatten rbd/test-new
- 此時,新生成的鏡像就可以任意讀寫了。
RBD在線擴容
- 對已經掛載的rbd進行擴容:
# rbd resize ceph_rbd/docker_image --size 4096
Resizing image: 100% complete...done.
- 查看擴容後的狀態:
# rbd info ceph_rbd/docker_image
rbd image ‘docker_image‘:
size 4 GiB in 1024 objects
order 22 (4 MiB objects)
id: 1bef96b8b4567
block_name_prefix: rbd_data.1bef96b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Wed Apr 10 15:50:21 2019
- 檢查客戶機上的容量是否被內核所接受:
# xfs_growfs -d /mnt
meta-data=/dev/rbd0 isize=512 agcount=9, agsize=31744 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262144 to 1048576
# lsblk | grep mnt
rbd0 252:0 0 4G 0 disk /mnt
- 直接上傳超過1G的文件,發現xfs文件系統已經自動擴容了:
# df -h | grep mnt
/dev/rbd0 4.0G 3.1G 998M 76% /mnt
RBD 在線縮容 (作死操作,僅用於測試)
- 在執行縮容操作時,確認有足夠的空余空間,否則可能會丟失數據:
# rbd resize --size 2048 ceph_rbd/docker_image --allow-shrink
Resizing image: 100% complete...done.
- 查看縮容後的掛載盤:
# lsblk |grep mnt
rbd0 252:0 0 2G 0 disk /mnt
# xfs_growfs -d /mnt/
meta-data=/dev/rbd0 isize=512 agcount=34, agsize=31744 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1048576, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data size 524288 too small, old size is 1048576
- 不建議這樣操作。
RBD 卸載
==如果要卸載RBD,存放的數據會丟失。==
- 卸載磁盤,取消映射
[[email protected] mnt]# df -h | grep mnt
...
/dev/rbd0 2.0G 33M 2.0G 2% /mnt
[[email protected] ~]# rbd device list
id pool image snap device
0 ceph_rbd docker_image - /dev/rbd0
[[email protected] ~]# rbd device unmap /dev/rbd0
- 刪除rbd鏡像
[[email protected] ~]# rbd ls ceph_rbd
docker_image
[[email protected] ~]# rbd info ceph_rbd/docker_image
rbd image ‘docker_image‘:
size 2 GiB in 512 objects
order 22 (4 MiB objects)
id: 1bef96b8b4567
block_name_prefix: rbd_data.1bef96b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Wed Apr 10 15:50:21 2019
[[email protected] ~]# rbd trash ls ceph_rbd
# 將rbd移除到trash,也可以直接刪除
[[email protected] ~]# rbd trash mv ceph_rbd/docker_image
[[email protected] ~]# rbd trash ls ceph_rbd
1bef96b8b4567 docker_image
# 從trash 中刪除鏡像
[[email protected] ~]# rbd trash rm ceph_rbd/1bef96b8b4567
Removing image: 100% complete...done.
[[email protected] ~]# rbd trash ls ceph_rbd
[[email protected] ~]# rbd ls ceph_rbd
- 刪除池
[[email protected] ~]# ceph osd lspools
7 ceph_rbd
[[email protected] ~]# ceph osd pool rm ceph_rbd ceph_rbd --yes-i-really-really-mean-it
pool ‘ceph_rbd‘ removed
- 查看集群狀態:
[[email protected] ~]# ceph -s
cluster:
id: 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
health: HEALTH_OK
services:
mon: 3 daemons, quorum local-node-1,local-node-2,local-node-3
mgr: ceph-mgr(active)
osd: 9 osds: 9 up, 9 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 9.3 GiB used, 81 GiB / 90 GiB avail
pgs:
[[email protected] ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.08817 root default
-3 0.02939 host local-node-1
0 hdd 0.00980 osd.0 up 1.00000 1.00000
1 hdd 0.00980 osd.1 up 1.00000 1.00000
2 hdd 0.00980 osd.2 up 1.00000 1.00000
-5 0.02939 host local-node-2
3 hdd 0.00980 osd.3 up 1.00000 1.00000
4 hdd 0.00980 osd.4 up 1.00000 1.00000
5 hdd 0.00980 osd.5 up 1.00000 1.00000
-7 0.02939 host local-node-3
6 hdd 0.00980 osd.6 up 1.00000 1.00000
7 hdd 0.00980 osd.7 up 1.00000 1.00000
8 hdd 0.00980 osd.8 up 1.00000 1.00000
Ceph RBD 部署與管理