Ceph 塊存儲及客戶端配置(二)


一、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
vim /usr/local/bin/rbd-mount

四、調整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

 


免責聲明!

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



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