一、Ceph RDB介紹
Ceph塊設備,以前稱為RADOS設備,為客戶機提供可靠的、分布式的和高性能的塊存儲磁盤。RADOS塊設備利用librbd庫,並以順序的形式在Ceph集群中的多個osd上存儲數據塊。RBD是由Ceph的RADOS層支持的,因此每個塊設備都分布在多個Ceph節點上,提供了高性能和優異的可靠性。RDB有Linux內核的本地支持,這意味着RBD驅動程序從過去幾年就與Linux內核集成得很好。除了可靠性和性能之外,RDB還提供了企業特性,例如:完整和增量快照、瘦配置、寫時復制克隆、動態調整大小等等。RDB還支持內存緩存,這大大提高了其性能。任何普通的Linux主機(RHEL或基於debian的)都可以充當Ceph客戶機。客戶端通過網絡與Ceph存儲集群交互以存儲或檢索用戶數據。Ceph RBD支持已經添加到Linux主線內核中,從2.6.34和以后的版本開始。
二、客戶端安裝Ceph軟件包
2.1 檢查內核是否支持RBD
[root@192-168-5-70 ~]# uname -r 3.10.0-957.el7.x86_64 [root@192-168-5-70 ~]# modprobe rbd [root@192-168-5-70 ~]# echo $? 0
2.2 安裝ceph軟件
# 配置yum源 [root@192-168-5-70 ~]# vim /etc/yum.repos.d/ceph.repo [ceph] name=ceph baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/ gpgcheck=0 [ceph-noarch] name=cephnoarch baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ gpgcheck=0 # 安裝ceph軟件,要使用rbd命令 [root@192-168-5-70 ~]# yum install ceph -y
三、為客戶端創建Ceph塊設備使用的用戶名和密鑰
3.1 使用ceph-deploy部署后並沒有創建任何池,現在要創建塊設備rbd默認池
確定 pg_num 取值是強制性的,因為不能自動計算。下面是幾個常用的值(總的pg):
• 少於 5 個 OSD 時可把 pg_num 設置為 128
• OSD 數量在 5 到 10 個時,可把 pg_num 設置為 512
• OSD 數量在 10 到 50 個時,可把 pg_num 設置為 4096
• OSD 數量大於 50 時,你得理解權衡方法、以及如何自己計算 pg_num 取值
[cephadmin@ceph01 my-cluster]$ ceph osd lspools # 查看集群存儲池 [cephadmin@ceph01 my-cluster]$ ceph osd pool create rbd 64 # pg測試創建為64
刪除pool的方法
# 在ceph.conf中增加一行信息 [cephadmin@ceph01 my-cluster]$ sudo vim /etc/ceph/ceph.conf [global] mon_allow_pool_delete = true # 重啟ceph-mon.target服務 [cephadmin@ceph01 my-cluster]$ sudo systemctl restart ceph-mon.target # 刪除pool操作 [cephadmin@ceph01 my-cluster]$ ceph osd pool rm rbd rbd --yes-i-really-really-mean-it
3.2 在rbd池中創建大小為2G的塊設備
[cephadmin@ceph01 my-cluster]$ rbd create rbd1 --size 2048 --name client.rbd
對塊的其它操作
[cephadmin@ceph01 my-cluster]$ rbd ls # 查看所有的塊 [cephadmin@ceph01 my-cluster]$ rbd ls -p rbd # -p 指定池的名稱,查看池中所有的塊 [cephadmin@ceph01 my-cluster]$ rbd info rbd/rbd1 # 查看塊的具體信息 [cephadmin@ceph01 my-cluster]$ rbd rm rbd/rbd1 # 刪除塊
3.4 在管理端的進行創建帳號密碼,也可以直接使用管理員帳號。
# 帳戶名稱是:client.rbd,mon允許讀,osd允許讀,rbd池允許讀寫和執行,並把輸出的內容寫入到 ceph.client.rbd.keyring文件中
[cephadmin@ceph01 my-cluster]$ ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd' | tee ./ceph.client.rbd.keyring [client.rbd] key = AQACvTdesdXGCBAAqUAA5/wxwgvcGsb1vJ03jw==
3.5 將生成的key和配置文件拷貝到客戶端
[cephadmin@ceph01 my-cluster]$ scp ceph.client.rbd.keyring /etc/ceph/ceph.conf root@192.168.5.70:/etc/ceph/
配置文件中只需要兩行即可
[root@192-168-5-70 ~]# cat /etc/ceph/ceph.conf [global] mon_host = 192.168.5.91,192.168.5.92,192.168.5.93
3.5 客戶端映射塊設備,直接映射會報錯
使用krbd(內核rbd)的客戶端進行快速diff計算(需要對象映射),我們將無法在CentOS內核3.10上映射塊設備映像,因為該內核不支持對象映射(object-map)、深平(deep-flatten)和快速diff(fastdiff)(在內核4.9中引入了支持)。為了解決這個問題,我們將禁用不支持的特性,有幾個選項可以做到這一點:
# 動態禁用 rbd feature disable rbd1 exclusive-lock object-map deep-flatten fast-diff --name client.rbd # 創建RBD鏡像時,只啟用分層特性。 rbd create rbd1 --size 3072 --image-feature layering --name client.rbd # ceph 配置文件中禁用 rbd_default_features = 1
3.6 禁用后再進行映射rbd1塊設備
[root@192-168-5-70 ~]# rbd map --image rbd1 --name client.rbd /dev/rbd0
# 查看所有的映射 [root@192-168-5-70 ~]# rbd showmapped --name client.rbd
id pool image snap device
0 rbd rbd1 - /dev/rbd0
# 取消映射 [root@192-168-5-70 ~]# rbd unmap /dev/rbd0
3.7 格式化文件系統並掛載
[root@192-168-5-70 ~]# mkfs.xfs /dev/rbd0 # 格式化文件系統 [root@192-168-5-70 ~]# mkdir /mnt/ceph-disk1 # 創建掛載目錄 [root@192-168-5-70 ~]# mount /dev/rbd0 /mnt/ceph-disk1 # 進行掛載 [root@192-168-5-70 ~]# df -h /mnt/ceph-disk1/ Filesystem Size Used Avail Use% Mounted on /dev/rbd0 2.0G 33M 3.0G 2% /mnt/ceph-disk1 [root@192-168-5-70 ~]# dd if=/dev/zero of=/mnt/ceph-disk1/test_file1.txt count=100 bs=2M # 向目錄寫入數據 100+0 records in 100+0 records out 209715200 bytes (210 MB) copied, 0.250715 s, 836 MB/s
3.8 制作成服務開機自動掛載

[root@192-168-5-70 ~]# cat /usr/local/bin/rbd-mount #!/bin/bash # Pool name where block device image is stored 池名稱,若不同請修改 export poolname=rbd # Disk image name 塊名稱,若不同請修改 export rbdimage=rbd1 # Mounted Directory # 掛載的目錄,若不同請修改 export mountpoint=/mnt/ceph-disk1 # Image mount/unmount and pool are passed from the systemd service as arguments # Are we are mounting or unmounting if [ "$1" == "m" ]; then modprobe rbd rbd feature disable $rbdimage object-map fast-diff deep-flatten rbd map $rbdimage --id rbd --keyring /etc/ceph/ceph.client.rbd.keyring mkdir -p $mountpoint mount /dev/rbd/$poolname/$rbdimage $mountpoint fi if [ "$1" == "u" ]; then umount $mountpoint rbd unmap /dev/rbd/$poolname/$rbdimage fi [root@192-168-5-70 ~]# chmod +x /usr/local/bin/rbd-mount [root@192-168-5-70 ~]# cat /etc/systemd/system/rbd-mount.service [Unit] Description=RADOS block device mapping for $rbdimage in pool $poolname" Conflicts=shutdown.target Wants=network-online.target After=NetworkManager-wait-online.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/rbd-mount m ExecStop=/usr/local/bin/rbd-mount u [Install] WantedBy=multi-user.target [root@192-168-5-70 ~]# systemctl daemon-reload [root@192-168-5-70 ~]# systemctl enable rbd-mount.service [root@192-168-5-70 ~]# reboot
四、調整Ceph RBD塊大小
Ceph支持 精簡配置 塊設備,這意味着在開始在塊設備上存儲數據之前,物理存儲空間不會被占用。Ceph Block Device非常靈活;可以從Ceph存儲端動態增加或減少RBD的大小。但是, 底層文件系統應該支持 調整大小。高級文件系統(如XFS,Btrfs,EXT,ZFS等)支持文件系統在一定程度上調整大小。
XFS目前不支持收縮,Btrfs和ext4支持收縮,但應謹慎行事!收縮不小心,老板兩行淚。
4.1 在掛載目錄再創建一個文件
[root@192-168-5-70 ~]# echo 'hello ceph' > /mnt/ceph-disk1/file2.txt [root@192-168-5-70 ~]# ls /mnt/ceph-disk1/ file2.txt test_file1.txt
4.2 將rbd1由3G擴容到4G
[root@192-168-5-70 ~]# rbd resize --image rbd1 --size 4096 --name client.rbd Resizing image: 100% complete...done. [root@192-168-5-70 ~]# rbd info --image rbd1 --name client.rbd rbd image 'rbd1': size 4 GiB in 1024 objects order 22 (4 MiB objects) id: 11d36b8b4567 block_name_prefix: rbd_data.11d36b8b4567 format: 2 features: layering op_features: flags: create_timestamp: Mon Feb 3 14:59:19 2020 [root@192-168-5-70 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 50G 0 disk └─vda1 253:1 0 50G 0 part / rbd0 252:0 0 4G 0 disk /mnt/ceph-disk1 [root@192-168-5-70 ~]# df -h /mnt/ceph-disk1 # 檢查文件系統並沒有及時調整到4G Filesystem Size Used Avail Use% Mounted on /dev/rbd0 3.0G 233M 2.8G 8% /mnt/ceph-disk1
[root@192-168-5-70 ~]# dmesg | grep -i capacity
[ 8.094900] rbd: rbd0: capacity 3221225472 features 0x1
[ 2864.714459] rbd0: detected capacity change from 3221225472 to 4294967296
4.3 讓文件系統重新讀取一下
[root@192-168-5-70 ~]# xfs_growfs -d /mnt/ceph-disk1/ meta-data=/dev/rbd0 isize=512 agcount=12, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=786432, 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 786432 to 1048576 [root@192-168-5-70 ~]# df -h /mnt/ceph-disk1 Filesystem Size Used Avail Use% Mounted on /dev/rbd0 4.0G 233M 3.8G 6% /mnt/ceph-disk1 [root@192-168-5-70 ~]# ls /mnt/ceph-disk1/ file2.txt test_file1.txt
五、創建RBD快照
Ceph擴展了對快照的全面支持,快照是 RBD image 時間點 只讀副本。您可以保留 Ceph RBDimage 的狀態,通過創建快照和還原快照來獲取原始數據。如果在 I/O 正在進行 image 處理時拍攝 RBD image 的快照,則快照可能不一致。如果發生這種情況,您將需要將快照克隆到新映像以使其可安裝。拍攝快照時,建議在拍攝快照之前停止應用程序中的 I/O 。這可以通過自定義應用程序以在快照之前發出凍結來完成,也可以使用該 fsfreeze 命令手動完成 。
5.1 創建快照
語法:rbd snap create <pool name>/<image name>@<snap name> [root@192-168-5-70 ~]# rbd snap create rbd/rbd1@snapshot1 -n client.rbd # 創建快照,名稱是snapshot1 [root@192-168-5-70 ~]# rbd snap ls rbd/rbd1 -n client.rbd # 查看rbd1的快照 SNAPID NAME SIZE TIMESTAMP 8 snapshot1 4 GiB Mon Feb 10 15:42:07 2020
5.2 刪除文件進行快照恢復
[root@192-168-5-70 ~]# rm -rf /mnt/ceph-disk1/* # 刪除文件 [root@192-168-5-70 ~]# umount /mnt/ceph-disk1 # 卸載目錄 [root@192-168-5-70 ~]# rbd snap rollback rbd/rbd1@snapshot1 --name client.rbd # 回滾快照 Rolling back to snapshot: 100% complete...done. [root@192-168-5-70 ~]# mount /dev/rbd0 /mnt/ceph-disk1 # 重新掛載 [root@192-168-5-70 ~]# ls /mnt/ceph-disk1/ # 文件和內容都還存在 file2.txt test_file1.txt [root@192-168-5-70 ~]# cat /mnt/ceph-disk1/file2.txt hello ceph
5.3 重命名快照
[root@192-168-5-70 ~]# rbd snap rename rbd/rbd1@snapshot1 rbd/rbd1@snapshot1_newname -n client.rbd
5.4 刪除快照
[root@192-168-5-70 ~]# rbd snap rm rbd/rbd1@snapshot1_newname -n client.rbd # 按名稱刪除快照 Removing snap: 100% complete...done. [root@192-168-5-70 ~]# rbd snap purge rbd/rbd1 --name client.rbd # 刪除多個快照
六、克隆
Ceph支持一個非常好的功能用於從RBD快照創建寫入時復制(COW)克隆。這也稱為Ceph中的快照分層。分層允許客戶創建Ceph RBD的多個即時克隆。這個功能對於OpenStack,CloudStack,Qemu/KVM等雲和虛擬化平台非常有用。這些平台通常以快照的形式保護包含 OS/VM 映像的Ceph RBD映像。稍后,將多次克隆此快照以生成新的虛擬機/實例。快照是只讀的,但COW克隆是完全可寫的; Ceph的這一特性提供了更高的靈活性,在雲平台中非常有用。
每個克隆的圖像(子圖像)都存儲其父快照的引用以讀取圖像數據。因此,在將父快照用於克隆之前,應對其進行保護。在COW克隆映像上寫入數據時,它會將新數據引用存儲到自身。COW克隆圖像與RBD一樣好。它們像RBD一樣非常靈活,這意味着它們可寫,可調整大小,並支持快照和進一步克隆。
6.1 創建具有layering功能的RBD image
[root@192-168-5-70 ~]# rbd create rbd-2 --size 2048 --image-feature layering --name client.rbd [root@192-168-5-70 ~]# rbd info --image rbd-2 -n client.rbd rbd image 'rbd-2': size 2 GiB in 512 objects order 22 (4 MiB objects) id: 858c6b8b4567 block_name_prefix: rbd_data.858c6b8b4567 format: 2 features: layering op_features: flags: create_timestamp: Mon Feb 10 15:59:26 2020
6.2 掛載rbd-2設備
[root@192-168-5-70 ~]# rbd map --image rbd-2 --name client.rbd /dev/rbd1 [root@192-168-5-70 ~]# mkfs.xfs /dev/rbd1 meta-data=/dev/rbd1 isize=512 agcount=8, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=524288, imaxpct=25 = sunit=1024 swidth=1024 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@192-168-5-70 ~]# mkdir /mnt/ceph-disk2
[root@192-168-5-70 ~]# mount /dev/rbd1 /mnt/ceph-disk2 [root@192-168-5-70 ~]# echo 'lzfn ceph-2 20200210' > /mnt/ceph-disk2/rbd2file.txt [root@192-168-5-70 ~]# sync
6.3 為rbd-2的image創建快照,並保護快照。
要創建COW克隆,需要保護快照。這是一個重要的步驟,因為如果快照被刪除,所有附加的COW克隆將被銷毀
[root@192-168-5-70 ~]# rbd snap create rbd/rbd-2@snapshot_for_clone -n client.rbd # 創建快照名稱為snapshot_for_clone
[root@192-168-5-70 ~]# rbd snap protect rbd/rbd-2@snapshot_for_clone -n client.rbd # 保護上面創建的快照
[root@192-168-5-70 ~]# echo 'new file protect after' > /mnt/ceph-disk2/protect.txt # 掛載目錄寫入一個新文件
6.4 創建鏈接克隆
[root@192-168-5-70 ~]# rbd clone rbd/rbd-2@snapshot_for_clone rbd/clone_rbd2 --image-feature layering -n client.rbd [root@192-168-5-70 ~]# rbd info rbd/clone_rbd2 -n client.rbd rbd image 'clone_rbd2': size 2 GiB in 512 objects order 22 (4 MiB objects) id: 14456b8b4567 block_name_prefix: rbd_data.14456b8b4567 format: 2 features: layering op_features: flags: create_timestamp: Mon Feb 10 16:18:38 2020 parent: rbd/rbd-2@snapshot_for_clone # 有父級鏡像的名稱 overlap: 2 GiB # 可以反向查詢 [root@192-168-5-70 ~]# rbd children rbd/rbd-2@snapshot_for_clone -n client.rbd rbd/clone_rbd2 [root@192-168-5-70 ~]# rbd ls -n client.rbd clone_rbd2 rbd-2 rbd1 # 重新掛載后創建新的文件 [root@192-168-5-70 ~]# umount /mnt/ceph-disk2 [root@192-168-5-70 ~]# rbd map --image clone_rbd2 --name client.rbd /dev/rbd2 [root@192-168-5-70 ~]# mount /dev/rbd2 /mnt/ceph-disk2 [root@192-168-5-70 ~]# ls /mnt/ceph-disk2/ rbd2file.txt [root@192-168-5-70 ~]# echo 'clone_rbd2 file' > /mnt/ceph-disk2/clone_rbd2
6.5 創建完整克隆
在 ceph 中,可能叫 flatten ,攤平的意思,但我感覺,叫完整克隆,更便於理解,它與平常的完整克隆不一樣的地方是,平常的完整克隆,直接把父 image 上拷貝過來。而這個 flatten ,則是把把父image 拷貝過來后,再把鏈接克隆上面的內容進行覆蓋上去。目前我們有一個鏈接克隆,它依賴於於 父鏡像 ,有的時候,我們不希望這樣,而想讓他完全獨立,這時候就需要完整克隆了,完整克隆是 浪費磁盤 空間的,並且速度較慢。
[root@192-168-5-70 ~]# rbd flatten rbd/clone_rbd2 -n client.rbd # 創建完整克隆 Image flatten: 100% complete...done. [root@192-168-5-70 ~]# rbd info --image clone_rbd2 -n client.rbd # 已無父級鏡像的名稱,默認情況下與其父級分離 rbd image 'clone_rbd2': size 2 GiB in 512 objects order 22 (4 MiB objects) id: 14996b8b4567 block_name_prefix: rbd_data.14996b8b4567 format: 2 features: layering op_features: flags: create_timestamp: Mon Feb 10 16:38:58 2020
6.6 刪除父級鏡像
[root@192-168-5-70 ~]# rbd snap unprotect rbd/rbd-2@snapshot_for_clone -n client.rbd # 去掉快照保護
[root@192-168-5-70 ~]# rbd snap rm rbd/rbd-2@snapshot_for_clone -n client.rbd # 刪除快照 Removing snap: 100% complete...done.
6.7 驗證文件
# 驗證原文件 [root@192-168-5-70 ~]# rbd list -n client.rbd clone_rbd2 rbd-2 rbd1 [root@192-168-5-70 ~]# umount /mnt/ceph-disk2 [root@192-168-5-70 ~]# mount /dev/rbd1 /mnt/ceph-disk2 [root@192-168-5-70 ~]# ls /mnt/ceph-disk2/ protect.txt rbd2file.txt # 驗證完整克隆image [root@192-168-5-70 ~]# umount /mnt/ceph-disk2 [root@192-168-5-70 ~]# mount /dev/rbd2 /mnt/ceph-disk2 [root@192-168-5-70 ~]# ls /mnt/ceph-disk2 clone_rbd2 rbd2file.txt