在之前的章節中,我們介紹了Ceph叢集的元件,一個最小的Ceph叢集包括Mon、Mgr和Osd三個部分。為了更好地理解Ceph,我建議在進行部署時採取手動方式,這樣方便我們深入瞭解Ceph的底層。今天我們將進行較長的章節講解,希望您能耐心閱讀完(個人建議可以動手實踐一次,效果更佳)。因為Ceph官方檔案中對該過程進行了過於簡單的描述,許多細節都被隱藏了,然而這些細節對於理解Ceph概念至關重要。
在部署之前我們先介紹下Ceph的網路,Ceph叢集是劃分了兩種網路(叢集網路)Cluster Network、(公共網路)Public Network 。
Cluster Network: 就是Ceph 叢集元件內部通訊時使用的網路,也稱為儲存內網。如mon之間相互通訊,osd向mon上報其狀態資訊,主osd向從osd 複製資料等內部操作。
Public Network: Ceph叢集中用於使用者端存取和管理的網路。它是叢集與外部世界(使用者端、管理員等)通訊的主要通道。也稱為儲存外網。說簡單點就是叢集外部使用者端存取叢集內部時的網路。
總結:叢集內部存取走Cluster Network ,叢集外存取叢集內時走Public Network,叢集內外怎麼區分了? 叢集內部元件有 Mon Mgr OSD Mds 等這些內部元件自身通訊就是走Cluster Network ,客戶或者運維人員使用ceph命令與叢集通訊,此時走的就是Public Network 。
思考1 :OpenStack 將Ceph作為後端儲存時,對Ceph的存取是走哪個網路了? 當我們上傳映象到Ceph儲存池時走的是哪個網路了?
做過OpenStack運維的小夥伴們,一定少不了映象製作和上傳,如果後端儲存是Ceph時,該網路的流量是怎麼走了的呢?
#OpenStack 映象上傳命令如下:
openstack image create --container-format bare --disk-format qcow2 \
--public --file /path/to/centos-image.qcow2 centos-image
### 引數說明
--container-format bare 表示容器格式是裸(bare)。
--disk-format qcow2 表示磁碟格式是qcow2。
--public 表示將映象設定為公共映象。
--file /path/to/centos-image.qcow2 指定CentOS映象檔案的路徑。
centos-image 是你給映象起的名稱。
此時的流量是先是走了OpenStack的管理網,存取了Glance映象服務,然後Glance作為使用者端走Public 網路存取Ceph叢集,將資料儲存在後端Ceph叢集中。(管理網一般是千兆網路,而Ceph 無論是Public 還是 Cluster 網路一般都是萬兆及以上高速網路。)
window映象動輒10GB的大小,上傳一個映象少則幾分鐘,多則1個小時,那映象上傳的過程可以發現,瓶頸是在OpenStack管理網上,如果我們傳檔案時不走OpenStack管理網,就能解決該問題。
openstack image create
命令建立一個空映象並記錄其uuid .此過程只是在第一步,建立空映象時使用了OpenStack管理網,後面所有的操作都是走Public 網路。其效率提高了至少10倍。
思考2: Ceph兩個網段是必須的嗎?
測試環境中是可以將兩個網路合併為一個網路,但是生產環境中是強烈不建議這樣使用的。
此時我們是一個測試環境就簡單規劃為一個網路 192.168.200.0/24
一個Ceph叢集至少需要一個Mon和少量OSD,部署一個Mon 需要提前先了解下如下幾個概念
Unique Identifier: 叢集唯一識別符號,在叢集中顯示為fsid, (由於最初的ceph叢集主要支援檔案系統,所以最初fsid代表檔案系統ID,現在ceph叢集也支援了塊儲存和物件儲存,但是這個名字確保留下來。檔案儲存是最先被規劃的,相對物件儲存和塊儲存,卻是最後生產可用的。)
Cluster Name 叢集名字,如果不指定預設為ceph,注意如果是多個ceph叢集的環境需要指定。
當一個節點做為使用者端要存取兩個Ceph叢集 cluster1 和 cluster2 時,需要在ceph 命令指定引數
ceph --cluster CLUSTER cluster name
Monitor Name: Mon名字,預設mon使用主機名為自Mon節點的名字,因此需要做好域名解析。
Monitor Map:啟動初始monitor需要生成monitor map。monitor對映需要fsid,叢集的名字以及一個主機名或IP地址。( 在生活中我們去一個陌生地方會先查地圖(map),同理mon第一次初始化和查詢同伴時也需要Mon Map)
Keyring :Ceph 認證金鑰環,用於叢集身份認證。Cephx認證的不僅有使用者端使用者(比如某使用者端要想執行命令來操作叢集,就要有登入Ceph的金鑰),也有Ceph叢集的伺服器,這是一種特殊的使用者型別MON/OSD/MDS。也就是說,Monitor、OSD、MDS都需要賬號和密碼來登入Ceph系統。因此這裡的Keyring既有叢集內元件的,也有用於管理的Keyring 。(這一點和K8s叢集的認證很類似,都是採用雙向認證)
瞭解上述這些是為了能看懂Ceph的組態檔,但是我們在部署時可以不寫組態檔,但是在生產環境中強烈建議是手動編寫組態檔
環境說明:
部署環境 vmware 虛擬機器器
虛擬機器器系統 CentOS Linux release 7.9.2009 (Core)
部署ceph版本: 14.2.22 nautilus (stable)
ip | 主機名 | 角色 | 磁碟 |
---|---|---|---|
192.168.200.11 | mon01 | mon mgr osd | sdb,sdc,sde,sdf |
1 修改主機名,新增hosts 檔案解析
hostnamectl set-hostname mon01
echo "192.168.200.11 mon01" >> /etc/hosts
2 關閉防火牆和seliux
systemctl stop firewalld
setenforce 0
getenforce
#Disabled
3 設定ceph 的yum 源,這裡使用國內的aliyun的映象站點
cat > /etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
gpgcheck=0
EOF
4 檢查repo
yum repolist
5 自身免密
ssh-keygen -t rsa
#自己的管理IP
ssh-copy-id mon01:
6 安裝ceph 包和其依賴包
yum install -y snappy leveldb gdisk python-argparse gperftools-libs ceph
檢查安裝包
檢查ceph使用者端的版本
[root@mon01 ~]# ceph -v
ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
【注意】安裝了ceph 的基礎元件包之後,系統預設在/var/lib/ceph
目錄下生成了一系列的目錄如下
而且其屬主和屬組都是ceph使用者。為什麼強調這個,在很多利舊的環境中,在清理叢集時清理目錄要清理這些目錄下的檔案。如果不清理,或者清理不乾淨,在ceph多次部署時會產生各種問題,本人在生產環境中就遇見過多次。檔案清理不徹底,檔案許可權不正確的問題。
這裡提供一個生產環境中清理ceph叢集的命令
#停止服務
systemctl stop ceph-osd.target
systemctl stop ceph-mon.target
systemctl stop ceph-mgr.target
#刪除檔案
rm -f /var/lib/ceph/bootstrap-mds/ceph.keyring
rm -f /var/lib/ceph/bootstrap-mgr/ceph.keyring
rm -f /var/lib/ceph/bootstrap-osd/ceph.keyring
rm-f /var/lib/ceph/bootstrap-rbd/ceph.keyring
rm -f /var/lib/ceph/bootstrap-rbd-mirror/ceph.keyring
rm -f /var/lib/ceph/bootstrap-rgw/ceph.keyring
rm -rf /etc/ceph/*
rm -fr /var/lib/ceph/mon/*
rm -fr /var/lib/ceph/mgr/*
rm -rf /etc/systemd/system/multi-user.target.wants/ceph-volume*
rm -rf /etc/systemd/system/ceph-osd.target.wants/ceph-osd*
取消osd掛載
umount /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/osd/*
rm -f /var/log/ceph/*
#刪除lv vg pv 分割區資訊
for i in `ls /dev/ | grep ceph-`; do j=/dev/$i/osd*; lvremove --force --force $j; done
for i in $(vgdisplay |grep "VG Name"|awk -F' ' '{print $3}'); do vgremove -y $i; done
for j in $(pvdisplay|grep 'PV Name'|awk '{print $3}'); do pvremove --force --force $j; done
vgscan --cache
pvscan --cache
lvscan --cache
1 生成uuid 即叢集的fsid,即叢集的唯一識別符號
[root@mon01 ~]# uuidgen
51be96b7-fb6b-4d68-8798-665278119188
2 安裝完ceph元件包之後,已經生成了/etc/ceph目錄
接下來我們補充下ceph.conf 的組態檔
cat > /etc/ceph/ceph.conf <<EOF
fsid = 51be96b7-fb6b-4d68-8798-665278119188
mon_initial_members = mon01
mon_host = 192.168.200.11
public_network = 192.168.200.0/24
#cluster_network = 192.168.200.0/24
EOF
3、生成mon的私鑰檔案,進行身份驗證
上文中提到叢集內的元件存取也是需要認證的,Ceph 預設是使用Cephx 協定進行認證,此時分別給mon 和bootstrap-osd 和client.admin 來生成私鑰檔案
# mon key
ceph-authtool --create-keyring /tmp/ceph.mon.keyring \
--gen-key -n mon. --cap mon 'allow *'
#bootstarp-osd key
ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \
--gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' \
--cap mgr 'allow r'
#client.admin key
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \
--gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *'\
--cap mds 'allow *' --cap mgr 'allow *'
cat /etc/ceph/ceph.client.admin.keyring
檢視其結構也很容易理解,key 表示其私鑰檔案,caps mds = allow *
,表示對mds 擁有了所有的許可權,其他同理。
[client.admin]
key = AQCni2NlDuN7ERAAYr/aL5A5R0OJFeBkwmrBjQ==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
4、匯入key到mon.keyring 檔案中
將client.admin 和bootstrap-osd key,匯入到mon的 keyring 檔案中。並將keyring 檔案複製到/etc/ceph/目錄下
ceph-authtool /tmp/ceph.mon.keyring --import-keyring \
/etc/ceph/ceph.client.admin.keyring
#將bootstap-osd的key 檔案匯入並複製到了 /var/lib/ceph/bootstrap-osd/ceph.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring \
/var/lib/ceph/bootstrap-osd/ceph.keyring
importing contents of /var/lib/ceph/bootstrap-osd/ceph.keyring into /tmp/ceph.mon.keyring
檢視mon此時的keyring 檔案,驗證client.admin和client.bootstrap-osd keyring 已經匯入
[root@mon01 ceph]# cat /tmp/ceph.mon.keyring
[mon.]
key = AQD8h2NlYzQWLRAA306ur5iOEjoHwarGx77FFg==
caps mon = "allow *"
[client.admin]
key = AQCni2NlDuN7ERAAYr/aL5A5R0OJFeBkwmrBjQ==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
[client.bootstrap-osd]
key = AQCKi2NlASwkDxAAPPXUeSwX8nQJJcJao+bgCw==
caps mgr = "allow r"
caps mon = "profile bootstrap-osd"
5 修改許可權為ceph
chown ceph:ceph /tmp/ceph.mon.keyring
6、建立monmap
#單節點mon環境
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
monmaptool --create --add mon01 192.168.200.11 \
--fsid 51be96b7-fb6b-4d68-8798-665278119188 /tmp/monmap
#多節點mon環境
monmaptool --create --add mon01 192.168.200.11 \
--add node2 192.168.200.12 --add node3 192.168.200.13 \
--fsid 51be96b7-fb6b-4d68-8798-665278119188 /tmp/monmap
6.1、什麼是monmap? monmap是做什麼用的?
Monitor Map: Ceph 叢集中的 Monitors 負責維護叢集的狀態資訊、監控資料等。monmap 包含了 Monitors 的資訊,包括它們的主機名、IP地址以及叢集的唯一標識(FSID)等。
啟動 Monitors: 在 Ceph 叢集的啟動過程中,Monitors 首先需要從 monmap 中獲取叢集的初始資訊。monmaptool 的這個命令就是為了生成一個初始化的 monmap 檔案,以供 Monitors 使用。這個檔案會在 Monitors 啟動時被載入。
維護叢集狀態: 一旦 Monitors 啟動,它們會使用 monmap 檔案來維護叢集的狀態。Monitors 之間會相互通訊,共用叢集的狀態資訊。monmap 中包含的資訊幫助 Monitors 確定其他 Monitor 節點的位置,從而進行叢集管理和資料的一致性。
Monitor 選舉: 當一個 Monitor 節點發生故障或新的 Monitor 節點加入叢集時,叢集需要進行 Monitor 的選舉。monmap 包含的資訊有助於叢集中的 OSD(Object Storage Daemon)和使用者端找到 Monitor 節點,並確保選舉過程正確進行。
6.2 、怎麼驗證和檢視當前叢集的monmap ?
[root@mon01 tmp]# monmaptool --print /tmp/monmap
monmaptool: monmap file monmap
epoch 0
fsid 51be96b7-fb6b-4d68-8798-665278119188 #叢集id
last_changed 2023-11-27 03:23:10.956578
created 2023-11-27 03:23:10.956578
min_mon_release 0 (unknown)
0: v1:192.168.200.11:6789/0 mon.mon01 #mon節點資訊
6.3 、寫錯了怎麼覆蓋寫?
# --clobber 引數 將會覆蓋寫
monmaptool --create --add mon01 192.168.200.12 --fsid \
91e36b46-8e6b-4ac6-8292-0a8ac8352907 /tmp/monmap --clobber
7 修改ceph 許可權
chown -R ceph:ceph /tmp/{monmap,ceph.mon.keyring}
8 建立mon01 工作目錄
#mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-mon01 #預設cluster-name 就是ceph
9 用monitor map和keyring填充monitor守護程式,生mon01的資料庫檔案
#sudo -u ceph ceph-mon [--cluster {cluster-name}] \
#--mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
sudo -u ceph ceph-mon --cluster ceph --mkfs -i mon01 \
--monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
驗證
[root@mon01 ceph-mon01]# cat keyring
[mon.]
key = AQD8h2NlYzQWLRAA306ur5iOEjoHwarGx77FFg==
caps mon = "allow *"
[root@mon01 ceph-mon01]# ls
keyring kv_backend store.db
[root@mon01 ceph-mon01]# pwd
/var/lib/ceph/mon/ceph-mon01
【提示】mon 完成之後,即使key誤刪了,但admin keyring還在,可以使用ceph auth list
檢視叢集所有的keyring
完成第9步之後,在以systemd的方式拉起mon01的守護進場就算完成了mon的安裝,但是在拉其服務之前,我們先介紹下兩個概念,副本和糾刪碼
Ceph儲存池在設定有兩種分別是 副本池(Replicated Pool)和糾刪碼池(Erasure-coded Pool),這兩種型別也很好理解,如果是副本池,其存放是以副本的方式存放的,每份副本其資料是完全一致的,相當於1份資料存多份來冗餘。
糾刪碼池一般Ceph是採用向前錯誤更正碼(Forward Error Correction,FEC)
FEC程式碼將K個chunk(以下稱為塊)資料進行冗餘校驗處理,得到了N個塊資料。這N個塊資料既包含原資料,也包括校驗資料。這樣就能保證K個塊中如果有資料丟失,可以通過N個塊中包含的校驗資料進行恢復。
具體地說,在N=K+M中,變數K是資料塊即原始數量;變數M代表防止故障的冗餘塊的數量;變數N是在糾刪碼之後建立的塊的總數。這種方法保證了Ceph可以存取所有原始資料,可以抵抗任意N–K個故障。例如,在K=10、N=16的設定中,Ceph會將6個冗餘塊新增到10個基本塊K中。在M=N–K(即16–10=6)的設定中,Ceph會將16個塊分佈在16個OSD中,這樣即使6個OSD掉線,也可以從10個塊中重建原始檔案,以確保不會丟失資料,提高容錯能力。
簡單來說就是 K個資料塊 + M 個冗餘塊 = N個總塊
【思考3】生產環境中我們是選副本還是糾刪碼呢?
效能優先選副本池,容量優先選糾刪碼。(本質上糾刪碼就是犧牲部分計算效能換儲存容量)
在實際的生產環境中我們的資料都是儲存在磁碟中的,磁碟對應OSD
,磁碟是伺服器上的一個元件,伺服器對應Host
而伺服器是在機架中存放的,一個機櫃RACK
中有N個機架,而機櫃是屬於一個房間的ROOM
,一個大型的資料中心(Data Center
)可能有N個房間,而每個房間可能在同一個地區,也可以在不同地區。
對應其關係為 1Data Center = NRoom = NRACK = NHost = NOSD
總結:Ceph叢集中有很多硬體裝置,從上到下可能涉及某些邏輯單元,類似資料中心→裝置所在機房→機架→行→伺服器→OSD槽等的關係。那麼,如何描述這些邏輯單元的關係、
Bucket 專門用於描述以上提到的這些邏輯單元屬性,以便將來對這些屬性按樹狀結構進行組織。(Bucket邏輯檢視
)(選取規則RuleSet
) (磁碟裝置Device
) 組成了ceph的Crush Map
.(混個臉熟即可,將來會重點介紹)
在ceph中使用 ceph osd tree
就可用檢視該檢視
上述檢視中有3個機架 rack1 rack2 rack3 ,每個rack下分別由一個mon主機和兩個osd 裝置。
無論是副本池還是糾刪碼池,資料都是儲存在osd中的,如果是副本池,預設3副本,那這3個osd,怎麼選取了?
我們先不討論Crush演演算法選取OSD的問題,我們就考慮一個問題,資料冗餘問題。如果我們3個OSD 都在同一個節點,該節點down了,則我們資料都存取不了了,則我們稱我們資料的冗餘級別是OSD的級別的(Host下一級)。
如果我們的選取的3個OSD都在不同節點上(Host),但是這三個節點都在同一個機櫃中(Rack),如果機櫃斷電了,則我們的資料無法存取了,我們稱我們的冗餘級別是節點級別(Host),同理3個OSD 在不同的機櫃中,但在同一個ROOM中,我們稱我們資料的冗餘級別是RACK級別。
那我們怎麼定義資料冗餘級別了,osd_crush_chooseleaf_type 引數則可以定義,其值是一個數位 代表了型別。
ceph osd crush dump #可以檢視到其type
# types
type 0 osd
type 1 host
type 2 chassis #一般不使用,伺服器機框。
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
數位0 代表了其故障域是osd級別,雖然這種說法不嚴謹但是方便理解。後面我們在學習了Crush演演算法第二步之後就知道其OSD 是如何通過Bucket 和RuleSet 來選取OSD的,這裡我們簡單理解就是將3副本分散到3個osd就能滿足要求。如果是數位1 表示其冗餘級別是host 級別。要在不同的節點上,其他同理。
此實驗環境中我們osd都在同一個節點上因此我們將其引數值設定為0
最後ceph.conf 檔案修該為如下
最後我們啟動mon服務
systemctl daemon-reload
systemctl start ceph-mon@mon01
systemctl enable ceph-mon@mon01
檢視叢集狀態
[root@mon01 ceph-mon01]# ceph -s
cluster:
id: 51be96b7-fb6b-4d68-8798-665278119188
health: HEALTH_WARN
mon is allowing insecure global_id reclaim
1 monitors have not enabled msgr2
services:
mon: 1 daemons, quorum mon01 (age 6s)
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
如果ceph狀態顯示如上圖,恭喜你,表示第一個mon已經成功部署了.
mon元件可以說是Ceph最重要的元件了,因此本章節對其每一步操作都做了詳細說明,剩下的mgr osd的部署則會簡單很多,由於篇幅所限,我們將在下一章節繼續。