我只是簡單的部署測試,並沒有深入的研究相關內容,可能下面的描述並不是准確。
ceph 的中文文檔很不錯,訪問地址: http://docs.ceph.org.cn。
1、ceph 架構簡介
先了解下 ceph 基本組成,有一個大概的了解,這部分內容主要摘抄自 ceph 文檔和別人的文章。
以下部分來自:http://docs.ceph.org.cn/start/intro/
不管你是想為雲平台提供Ceph 對象存儲和/或 Ceph 塊設備,還是想部署一個 Ceph 文件系統或者把 Ceph 作為他用,所有 Ceph 存儲集群的部署都始於部署一個個 Ceph 節點、網絡和 Ceph 存儲集群。 Ceph 存儲集群至少需要一個 Ceph Monitor 和兩個 OSD 守護進程。而運行 Ceph 文件系統客戶端時,則必須要有元數據服務器( Metadata Server )。
- Ceph OSDs: Ceph OSD 守護進程( Ceph OSD )的功能是存儲數據,處理數據的復制、恢復、回填、再均衡,並通過檢查其他OSD 守護進程的心跳來向 Ceph Monitors 提供一些監控信息。當 Ceph 存儲集群設定為有2個副本時,至少需要2個 OSD 守護進程,集群才能達到
active+clean狀態( Ceph 默認有3個副本,但你可以調整副本數)。- Monitors: Ceph Monitor維護着展示集群狀態的各種圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。 Ceph 保存着發生在Monitors 、 OSD 和 PG上的每一次狀態變更的歷史信息(稱為 epoch )。
- MDSs: Ceph 元數據服務器( MDS )為 Ceph 文件系統存儲元數據(也就是說,Ceph 塊設備和 Ceph 對象存儲不使用MDS )。元數據服務器使得 POSIX 文件系統的用戶們,可以在不對 Ceph 存儲集群造成負擔的前提下,執行諸如
ls、find等基本命令。Ceph 把客戶端數據保存為存儲池內的對象。通過使用 CRUSH 算法, Ceph 可以計算出哪個歸置組(PG)應該持有指定的對象(Object),然后進一步計算出哪個 OSD 守護進程持有該歸置組。 CRUSH 算法使得 Ceph 存儲集群能夠動態地伸縮、再均衡和修復。
rados 結構,以下部分來自 https://www.jianshu.com/p/cc3ece850433
一個 Ceph 集群的服務器關系圖,來自 https://docs.switzernet.com/3/public/130910-ceph-dovecot/
更多的內容這里就不轉載了,請直接網絡搜索吧。
參考資料
2、集群節點規划
我這里只是測試一下,所以開了三個虛擬機進行測試。三個虛擬機操作系統都是 CentOS 8。
| 節點 | IP | 數據盤(OSD) | 角色 |
|---|---|---|---|
| ceph-mon1 | 192.168.122.103 | MON、MDS、PROM、GRAFANA | |
| ceph-osd1 | 192.168.122.200 | /dev/vdb1 | OSD |
| ceph-osd2 | 192.168.122.201 | /dev/vdb1 | OSD |
3、准備工作
先在三台機器上,修改 /etc/hosts 文件,添加下面內容:
# ceph 集群節點主機名對應的 ip,每個節點都需要添加
192.168.122.103 ceph-mon1
192.168.122.200 ceph-osd1
192.168.122.201 ceph-osd2
然后分別在每個節點機器上,根據節點所承擔的角色設置主機名
# 下面的 ceph-mon1 需要根據實際節點進行確定
hostnamectl set-hostname ceph-mon1
4、使用 cephadm 部署一個 ceph 集群
4.1、離線安裝包
因為后續需要離線部署到實際工作環境中,所以我這里參照網上的部署方案,制作了一個簡單的離線安裝部署包。
安裝包里面的 cephadm 程序被我修改了,將里面的 command_pull 函數里面 cmd 數組中的 'pull' 改為了 'images' 。因為離線部署不需要使用 docker 或者 podman 去實際拉取鏡像,使用本地鏡像即可。
離線安裝包只適合在 CentOS 8 x86_64 下使用,其他系統環境無法兼顧。離線安裝包主要是打包了 podman、python3、smartmontools、chrony 的安裝包,以及 cephadm 及其需要用到的幾個容器鏡像。
cephadm 使用到的鏡像列表如下:
sudo podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.ceph.io/ceph-ci/ceph v17.0.0 fb6c62c88122 11 hours ago 1.14 GB
docker.io/ceph/ceph-grafana 6.7.4 80728b29ad3f 3 months ago 495 MB
docker.io/prom/prometheus v2.18.1 de242295e225 11 months ago 141 MB
docker.io/prom/alertmanager v0.20.0 0881eb8f169f 16 months ago 53.5 MB
離線安裝包下載地址:
鏈接: https://pan.baidu.com/s/1zIODZ9cfMVCxLQrU9YRyow 提取碼: cxi5 復制這段內容后打開百度網盤手機App,操作更方便哦
注意,在安裝完成之后,可以將 cephadm 復制到 /usr/bin 目錄下,后續可以直接使用,無需指定路徑。
4.2、在 ceph-mon1 節點進行部署
將上面說的離線安裝包上傳到 ceph-mon1 節點,解壓后進入 ceph_centos8_x86_64 文件夾,執行下面命令進行基礎依賴組件安裝:
# 執行 install.sh 腳本,安裝必要的一些軟件,以及導入鏡像到容器
./install.sh
安裝完成基礎組件后,再執行 cluster.gen.sh 腳本來創建集群,執行的過程中,會要求輸入 MON 節點的 IP,直接輸入后回車即可:
./cluster.gen.sh
... ...
Ceph Monitor維護着展示集群狀態的各種圖表,包括監視器圖、 OSD 圖、歸置組( PG )圖、和 CRUSH 圖。
請輸入 MON (Ceph Monitor) 節點 IP:192.168.122.103
如果執行沒有出錯的話,應該會有類似下面的輸出:
... ...
Enabling firewalld port 8443/tcp in current zone...
Ceph Dashboard is now available at:
URL: https://ceph-mon1:8443/
User: admin
Password: j75kmrecsd
You can access the Ceph CLI with:
sudo ./cephadm shell --fsid be48dd3a-983d-11eb-b776-525400648899 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
For more information see:
https://docs.ceph.com/docs/master/mgr/telemetry/
這表示已經安裝成功了,可以使用瀏覽器打開 https://ceph-mon1:8443/ 進行訪問,用戶名和密碼也在輸出中。


4.3、添加 ceph-ods1、ceph-ods2 節點到集群
4.3.1、集群節點間的 SSH 免密訪問設置
前面安裝過程結束后,會在 /etc/ceph 目錄下生成 ceph.pub 文件,這個是 ssh 創建的公鑰文件,將它上傳到 ceph-ods1 和 ceph-ods2 節點,以便實現 SSH 免密登陸。
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd1
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd2
可以使用 ssh-keygen 命令創建新的密鑰對也是可以的。
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:2FaZgTcTf3ol/aafNHh69m9Bb2i8xKiwx8Um6aTtvmw root@ceph-osd1
The key's randomart image is:
+---[RSA 3072]----+
| .o. |
| . += . |
| .+o. o o|
| o . o +.|
| . S o.+o.+|
| .. + =.B+o|
| O = +.*.|
| o.E =++|
| ==. .oo*|
+----[SHA256]-----+
# 創建之后,將 公鑰 拷貝到 ceph-osd1 和 ceph-osd2
ssh-copy-id -f -i /root/.ssh/id_rsa.pub root@ceph-osd1
上面操作只能實現 ceph-mon1 節點免密 SSH 登陸 ceph-osd1(2) 節點,要能夠都互相之間訪問,則需要反過來也操作。
4.3.2、添加節點到集群
下面說的步驟中,直接將離線安裝包拷貝到所有節點上,並執行 install.sh 腳本,就不用麻煩了,可以直接跳到 4.4 的第三個步驟。
注意,下面所說的都是在各個節點分別進行的過程,不是在 ceph-mon1 節點了。
然后將離線安裝包上傳到 ceph-osd1 和 ceph-osd2 節點
scp -r ceph_centos8_x86_64 root@ceph-osd1:/root/
scp -r ceph_centos8_x86_64 root@ceph-osd1:/root/
然后 ssh 登陸到 ceph-osd1 和 ceph-osd2 節點,安裝好 python3
# 這里只記錄對 ceph-osd1 的操作,ceph-osd2 的操作是一樣的
ssh root@ceph-osd1
rpm -Uvh /root/ceph_centos8_x86_64/python3/*.rpm --nodeps
rpm -Uvh /root/ceph_centos8_x86_64/podman/*.rpm --nodeps
# 不安裝 python3 ,添加節點到集群時候會報錯:
# Error EINVAL: Can't communicate with remote host `192.168.122.200`,
# possibly because python3 is not installed there: cannot send (already closed?)
# 不安裝 podman ,添加節點到集群時候會報錯:
# Error EINVAL: New host ceph-osd1 (192.168.122.200) failed check(s): []
注意:如果不進行上面的安裝操作,將無法將節點添加到集群!
執行完成上面的操作之后,可以回到 ceph-mon1 節點,執行下面的命令將 ceph-osd1 和 ceph-osd2 添加到集群。
# 下面最后的 IP 說是可選項,但是如果加上這個 IP 的話,在我這邊無法將節點加入集群
ceph orch host add ceph-osd1 192.168.122.200
ceph orch host add ceph-osd2 192.168.122.201

上面的標簽是使用下面命令添加的(這是在 ceph-mon1 節點執行的),標簽可以添加也可以移除。
ceph orch host label add ceph-osd1 mgr
ceph orch host label add ceph-osd2 mgr
ceph orch apply mgr label:mgr
4.4、在 ceph-ods1、ceph-ods2 節點安裝 OSDs
下面的操作都是在 ceph-ods1、ceph-ods2 節點進行的,兩個節點都要執行。
4.4.1、依賴項安裝
將離線安裝包里面的 ceph-common 、chrony 安裝。(如果上面步驟中是執行 install.sh 安裝的,則跳過此步驟)
rpm -Uvh /root/ceph_centos8_x86_64/chrony/*.rpm --nodeps
rpm -Uvh /root/ceph_centos8_x86_64/ceph-common/*.rpm --nodeps
執行上面的操作后,可以執行下 ceph 命令看看是否正常,應該是會報一下錯誤的:
ceph
Error initializing cluster client: ObjectNotFound('RADOS object not found (error calling conf_read_file)',)
這個只需要將 ceph-mon1 節點上的 /etc/ceph/ceph.conf 和 ceph.client.admin.keyring 文件拷貝到其他節點即可
[root@ceph-mon1 ceph]# scp /etc/ceph/ceph.conf root@ceph-osd1:/etc/ceph/
[root@ceph-mon1 ceph]# scp /etc/ceph/ceph.client.admin.keyring root@ceph-osd1:/etc/ceph/
# 上面命令是在 mon1 節點上操作的,復制到其他節點也是一樣的操作。
然后將 docker.io 和 quay.ceph.io 里面的容器鏡像導入到 podman。(如果上面步驟中是執行 install.sh 安裝的,則跳過此步驟)
podman load -i quay.ceph.io/ceph-ci/ceph.tar quay.ceph.io/ceph-ci/ceph:v17.0.0
podman load -i docker.io/ceph/ceph-grafana.tar docker.io/ceph/ceph-grafana:6.7.4
podman load -i docker.io/prom/prometheus.tar docker.io/prom/prometheus:v2.18.1
podman load -i docker.io/prom/alertmanager.tar docker.io/prom/alertmanager:v0.20.0
podman load -i docker.io/prom/node-exporter.tar docker.io/prom/node-exporter:v0.18.1
4.4.2、添加 OSD 角色(服務)到集群
前面添加了節點到集群,並且也在每個節點都進行必要的依賴項安裝,以及 podman 鏡像的導入,下面可以進行 OSD 角色(服務)的添加了。
在任意節點(因為都已經安裝了 ceph-common,所以那個節點都一樣),
# 在 ceph-osd1 和 ceph-osd2 節點創建 osd 服務
# 注意,下面的 /dev/vdb 是在節點機器上的一個未使用的磁盤
ceph orch daemon add osd ceph-osd1:/dev/vdb
ceph orch daemon add osd ceph-osd2:/dev/vdb
Created osd(s) 1 on host 'ceph-osd2'
# 添加別的角色也是類似的操作,比如添加一個 mon
ceph orch daemon add mon ceph-osd1:192.168.122.200/24


查看一下集群狀態:
ceph -s
cluster:
id: be48dd3a-983d-11eb-b776-525400648899
health: HEALTH_WARN
clock skew detected on mon.ceph-osd1
OSD count 2 < osd_pool_default_size 3
services:
mon: 2 daemons, quorum ceph-mon1,ceph-osd1 (age 31m)
mgr: ceph-mon1.nabssq(active, since 25h)
osd: 2 osds: 2 up (since 20m), 2 in (since 20m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 9.9 MiB used, 40 GiB / 40 GiB avail
pgs:
因為我這里只有兩個 OSDs ,所以這里會有警告。
5、創建一個文件系統卷
執行完成上面的操作之后,可以創建一個文件系統進行測試一下
# 可以先創建兩個 Pool,如果不創建的話,會默認創建的
# ceph osd pool create testfs.data # 用於保存數據
# ceph osd pool create testfs.meta # 用於保存元數據
# 創建一個文件系統卷 testfs
# 下面命令中的 testfs.meta testfs.data 不指定就會創建默認名稱是
# cephfs.testfs.meta 和 cephfs.testfs.data 的 Pool
# 如果上面創建了別的名字的 Pool ,這里也是可以用的,指定 Pool 名稱就是
ceph fs volume create testfs # testfs.meta testfs.data
# 查看一下當前的文件系統卷有哪些
ceph fs volume ls
[
{
"name": "testfs"
}
]
創建完成之后,添加一個 mds (元數據)服務
# 設置一下副本數量
ceph orch apply mds testfs --placement="2 ceph-osd1 ceph-osd2"
# 在節點 ceph-mon1 上添加 mds 服務
ceph orch daemon add mds testfs ceph-mon1
# 查看一下文件系統狀態
ceph fs status testfs
testfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 reconnect testfs.ceph-mon1.hypudc 0 0 0 0
POOL TYPE USED AVAIL
cephfs.testfs.meta metadata 64.0k 18.9G
cephfs.testfs.data data 0 12.6G
MDS version: ceph version 17.0.0-2904-g116ef525 (116ef52566c5fb8f7621439218fb492595e2d85a) quincy (dev)
使用命令 ceph mds stat 查看下 mds 服務狀態
ceph mds stat
testfs:1 cephfs:1 {cephfs:0=cephfs.ceph-mon1.komjhm=up:active,testfs:0=testfs.ceph-mon1.hypudc=up:active}
重新看一下集群狀態,我這里因為創建了兩個文件系統和 mds ,所以下面有的顯示了兩個的狀態。
ceph -s
cluster:
id: be48dd3a-983d-11eb-b776-525400648899
health: HEALTH_WARN
insufficient standby MDS daemons available
clock skew detected on mon.ceph-osd1
Degraded data redundancy: 22/66 objects degraded (33.333%), 13 pgs degraded, 224 pgs undersized
OSD count 2 < osd_pool_default_size 3
services:
mon: 2 daemons, quorum ceph-mon1,ceph-osd1 (age 97m)
mgr: ceph-mon1.nabssq(active, since 26h)
mds: 2/2 daemons up
osd: 2 osds: 2 up (since 85m), 2 in (since 86m)
data:
volumes: 2/2 healthy
pools: 4 pools, 224 pgs
objects: 22 objects, 2.3 KiB
usage: 13 MiB used, 40 GiB / 40 GiB avail
pgs: 22/66 objects degraded (33.333%)
211 active+undersized
13 active+undersized+degraded
io:
client: 409 B/s rd, 0 op/s rd, 0 op/s wr
progress:
Global Recovery Event (22m)
[............................]

6、在客戶端機器掛載 cephfs
先在客戶端機器上安裝 ceph-common,軟件安裝包在離線安裝包里面有。
然后直接使用下面的命令進行掛載操作即可:
# 創建掛載點目錄,我這里創建兩個,把前面創建的兩個 fs 都掛載上
mkdir /mnt/testfs
mkdir /mnt/cephfs
# 使用 mount.ceph 進行掛載,使用的相關參數等可以 man mount.ceph 進行查看
# secret 參數的值來自於 /etc/ceph/ceph.client.admin.keyring 文件內
# fs 用於指定使用那個 cephfs
#
mount -t ceph :/ /mnt/testfs -o name=admin,secret=AQCJs25gjmpIBBAAdbmFcI+nfdd9rfsa+zW78g==,fs=testfs
# 指定任意一個 MON 節點的 IP 都可以,也可以指定多個,用 , 分隔
mount -t ceph 192.168.122.200:6789:/ cephfs -o name=admin,secret=AQCJs25gjmpIBBAAdbmFcI+nfdd9rfsa+zW78g==,fs=cephfs
# 掛載后使用 df 命令查看下
df -h
文件系統 容量 已用 可用 已用% 掛載點
.... 多余的刪掉了....
192.168.122.103:6789:/ 12G 2.4G 9.3G 21% /mnt/cephfs
192.168.122.200:6789:/ 11G 1.7G 9.3G 15% /mnt/testfs
更多參數和掛載示例還是通過 man mount.ceph 進行查詢比較好。
使用 ceph fs dump 命令查看一下 cephfs 的狀況。
ceph fs dump
dumped fsmap epoch 16
e16
enable_multiple, ever_enabled_multiple: 1,1
compat: compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
legacy client fscid: 1
Filesystem 'testfs' (1)
fs_name testfs
epoch 16
flags 12
created 2021-04-09T09:28:18.089566+0000
modified 2021-04-12T03:08:34.919957+0000
tableserver 0
root 0
session_timeout 60
session_autoclose 300
max_file_size 1099511627776
required_client_features {}
last_failure 0
last_failure_osd_epoch 35
compat compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds 1
in 0
up {0=14646}
failed
damaged
stopped
data_pools [2]
metadata_pool 1
inline_data disabled
balancer
standby_count_wanted 1
[mds.testfs.ceph-mon1.hypudc{0:14646} state up:active seq 58769 join_fscid=1 addr [v2:192.168.122.103:6804/1724461665,v1:192.168.122.103:6805/1724461665]]
Filesystem 'cephfs' (2)
fs_name cephfs
epoch 14
flags 12
created 2021-04-09T09:40:15.916424+0000
modified 2021-04-09T09:50:45.474894+0000
tableserver 0
root 0
session_timeout 60
session_autoclose 300
max_file_size 1099511627776
required_client_features {}
last_failure 0
last_failure_osd_epoch 0
compat compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds 1
in 0
up {0=24235}
failed
damaged
stopped
data_pools [3]
metadata_pool 4
inline_data disabled
balancer
standby_count_wanted 0
[mds.cephfs.ceph-mon1.komjhm{0:24235} state up:active seq 3 join_fscid=2 addr [v2:192.168.122.103:6802/4112730485,v1:192.168.122.103:6803/4112730485]]



