在ceph-deploy節點上操作
1 RBD 塊存儲
(1) RBD介紹
RBD即RADOS Block Device的簡稱,RBD塊存儲是最穩定且最常用的存儲類型。RBD塊設備類似磁盤可以被掛載。RBD塊設備具有快照、多副本、克隆和
一致性等特性,數據以條帶化的方式存儲在Ceph集群的多個OSD中。如下是對Ceph RBD的理解。
1) RBD就是Ceph里的塊設備,一個4T的塊設備的功能和一個4T的SATA類似,掛載的RBD就可以當磁盤用;
2) resizable
這個塊可大可小
3) data striped
這個塊在Ceph里面是被切割成若干小塊來保存,不然 1PB 的塊怎么存的下
4) thin-provisioned
精簡置備,1TB的集群是能創建無數1PB的塊的。其實就是塊的大小和在Ceph中實際占用大小是沒有關系的,剛創建出來的塊是不占空間,今后用多大空間
才會在Ceph中占用多大空間。舉例:你有一個32G的U盤,存了一個2G的電影,那么RBD大小就類似於32G,而2G就相當於在Ceph中占用的空間。
塊存儲本質:
1) 將裸磁盤或類似裸磁盤(lvm)設備映射給主機使用,主機可以對其進行格式化並存儲和讀取數據,塊設備讀取速度快但是不支持共享。
2) ceph可以通過內核模塊和librbd庫提供塊設備支持。客戶端可以通過內核模塊掛載rbd使用,客戶端使用rbd塊設備就像使用普通硬盤一樣,可以對
其進行格式化然后使用,客戶應用也可以通過librbd使用ceph塊,典型的是雲平台的塊存儲服務,雲平台可以使用rbd作為雲的存儲后端提供鏡像存儲、volume塊或者客戶的系統引導盤等。
使用場景:
1) 雲平台 (OpenStack做為雲的存儲后端提供鏡像存儲)
2) K8s容器(自動pv供給)
3) map成塊設備直接使用,在存儲里去申請塊,塊映射到系統可以識別的盤,比如ls /dev/可以看到這塊RBD,可以把它掛載到本機。
(2) RBD常用管理命令
命令 | 功能 |
---|---|
rbd create | 創建塊設備映像 |
rbd ls <pool_name> | 列出 rbd 存儲池中的塊設備 |
rbd info | 查看塊設備信息 |
rbd diff | 可以統計 rbd 使用量 |
rbd map | 映射塊設備 |
rbd showmapped | 查看已映射塊設備 |
rbd remove | 刪除塊設備 |
rbd resize | 更改塊設備的大小 |
(3) RBD工作流程
1) 客戶端創建一個pool,並指定pg數量,創建rbd設備並掛載到文件系統;
2) 用戶寫入數據,ceph進行對數據切塊,每個塊的大小默認為4M,每個塊名字是object+序號;
3) 將每個object通過pg進行副本位置的分配;
4) pg根據crush算法會尋找3個osd,把這object分別保存在這3個osd上存儲;
5) osd實際把硬盤格式化為xfs文件系統,object存儲在這個文件系統就相當於存儲了一個文件rbd0.object1.file。
補充:
rbd塊設備在掛載的情況下可以進行快照、基於保護快照的克隆、在線擴容操作。
rbd塊設備在非掛載的情況下可以進行快照的回滾操作。
(4) 創建RBD設備
1) 創建存儲池
格式: ceph osd pool create <pool-name> pg_num [pgp_num]
# ceph osd pool create rbd-pool 256 256
# ceph osd pool ls detail
注:
256 256: 是它的pg number與pgp number的pg數,就是創建一個pool,256個pg,256個pgp,這個會隨着容量的增加,pg也會動態的去擴容,生
產上規定pg會用多少,根據osd的數量,文件數量,做一個前期的規划。
# ceph -s
......(省略內容)
progress:
PG autoscaler decreasing pool 2 PGs from 256 to 32 (17m)
[=========================...] (remaining: 2m)
PG數量設置計算公式: PG數量 = (OSD數量 * 100)/副本數(默認3)
例如我們的環境: (6 * 100)/3=200,一般設置是結果向上取2的N次方,所以pool指定的pg數量就是256。
需要注意的是,在后續增加PG數量時,還必須增加用於歸置PG的PGP數量(pgp_num),PGP的數量應該與PG的數量相等,但在新增POOL時可以不指定
pgp_num,默認會與pg_num保持一致。
PG (Placement Group),pg是一個虛擬的概念,用於存放object,PGP(Placement Group for Placement purpose),相當於是pg存放的
一種osd排列組合。舉個例子:假設集群有3個osd,即osd1,osd2,osd3,副本數為2,如果pgp=1,那么pg存放的osd的組合就有一種,可能是[osd1,osd2],那么所有的pg主從副本都會存放到osd1和osd2上;如果pgp=2,那么其osd組合可能就兩種,可能是[osd1,osd2]和[osd1,osd3],pg的主從
副本會落在[osd1,osd2]或者[osd1,osd3]中,和我們數學中的排列組合很像,所以pg是存放對象的歸屬組是一種虛擬概念,pgp就是pg對應的osd排列
組合。一般情況下,存儲池的pg和pgp的數量設置相等。
pg_num是pg里面包含的object,pgp_num是描述pg的位置,這兩個數是一 一對應的。
PG是指定存儲池存儲對象的歸屬組有多少個,PGP是存儲池PG的OSD分布組合個數;PG的增加會引起PG內的數據進行遷移,遷移到不同的OSD上新生成
的PG中;PGP的增加會引起部分PG的分布變化,但是不會引起PG內對象的變動。
查看pg的分布: ceph pg dump pgs |grep active |awk '{print $1,$19}'
2) 指定存儲池使用的存儲類型
# ceph osd pool application enable rbd-pool rbd
3) 創建一個10G的塊設備
格式: rbd create --size {megabytes} {pool-name}/{image-name}
# rbd create --size 10240 rbd-pool/image01
4) 查看塊設備
# rbd ls rbd-pool
# rbd info rbd-pool/image01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 5e857b2a6d34
block_name_prefix: rbd_data.5e857b2a6d34
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Nov 17 10:13:20 2021
access_timestamp: Wed Nov 17 10:13:20 2021
modify_timestamp: Wed Nov 17 10:13:20 2021
(5) 節點本地掛載使用塊設備
1) 將塊設備映射到系統內核
# rbd map rbd-pool/image01
# rbd showmapped # 只有掛載的節點可以看到
id pool namespace image snap device
0 rbd-pool image01 - /dev/rbd0
注:
如果這里報錯,根據錯誤提示執行禁用當前系統內核不支持的feature即可,出現這種錯誤的原因是OS kernel不支持塊設備鏡像的一些特性,所以映
射失敗。
# rbd feature disable rbd-pool/image01 object-map fast-diff deep-flatten
2) 格式化塊設備
# mkfs.xfs /dev/rbd0
3) 掛載
# mount /dev/rbd0 /mnt
# cd /mnt/
# for((i=1;i<=20;i++));do echo $i > $i.txt;done
4) 取消塊設備和內核映射
# umount /mnt
# rbd unmap rbd-pool/image01
注: 如果取消塊設備報如下錯誤,可以強制取消塊設備的映射
rbd: rbd-pool/image01: mapped more than once, unmapping /dev/rbd0 only
rbd: sysfs write failed
rbd: unmap failed: (16) Device or resource busy
# rbd unmap -o force rbd-pool/image01
(6) 遠程掛載使用塊設備
1) 在管理節點拷貝配置文件和秘鑰到遠程節點上
# cd /root/my-cluster/
# ssh root@172.16.1.34 "mkdir -p /etc/ceph/"
# scp ceph.conf ceph.client.admin.keyring root@172.16.1.34:/etc/ceph/
2) 在遠程節點上配置ceph源
# cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
gpgcheck=0
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
gpgcheck=0
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
gpgcheck=0
EOF
3) 安裝Ceph客戶端
# yum -y install ceph-common
4) 剩余操作就與節點本地掛載使用塊設備一樣了
5) 客戶端執行相關ceph命令
如果想在客戶端去執行相關的ceph命令,需要配置ceph源(和ceph集群版本保持一致),安裝ceph-common,將ceph monitor節點上"/etc/ceph/"
目錄下的"ceph.client.admin.keyring"秘鑰文件和"ceph.conf"配置文件拷到客戶端的"/etc/ceph"目錄下就可以執行ceph相關命令了。
(7) 快照
快照: 在某個時間點的副本,當系統出現問題,可以通過恢復快照恢復之前副本狀態。
1) 創建快照
# rbd snap create rbd-pool/image01@snap01
2) 列出創建的快照
# rbd snap list rbd-pool/image01
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap01 10 GiB Sun Nov 21 21:38:34 2021
3) 查看快照詳細信息
# rbd info rbd-pool/image01@snap01
rbd image 'image01':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
id: 5f6066b25e5f
block_name_prefix: rbd_data.5f6066b25e5f
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sun Nov 21 20:33:30 2021
access_timestamp: Sun Nov 21 20:33:30 2021
modify_timestamp: Sun Nov 21 20:33:30 2021
protected: False
注:
比使用"rbd info rbd-pool/image01"命令多了一個"protected:"。
4) 還原快照
# rm -f /mnt/* # 刪除掛載目錄中的數據,方便測試
# umount /mnt
# rbd unmap rbd-pool/image01
# rbd snap rollback rbd-pool/image01@snap01
Rolling back to snapshot: 100% complete...done.
注:
還原快照前需先取消掛載和內核映射,否則會出錯。
Rolling back to snapshot: 0% complete...failed.
rbd: rollback failed: (30) Read-only file system
5) 重新映射並掛載驗證
# rbd map rbd-pool/image01
# mount /dev/rbd0 /mnt/
# ls -l /mnt/ # 發現刪除的數據都被還原了
6) 刪除指定快照
# rbd snap remove rbd-pool/image01@snap01
(8) 克隆
克隆: 基於指定的塊設備克隆出相同的一份出來
1) 創建一個塊設備並掛載(寫入數據,方便測試)
# rbd create --size 10240 rbd-pool/image02
# rbd feature disable rbd-pool/image02 object-map fast-diff deep-flatten
# rbd map rbd-pool/image02
# mkfs.xfs /dev/rbd1
# mkdir -p /data/
# mount /dev/rbd1 /data/
# for((i=60;i<=70;i++));do echo $i > /data/$i.txt;done
2) 創建快照
# rbd snap create rbd-pool/image02@snap01
# rbd snap ls rbd-pool/image02
SNAPID NAME SIZE PROTECTED TIMESTAMP
6 snap01 10 GiB Sun Nov 21 22:57:06 2021
3) 設置快照處於被保護狀態(快照必須處於被保護狀態才能被克隆)
# rbd snap protect rbd-pool/image02@snap01
# rbd info rbd-pool/image02@snap01
rbd image 'image02':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
id: 61034793a788
block_name_prefix: rbd_data.61034793a788
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sun Nov 21 22:30:25 2021
access_timestamp: Sun Nov 21 22:30:25 2021
modify_timestamp: Sun Nov 21 22:30:25 2021
protected: True
4) 通過快照克隆一個新塊設備
# rbd clone rbd-pool/image02@snap01 rbd-pool/image02_clone
# rbd ls rbd-pool
image01
image02
image02_clone
# 查看快照的children,查看它的子快照
# rbd children rbd-pool/image02@snap01
rbd-pool/image02_clone
# 查看克隆的塊設備信息
# rbd info rbd-pool/image02_clone
rbd image 'image02_clone':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 620d77fb4d01
block_name_prefix: rbd_data.620d77fb4d01
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sun Nov 21 23:16:36 2021
access_timestamp: Sun Nov 21 23:16:36 2021
modify_timestamp: Sun Nov 21 23:16:36 2021
parent: rbd-pool/image02@snap01
overlap: 10 GiB
注: 多了"parent:、overlap:"參數
5) 將克隆的塊設備獨立於父塊設備
# rbd flatten rbd-pool/image02_clone
Image flatten: 100% complete...done.
# rbd info rbd-pool/image02_clone
rbd image 'image02_clone':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 620d77fb4d01
block_name_prefix: rbd_data.620d77fb4d01
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Sun Nov 21 23:16:36 2021
access_timestamp: Sun Nov 21 23:16:36 2021
modify_timestamp: Sun Nov 21 23:16:36 2021
6) 取消快照保護
# rbd snap ls rbd-pool/image02
SNAPID NAME SIZE PROTECTED TIMESTAMP
6 snap01 10 GiB yes Sun Nov 21 22:57:06 2021
# rbd snap unprotect rbd-pool/image02@snap01
# rbd snap ls rbd-pool/image02
SNAPID NAME SIZE PROTECTED TIMESTAMP
6 snap01 10 GiB Sun Nov 21 22:57:06 2021
7) 掛載克隆的塊設備
注: 根據塊設備的快照克隆的塊設備UUID不發生改變,所以克隆的塊設備不能和原塊設備掛載同一台主機上,否則
會產生沖突。由於之前克隆的鏡像已經是格式化的,這里掛載后可以直接使用。
# rbd map rbd-pool/image02_clone
# rbd showmapped
id pool image snap device
0 rbd-pool image02_clone - /dev/rbd0
# mkdir -p /data/
# mount /dev/rbd0 /data/
# ls -l /data/ # 之前的數據都在
(9) 導出導入RBD鏡像
1) 導出RBD鏡像(導出的鏡像是當前的狀態)
# rbd export rbd-pool/image02 /tmp/image02
Exporting image: 100% complete...done.
2) 導入RBD鏡像(先把之前的進行刪除)
# rbd ls rbd-pool
image01
image02
image02_clone
# rbd showmapped
id pool namespace image snap device
0 rbd-pool image01 - /dev/rbd0
1 rbd-pool image02 - /dev/rbd1
# rbd snap ls rbd-pool/image02
SNAPID NAME SIZE PROTECTED TIMESTAMP
6 snap01 10 GiB Sun Nov 21 22:57:06 2021
# umount /dev/rbd1
# rbd unmap rbd-pool/image02
# rbd snap purge rbd-pool/image02 # 刪除鏡像的所有快照,快照必須為非保護狀態,否則無法刪除快照
Removing all snapshots: 100% complete...done.
# rbd remove rbd-pool/image02
# rbd ls rbd-pool
image01
image02_clone
# rbd import /tmp/image02 rbd-pool/image02 --image-format 2
Importing image: 100% complete...done.
# 鏡像導入后映射到主機后進行掛載驗證,由於之前導出的鏡像已經是格式化的,這里掛載后可以直接使用。
(10) 針對RBD實現在線擴容
在k8s中如果使用rbd的話,創建一個塊設備,映射成系統可識別的設備,格式化之后,mount到本地,通過exports共享出去,使用NFS時一起使用RBD,
這樣也是可以的。
1) 使用rbd進行擴容,舉個新例子,新創建一個rbd鏡像
# rbd create --size 10240 rbd-pool/image03
# rbd ls rbd-pool
2) 查看塊存儲的詳細信息
# rbd info rbd-pool/image03
rbd image 'image03':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 45635742c5584
block_name_prefix: rbd_data.45635742c5584
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Tue Nov 23 22:42:18 2021
access_timestamp: Tue Nov 23 22:42:18 2021
modify_timestamp: Tue Nov 23 22:42:18 2021
3) map成系統可識別的設備
# rbd feature disable rbd-pool/image03 object-map fast-diff deep-flatten
# rbd map rbd-pool/image03
4) 格式化
# mkfs.xfs /dev/rbd0
5) 掛載到本地當中
# mount /dev/rbd0 /mnt
6) 使用"df -h"可以查看到磁盤已經掛載上
# df -h
......(省略的內容)
/dev/rbd0 10G 33M 10G 1% /mnt
7) 進行擴容大小
# rbd --image rbd-pool/image03 resize --size 15360
Resizing image: 100% complete...done.
8) 查看rbd的大小,已經擴容到15,但是這個不會直接占用15g,而是用多少占用多少,使用的精簡置用
# rbd info rbd-pool/image03
rbd image 'image03':
size 15 GiB in 3840 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 45635742c5584
block_name_prefix: rbd_data.45635742c5584
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Tue Nov 23 22:42:18 2021
access_timestamp: Tue Nov 23 22:42:18 2021
modify_timestamp: Tue Nov 23 22:42:18 2021
9) 但是查看我們的系統的掛載目錄目前還是沒有擴容到我們的15G,可以執行"xfs_growfs -d"指定掛載目錄
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
......(省略內容)
rbd0 253:0 0 15G 0 disk /mnt
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
......(省略內容)
/dev/rbd0 xfs 10G 33M 10G 1% /mnt
# xfs_growfs /mnt <=> xfs_growfs /dev/rbd0
注:
xfs文件系統: 不需要卸載已經掛載的磁盤,否則擴容會報錯。
ext4文件系統: 命令為"resize2fs /dev/rbd0",如果卸載已經掛載的磁盤,需要先執行"e2fsck -f /dev/rbd0"命令。e2fsck用於檢查已經
卸載的ext2/ext3/ext4系列文件系統塊設備。
# df -hT # 查看已經擴容成功
Filesystem Type Size Used Avail Use% Mounted on
......(省略內容)
/dev/rbd0 xfs 15G 33M 15G 1% /mnt
2 CephFS文件存儲
(1) CephFs文件系統說明
1) CephFS是一個基於ceph集群且兼容POSIX標准的文件系統,創建cephfs文件系統時需要在ceph集群中添加mds服務,該服務負責處理POSIX文件系統
中的metadata部分,實際的數據部分交由ceph集群中的OSD處理。cephfs支持以內核模塊方式加載也支持fuse方式加載。無論是內核模式還是fuse
模式,都是通過調用libcephfs庫來實現cephfs文件系統的加載,而libcephfs庫又調用librados庫與ceph集群進行通信,從而實現cephfs的加載。
2) CephFs的數據是怎么訪問的
首先客戶端通過RPC協議到達MDS,從MDS獲取到元數據的信息,客戶端與RADOS獲取文件的一個IO操作,那么有了這兩份信息,用戶就能得到了想要的那
份文件,MDS和RADOS之間通過journal metadate,這個Journal是記錄文件寫入日志的,這個也是存放到OSD當中的,MDS和rados之間也是由交互的
,因為所有最終的數據都會存到rados當中。
(2) 部署MDS服務
首先要創建兩個pool,一個是cephfs-data,一個是cephfs-metadate,分別存儲文件數據和文件元數據,這個pg也可以設置小一點,這個根據OSD去
配置。
# cd /root/my-cluster/
# ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03
# ceph mds stat # 查看mds節點狀態
3 up:standby
(3) 創建文件系統
1) 創建存儲池
# ceph osd pool create cephfs_data 256 256
# ceph osd pool create cephfs_metadata 256 256
# ceph osd pool ls
device_health_metrics
cephfs_data
cephfs_metadata
2) 創建文件系統
格式: ceph fs new <fs_name> <metadata> <data>
# ceph fs new cephfs-pool cephfs_metadata cephfs_data
new fs with metadata pool 3 and data pool 2
# ceph fs ls # 查看創建后的cephfs
name: cephfs-pool, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
# ceph mds stat
cephfs-pool:1 {0=ceph-node02=up:active} 2 up:standby
# ceph fs status cephfs-pool
cephfs-pool - 0 clients
===========
RANK STATE MDS ACTIVITY DNS INOS
0 active ceph-node02 Reqs: 0 /s 10 13
POOL TYPE USED AVAIL
cephfs_metadata metadata 1536k 35.5G
cephfs_data data 0 35.5G
STANDBY MDS
ceph-node03
ceph-node01
MDS version: ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)
(4) 內核模塊方式掛載(以kernel client形式掛載CephFS)
官方文檔:
http://docs.ceph.org.cn/cephfs/kernel/
http://docs.ceph.org.cn/cephfs/fstab/
在172.16.1.34節點上操作
1) 獲取賬號名與秘鑰
在ceph-deploy節點上操作
# ceph auth list |grep admin -A1
installed auth entries:
client.admin
key: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==
2) 命令行掛載
# mount -t ceph 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt -o \
name=admin,secret=AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==
注:
這里的3個ip地址是mon的ip地址
-o: 指定掛載選項
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
......(省略部分)
172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ ceph 36G 0 36G 0% /mnt
3) 取消掛載
# umount /mnt
4) /etc/fstab掛載
# echo "172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt ceph \
name=admin,secret=AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==,_netdev,noatime 0 0" | sudo tee -a /etc/fstab
# 掛載參數說明
name: 認證用戶
secret: 秘鑰
_netdev: 文件系統居於需要網絡連接的設備上(用於防止系統不斷嘗試掛載這些文件系統,直到系統中網絡被啟動)。
noatime: 不更新文件系統的inode存取時間(例如,可以更快地存取news spool從而提升服務器的速度)。
# 掛載
# mount -a
(5) 內核模塊方式掛載(secretfile)
在172.16.1.34節點上操作
1) 配置ceph源
# cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
gpgcheck=0
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
gpgcheck=0
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
gpgcheck=0
EOF
2) 安裝客戶端
# yum install -y ceph-common
3) 創建秘鑰文件
# mkdir -p /etc/ceph/
# echo 'AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==' > /etc/ceph/admin.secret
# chmod 644 /etc/ceph/admin.secret
4) 命令行掛載
# mount -t ceph 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt -o \
name=admin,secretfile=/etc/ceph/admin.secret
5) /etc/fstab掛載
# echo "172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt ceph \
name=admin,secretfile=/etc/ceph/admin.secret,_netdev,noatime 0 0" | sudo tee -a /etc/fstab
(6) fuse方式掛載(以FUSE client形式掛載CephFS)
官方文檔:
http://docs.ceph.org.cn/cephfs/fuse/
http://docs.ceph.org.cn/cephfs/fstab/
在172.16.1.34節點上操作
1) 配置ceph源
# cat > /etc/yum.repos.d/ceph.repo << EOF
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
gpgcheck=0
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
gpgcheck=0
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
gpgcheck=0
EOF
2) 安裝fuse
# yum install -y ceph-fuse
3) 把監視器主機上的Ceph配置文件和秘鑰拷貝到"/etc/ceph/"目錄下
# mkdir -p /etc/ceph
# scp root@172.16.1.31:/etc/ceph/ceph.conf /etc/ceph/
# scp root@172.16.1.31:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
# chmod 644 /etc/ceph/ceph.conf
# chmod 644 /etc/ceph/ceph.client.admin.keyring
4) 命令行方式掛載
# mkdir -p /data/
# ceph-fuse掛載的目錄必須為非空目錄
# ceph-fuse -m 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789 /data
ceph-fuse[1745]: starting ceph client
2021-11-24T23:54:17.792+0800 7feadc61df80 -1 init, newargv = 0x55977dda0300 newargc=9
ceph-fuse[1745]: starting fuse
# ps -ef | grep fuse
root 1745 1 0 23:54 pts/0 00:00:00 ceph-fuse -m 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789 /data
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
......(省略的內容)
ceph-fuse fuse.ceph-fuse 36G 0 36G 0% /data
5) 取消掛載
# fusermount -u /data/
6) /etc/fstab方式掛載
# echo "id=admin,conf=/etc/ceph/ceph.conf /data fuse.ceph _netdev,defaults 0 0" | sudo tee -a /etc/fstab
# mount -a
(7) MDS主備與主主切換
1) 當前mds狀態
# ceph fs ls
name: cephfs-pool, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
# ceph fs status cephfs-pool
cephfs-pool - 1 clients
===========
RANK STATE MDS ACTIVITY DNS INOS
0 active ceph-node02 Reqs: 0 /s 30 33
POOL TYPE USED AVAIL
cephfs_metadata metadata 1728k 35.9G
cephfs_data data 3840k 35.9G
STANDBY MDS
ceph-node01
ceph-node03
MDS version: ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)
注: 從狀態中可以看到當前cephfs的mds組件為一主(ceph-node02)兩從(ceph-node01、ceph-node03)狀態。
2) 配置MDS主主模式
當cephfs的性能出現在MDS上時,就應該配置多個活動的MDS,通常是多個客戶機應用程序並行的執行大量元數據操作,並且它們分別有自己單獨的工
作目錄,這種情況下很適合使用多主MDS模式。配置MDS多主模式時,每個cephfs文件系統都有一個max_mds設置,可以理解為它將控制創建多少個主
MDS,只有當實際的MDS個數大於或等於max_mds設置的值時,mdx_mds設置才會生效,如果只有一個MDS守護進程在運行,並且max_mds被設置為兩
個,則不會創建第二個主MDS。
當cephfs用的多,數據量大,就會出現性能的問題,配置單個active mds的時候會遇到系統瓶頸,這個時候就需要配置主主模式,把這個數據做一個
類似的負載均衡,多主的話也就是這些主會同時提供服務。
# 添加設置max_mds 2,也就是2個activity,1個standby,稱為主主備模式
# ceph fs set cephfs-pool max_mds 2
# ceph fs status cephfs-pool
cephfs-pool - 1 clients
===========
RANK STATE MDS ACTIVITY DNS INOS
0 active ceph-node02 Reqs: 0 /s 30 33
1 active ceph-node03 Reqs: 0 /s 10 13
POOL TYPE USED AVAIL
cephfs_metadata metadata 2880k 35.9G
cephfs_data data 3840k 35.9G
STANDBY MDS
ceph-node01
MDS version: ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)
注: 從狀態中可以看到當前cephfs的mds組件為兩主(ceph-node02、ceph-node03)一從(ceph-node01、ceph-node03)狀態。
3) 還原單主MDS
要是還原的話,直接設置為max_mds 1,也就是一個activity,兩個standby。
# ceph fs set cephfs-pool max_mds 1
3 對象存儲
(1) 說明
Ceph對象存儲不能像RBD、CephFS那樣方式訪問,它是通過Restfulapi方式進行訪問和使用,兼容S3/Swift接口,由radosgw組件提供服務,所以需
要安裝這個服務。
(2) 部署rgw服務
# cd /root/my-cluster/
# ceph-deploy rgw create ceph-node01 ceph-node02 ceph-node03
(3) 驗證訪問
RGW默認7480端口,瀏覽器訪問(http://172.16.1.31-33:7480),返回anonymous說明服務正常。
(4) 創建 S3 賬號
# radosgw-admin user create --uid="liuchang" --display-name="liuchang"
......(省略的內容)
"keys": [
{
"user": "liuchang",
"access_key": "GAJUYDS9KBP090E2IKDX",
"secret_key": "GegAR4WtkgdxhgHlkBksNdUCcCiPyvj3AlXUDTlB"
}
],
......(省略的內容)
注:
radosgw-admin 是 RADOS 網關用戶管理工具,記住輸出的 keys 中的 access_key 和 secret_key 的值,用於接口訪問認證,如果忘記可
以通過命令'radosgw-admin user info --uid="liuchang"'進行查看。
(5) 編寫Python腳本測試
在172.16.1.34節點上操作
安裝連接boto模塊,用於連接S3接口,參考示例: https://docs.ceph.com/en/nautilus/radosgw/s3/python/
1) 安裝boto模塊
# yum install python3 -y
# python3 -V
Python 3.6.8
# yum install python-pip -y
# pip3 install boto
2) 腳本
# cat ceph-s3test.py
import boto.s3.connection
access_key = 'GAJUYDS9KBP090E2IKDX' # 創建S3用戶時返回的秘鑰
secret_key = 'GegAR4WtkgdxhgHlkBksNdUCcCiPyvj3AlXUDTlB'
host = '172.16.1.31' # RWG節點IP和端口
port = 7480
# 新建一個連接
conn = boto.connect_s3(
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
host=host, port=port,
is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
)
# 新建一個Bucket
bucket = conn.create_bucket('my-new-bucket')
# 列出用戶的所有Bucket
for bucket in conn.get_all_buckets():
print("桶名稱: %s, 創建時間: %s" %(bucket.name,bucket.creation_date))
# 列出Bucket內容
for key in bucket.list():
print("key名稱: %s, 文件大小: %s, 修改時間: %s" %(key.name,key.size,key.last_modified))
# 新建一個對象
key = bucket.new_key('hello.txt')
key.set_contents_from_string('Hello World!')
# 下載一個對象到文件
key = bucket.get_key('hello.txt')
key.get_contents_to_filename('/tmp/hello.txt')
3) 執行腳本
# python3 ceph-s3test.py
桶名稱: my-new-bucket, 創建時間: 2021-11-26T15:14:50.946Z
key名稱: hello.txt, 文件大小: 12, 修改時間: 2021-11-26T15:33:41.092Z
# cat /tmp/hello.txt
Hello World!
4 查看CEPH狀態
(1) 狀態
[root@ceph-deploy ~]# ceph -s
cluster:
id: 14912382-3d84-4cf2-9fdb-eebab12107d8
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 54m)
mgr: ceph-node03(active, since 54m), standbys: ceph-node01, ceph-node02
mds: cephfs-pool:2 {0=ceph-node01=up:active,1=ceph-node02=up:active} 1 up:standby
osd: 6 osds: 6 up (since 54m), 6 in (since 11d)
rgw: 3 daemons active (ceph-node01, ceph-node02, ceph-node03)
task status:
data:
pools: 9 pools, 225 pgs
objects: 267 objects, 84 KiB
usage: 6.5 GiB used, 113 GiB / 120 GiB avail
pgs: 225 active+clean
[root@ceph-deploy ~]#
(2) 磁盤
# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 120 GiB 113 GiB 488 MiB 6.5 GiB 5.40
TOTAL 120 GiB 113 GiB 488 MiB 6.5 GiB 5.40
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 0 0 B 0 36 GiB
cephfs_data 2 64 51 B 20 2.5 MiB 0 54 GiB
cephfs_metadata 3 16 207 KiB 41 2.1 MiB 0 54 GiB
.rgw.root 4 32 2.4 KiB 6 1.1 MiB 0 36 GiB
default.rgw.log 5 32 3.4 KiB 175 6 MiB 0 36 GiB
default.rgw.control 6 32 0 B 8 0 B 0 36 GiB
default.rgw.meta 7 8 836 B 5 768 KiB 0 36 GiB
default.rgw.buckets.index 8 8 0 B 11 0 B 0 36 GiB
default.rgw.buckets.data 9 32 12 B 1 192 KiB 0 36 GiB
[root@ceph-deploy ~]#