比起君子訥于言而敏于行,我更喜歡君子善于言且敏于行。
目錄
一. 準備工作(所有節點)
1. /etc/hosts
2. 安裝python2
3. 配置普戶免密sudo
4. 準備好四塊盤,一塊hdd+sdd為一組,一臺設備上有一組
5. 添加源
二. 安裝 Ceph
在node1上執行 ceph-deploy,作為部署節點
三. 創建 Ceph 集群
四. 安裝 MON、MGR?到所有節點
1. 一些報錯
2. 生成key并分發
在使用 ceph-deploy 工具部署 Ceph 集群時,ceph.client.admin.keyring 文件會自動生成。如果是手動部署 Ceph 集群,需要手動生成 ceph.client.admin.keyring 文件
五. 配置OSD和緩存池
cache-tier + ceph-deploy 模型:SSD 本身作為 單獨的緩存池
SSD 作為獨立緩存池
SSD 作為 OSD 的 DB/WAL
1. 創建主存儲池(用 HDD 組成)
2. 創建緩存池(用 SSD 組成)
3. 創建 OSD ,分別將設備添加為 OSD
報錯問題1:[errno 13] RADOS permission denied (error connecting to the cluster) 說明 Ceph 仍然無法通過 client.bootstrap-osd keyring 連接到集群
報錯問題2:ceph-volume lvm create: error: GPT headers found, they must be removed on: /dev/sdg意思是 /dev/sdg 上存在 GPT 分區表,Ceph 不允許直接在帶有分區表的磁盤上創建 OSD,需要先清理干凈。
4. 把緩存池設置為寫回模式
Error EINVAL: pool 'cache' is not a tier如果遇到了這個報錯,那就先執行5掛接,再執行4設置寫回模式
5.?把緩存池掛接到主存儲池上(建立Tier關系)
6. 將客戶端流量指向緩存池(設置Overlay)
7. 設置緩存池的緩存命中策略為 Bloom 過濾器
8. 設置緩存命中計數和時間周期
9. 設置緩存池最大容量(以字節為單位)
10. 設置緩存池提升對象的讀寫最短時間(秒)
11. 設置緩存池容量閾值,觸發刷寫和驅逐操作
12. 設置緩存池最大容量和最大對象數(可選)
13. 設置緩存池對象最短刷寫周期(秒)
14. 設置緩存池對象最短驅逐周期(秒)
六.?緩存池卸載流程(以后有需要再用)
1. 禁用緩存池(將緩存模式改為 none)
2. 移除流量指向緩存池(取消 Overlay)
3.?從主存儲池中移除緩存池
七.?徹底從集群移除 OSD(以后有需要再用)
1. 查看id號并停止寫入數據
2.在 MON 中刪除 OSD 注冊信息
總結
ubuntu01 | ubuntu02 | ubuntu03 |
MON | MON | MON |
MON | MGR | MGR |
MDS | MDS | |
OSD | OSD |
由于我只有兩臺設備有可用的磁盤和ssd,但是mon最少要奇數才能選舉。所以第三臺我這里只部署mon和mgr,僅參與選舉。這樣的話,第三臺機器哪怕是臺虛擬機或者筆記本,都可以。三臺機器都是ubuntu18.04
一. 準備工作(所有節點)
1. /etc/hosts
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu01
10.xxx.xxx.xxx ubuntu01
10.xxx.xxx.xxx ubuntu02
2. 安裝python2
sudo apt-get install python2.7
which python2.7
sudo ln -s /usr/bin/python2.7 /usr/bin/python2
python2 --version
3. 配置普戶免密sudo
echo "ubuntu ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ubuntu-nopasswd
sudo chmod 440 /etc/sudoers.d/ubuntu-nopasswd
#可以測試一下
sudo -k
sudo ls /root
4. 準備好四塊盤,一塊hdd+sdd為一組,一臺設備上有一組
# 清除所有文件系統簽名(wipefs)
sudo wipefs -a /dev/sdb
sudo wipefs -a /dev/sde
sudo wipefs -a /dev/sdf
sudo wipefs -a /dev/sdg#創建新的 GPT 分區表(確保干凈)
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sde mklabel gpt
sudo parted /dev/sdf mklabel gpt
sudo parted /dev/sdg mklabel gptubuntu01$: lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 7.3T 0 disk ubuntu01$: lsblk /dev/sde
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sde 8:64 0 1.9T 0 disk ubuntu02$: lsblk /dev/sdf
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdf 8:80 0 7.3T 0 disk ubuntu02$:~/storcli64/Linux OS$ lsblk /dev/sdg
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdg 8:96 0 1.9T 0 disk
5. 添加源
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -echo "deb https://download.ceph.com/debian-octopus bionic main" | sudo tee /etc/apt/sources.list.d/ceph.listsudo apt-get cleansudo apt-get update
二. 安裝 Ceph
在node1上執行 ceph-deploy
,作為部署節點
sudo apt install ceph-deploy ceph-common ceph-mds ceph-mon ceph-osd -y#升級的話用這條命令,只升級已安裝的 Ceph 包,而不是全新安裝。所有節點都執行升級
sudo apt install --only-upgrade ceph ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr ceph-deploy -y#查看版本
ceph --version
三. 創建 Ceph 集群
ceph-deploy new ubuntu01 ubuntu02 ubuntu03
創建完之后會生成一些文件,我們做一下conf的優化,做好后分發
~/ceph-cluster$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyringubuntu01:/etc/ceph$ cat ceph.conf
[global]
fsid = xxxxxx-xxxx-xxxx-xxxx-xxxxx
mon_initial_members = ubuntu01, ubuntu02,ubuntu03
mon_host = 10.xxx.xxx.xxx,10.xxx.xxx.xxx,10.xxx.xxx.xxxpublic_network = 10.xxx.xxx.0/24
cluster_network = 10.xxx.xxx.0/24auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephxosd_journal_size = 2048
osd_pool_default_size = 2
osd_pool_default_min_size = 1# MON節點
[mon.ubuntu-R730xd-01]
host = ubuntu-R730xd-01
mon_addr = 10.xxx.xxx.xxx[mon.ubuntu-R730-02]
host = ubuntu-R730-02
mon_addr = 10.xxx.xxx.xxx[mon.ubuntu-T630]
host = ubuntu-T630
mon_addr = 10.xxx.xxx.xxx# MDS 節點
[mds.ubuntu-R730xd-01]
host = ubuntu-R730xd-01[mds.ubuntu-R730-02]
host = ubuntu-R730-02[client.admin]
keyring = /etc/ceph/ceph.client.admin.keyring[osd]
osd journal size = 10240
###################################################cp ~/ceph-cluster/ceph.conf /etc/ceph/scp /etc/ceph/ceph.conf ubuntu@ubuntu02:/tmp/ssh ubuntu@ubuntu02 'sudo mv /tmp/ceph.conf /etc/ceph/ceph.conf && sudo chmod 644 /etc/ceph/ceph.conf'scp /etc/ceph/ceph.conf ubuntu@ubuntu03:/tmp/ssh ubuntu@ubuntu03 'sudo mv /tmp/ceph.conf /etc/ceph/ceph.conf && sudo chmod 644 /etc/ceph/ceph.conf'
四. 安裝 MON、MGR?到所有節點
1.?安裝 Ceph 的相關軟件包并創建所需目錄
ceph-deploy install ubuntu01 ubuntu02 ubuntu03#所有節點創建目錄
sudo mkdir -p /var/lib/ceph
sudo chown ceph:ceph /var/lib/ceph
sudo chmod 755 /var/lib/ceph
如果遇到報錯版本沖突問題,那就清理一下,重新install
vim /etc/apt/sources.list.d/ceph.list
deb https://download.ceph.com/debian-nautilus/ bionic mainsudo apt-get clean
sudo apt-get update
sudo apt-get purge ceph ceph-osd ceph-mds ceph-mon radosgw ceph-common ceph-mgr librgw2
sudo apt-get autoremoveceph-deploy install ubuntu01 ubuntu02
一些報錯
ceph-deploy install?如果遇到[ubuntu01][WARNIN] E: Sub-process /usr/bin/dpkg returned an error code (1)
這個錯誤是 dpkg
安裝包出錯 的通用錯誤碼,說明某個包在安裝過程中出錯了。
先驗證系統狀態,看是否都在 ii
狀態(已安裝)。如果都在,就代表系統層面一切 OK。狀態是 iU
(表示“Unpacked”,但未完全配置),這說明安裝過程未完成或中斷。
dpkg -l | grep ceph
用這個命令它會嘗試完成所有“iU”狀態軟件包的配置,報錯也會更詳細
sudo dpkg --configure -a
我遇到的報錯:Failed to restart lvm2-lvmetad.service: Unit lvm2-lvmetad.socket is masked.lvm2
沒有配置成功,導致 ceph-osd
和 ceph
也配置失敗。
解決方案:解除 mask 并啟用 lvm2 的相關服務。然后再去執行sudo dpkg --configure -a,全部ii
狀態,那就可以放心的去執行ceph-deploy install? ubuntu01 ubuntu02了。
sudo systemctl unmask lvm2-lvmpolld.socket
sudo systemctl unmask lvm2-lvmpolld.service
sudo systemctl enable lvm2-lvmpolld.socket
sudo systemctl start lvm2-lvmpolld.socketsudo dpkg --configure -a
2. 生成key并分發
在使用 ceph-deploy
工具部署 Ceph 集群時,ceph.client.admin.keyring
文件會自動生成。如果是手動部署 Ceph 集群,需要手動生成 ceph.client.admin.keyring
文件。建議手動生成
#生成 ceph.client.admin.keyring,這個密鑰環文件用于管理員用戶,執行各種管理操作。
sudo 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 *'sudo cp /home/ubuntu/ceph-cluster/ceph.client.admin.keyring /etc/ceph/
sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
sudo chown ubuntu:ubuntu /etc/ceph/ceph.client.admin.keyring#生成 ceph.mon.keyring
sudo ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'# 生成 ceph.bootstrap-osd.keyring
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'#生成 ceph.bootstrap-mds.keyring
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-mds/ceph.keyring --gen-key -n client.bootstrap-mds --cap mon 'profile bootstrap-mds'sudo cp /var/lib/ceph/bootstrap-mds/ceph.keyring /etc/ceph/ceph.bootstrap-mds.keyringls /etc/ceph/
#應該看到
ceph.client.admin.keyring
ceph.conf
ceph.mon.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-mds.keyring#分發到所有節點上
sudo scp /etc/ceph/ceph.mon.keyring ubuntu@ubuntu02:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-osd.keyring ubuntu@ubuntu02:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-mds.keyring ubuntu@ubuntu02:/etc/ceph/
sudo scp /etc/ceph/ceph.mon.keyring ubuntu@ubuntu03:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-osd.keyring ubuntu@ubuntu03:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-mds.keyring ubuntu@ubuntu03:/etc/ceph/sudo mkdir -p /var/lib/ceph/mon/ceph-ubuntu01sudo systemctl start ceph-mon@ubuntu01
ceph.client.admin.keyring Ceph 官方建議它只讓 Ceph 用戶或 root 讀,不能所有人都能讀(600 root:root ceph:ceph 或者我們有的用戶免密sudo 也可以用哪個賬戶)一定要保證所有地方的conf和keying全部一致且權限正確,才能執行成功下面的命令
3. 初始化MON、創建MGR
#初始化mon
ceph-deploy mon create-initialceph-deploy --overwrite-conf mgr create ubuntu01 ubuntu02 ubuntu03
ceph-deploy mon create-initial
的主要作用是:
-
創建第一個監控節點:初始化 Ceph 集群的第一個監控節點。
-
生成必要的配置文件:生成
ceph.conf
和ceph.client.admin.keyring
文件。 -
設置監控節點的密鑰:為監控節點生成密鑰,并將其存儲在密鑰環文件中。
-
啟動監控節點服務:啟動監控節點服務,使監控節點開始運行。
五. 配置OSD和緩存池
cache-tier + ceph-deploy 模型:SSD 本身作為 單獨的緩存池
理論內容:在 Ceph 存儲系統中,SSD 可以被用作獨立的緩存池(Cache Pool)或者作為 OSD 的 DB/WA
SSD 作為獨立緩存池
優勢 | 劣勢 |
高性能:獨立緩存池可以顯著提高讀寫性能,特別是對于頻繁訪問的數據。 | 成本較高:需要額外的 SSD 設備來構建緩存池,增加了硬件成本。 |
資源隔離:緩存池與其他存儲池隔離,不會互相影響,確保了性能的穩定性。 | 管理復雜:需要額外的管理開銷來維護緩存池,包括監控緩存命中率和調整緩存策略。 |
靈活性:可以根據需要動態調整緩存池的大小和配置。 | 數據一致性:需要確保緩存數據與后端存儲的一致性,特別是在緩存失效或故障時。 |
SSD 作為 OSD 的 DB/WAL
優勢 | 劣勢 |
性能提升:將 DB/WAL 放在 SSD 上可以顯著提高 OSD 的性能,特別是對于隨機寫入操作。 | 性能上限:雖然性能有所提升,但可能不如獨立緩存池的性能提升明顯。 |
成本效益:不需要額外的 SSD 設備作為緩存池,減少了硬件成本。 | 資源爭搶:如果多個 OSD 共享同一個 SSD 設備作為 DB/WAL,可能會發生資源爭搶。 |
簡化管理:減少了管理復雜性,因為 DB/WAL 是 OSD 的一部分,不需要額外的緩存管理策略。 | 寫入放大:頻繁的寫入操作可能會導致 SSD 的寫入放大問題,影響其壽命。 |
總結
-
如果你的應用場景需要極高的讀寫性能,并且預算允許,使用 SSD 作為獨立緩存池是一個不錯的選擇。
-
如果你希望在成本和性能之間取得平衡,將 SSD 用作 OSD 的 DB/WAL 是一個更經濟的選擇。
理論結束,上實踐命令
在管理節點ubuntu01執行
1. 創建主存儲池(用 HDD 組成)
sudo ceph osd pool create storage 64 64
2. 創建緩存池(用 SSD 組成)
sudo ceph osd pool create cache 64 64
3. 創建 OSD ,分別將設備添加為 OSD
在管理節點執行(會遠程操作指定服務器和設備)
# ubuntu01
ceph-deploy osd create ubuntu01:/dev/sdb
ceph-deploy osd create ubuntu01:/dev/sde# ubuntu02
ceph-deploy osd create ubuntu02:/dev/sde
ceph-deploy osd create ubuntu02:/dev/sdg
報錯問題1:[errno 13] RADOS permission denied (error connecting to the cluster)
說明 Ceph 仍然無法通過 client.bootstrap-osd
keyring 連接到集群
?
# 刪除舊的 bootstrap-osd key
sudo ceph auth del client.bootstrap-osd#重新創建 bootstrap-osd key(帶正確權限)
sudo ceph auth get-or-create client.bootstrap-osd mon 'profile bootstrap-osd' > /var/lib/ceph/bootstrap-osd/ceph.keyring
sudo chown ceph:ceph /var/lib/ceph/bootstrap-osd/ceph.keyring
sudo chmod 600 /var/lib/ceph/bootstrap-osd/ceph.keyring
#注意:這里使用的是 默認路徑 /var/lib/ceph/bootstrap-osd/ceph.keyring,ceph-volume 會自動讀取。# 驗證 key 是否有效
sudo ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -s
#如果能看到集群狀態輸出(即使 OSD 還沒創建),說明 key 有效。
如果仍然報 [errno 13] RADOS permission denied,說明 Mon 沒有正確加載 key,需要重啟 Mon:sudo systemctl restart ceph-mon@ubuntu-R730-02#創建OSD
sudo ceph-volume lvm create --data /dev/sde
#ceph-volume 會自動使用 /var/lib/ceph/bootstrap-osd/ceph.keyring。
創建完成后可以查看 OSD 是否成功:sudo ceph -s
sudo ceph osd tree
報錯問題2:ceph-volume lvm create: error: GPT headers found, they must be removed on: /dev/sdg
意思是 /dev/sdg 上存在 GPT 分區表,Ceph 不允許直接在帶有分區表的磁盤上創建 OSD,需要先清理干凈。
#完全清理磁盤分區表(注意:會刪除磁盤上所有數據):
sudo sgdisk --zap-all /dev/sde
sudo wipefs -a /dev/sde
sudo dd if=/dev/zero of=/dev/sde bs=1M count=100
#sgdisk --zap-all → 刪除 GPT/MBR 分區表
wipefs -a → 清除文件系統簽名
dd → 清零開頭的 100MB,確保無殘留數據#確認磁盤干凈:應該看到 沒有分區。
sudo lsblk /dev/sde
sudo fdisk -l /dev/sde#執行 OSD 創建:
sudo ceph-volume lvm create --data /dev/sde
4. 把緩存池設置為寫回模式
ceph osd tier cache-mode cache writeback
Error EINVAL: pool 'cache' is not a tier如果遇到了這個報錯,那就先執行5掛接,再執行4設置寫回模式
?
5.?把緩存池掛接到主存儲池上(建立Tier關系)
ceph osd tier add storage cache
6. 將客戶端流量指向緩存池(設置Overlay)
ceph osd tier set-overlay storage cache
7. 設置緩存池的緩存命中策略為 Bloom 過濾器
ceph osd pool set cache hit_set_type bloom
8. 設置緩存命中計數和時間周期
ceph osd pool set cache hit_set_count 1
ceph osd pool set cache hit_set_period 3600
9. 設置緩存池最大容量(以字節為單位)
ceph osd pool set cache target_max_bytes 1000000000000
10. 設置緩存池提升對象的讀寫最短時間(秒)
ceph osd pool set cache min_read_recency_for_promote 1
ceph osd pool set cache min_write_recency_for_promote 1
11. 設置緩存池容量閾值,觸發刷寫和驅逐操作
ceph osd pool set cache cache_target_dirty_ratio 0.4
ceph osd pool set cache cache_target_dirty_high_ratio 0.6
ceph osd pool set cache cache_target_full_ratio 0.8
12. 設置緩存池最大容量和最大對象數(可選)
ceph osd pool set cache target_max_bytes 1073741824
ceph osd pool set cache target_max_objects 256
13. 設置緩存池對象最短刷寫周期(秒)
ceph osd pool set cache cache_min_flush_age 600
14. 設置緩存池對象最短驅逐周期(秒)
ceph osd pool set cache cache_min_evict_age 1800
六. 生成元數據池啟動MDS
#創建元數據池
sudo ceph osd pool create cephfs_meta 64 64#創建CephFS文件系統
sudo ceph fs new cephfs cephfs_meta storage#需要給mds服務新建路徑和獲取key
#目錄名稱格式為 ceph-<fs_name>,其中 <fs_name> 是你的 CephFS 文件系統的名稱。
sudo mkdir -p /var/lib/ceph/mds/ceph-cephfs#創建key
sudo ceph auth get-or-create mds.cephfs mon 'allow profile mds' mds 'allow *' osd 'allow *'#把key寫到mds的數據目錄
sudo ceph auth get mds.cephfs -o /var/lib/ceph/mds/ceph-cephfs/keyring
#設置正確的權限
sudo chown -R ceph:ceph /var/lib/ceph/mds/ceph-cephfs
sudo chmod 700 /var/lib/ceph/mds/ceph-cephfs
sudo chmod 600 /var/lib/ceph/mds/ceph-cephfs/keyring#檢查并啟動 MDS 服務
sudo systemctl status ceph-mds@cephfs
sudo systemctl start ceph-mds@cephfs
sudo systemctl status ceph-mds@cephfs
sudo systemctl enable ceph-mds@cephfs#檢查文件系統狀態
sudo ceph fs status
sudo ceph mds stat
拿數據的流程是:客戶端 → MDS(元數據池)獲取文件位置 → 數據池/緩存池讀寫數據
-
元數據池(Metadata Pool)
-
存儲的是 目錄結構、文件名、權限、文件大小、文件塊位置等信息。
-
客戶端通過 MDS 請求元數據,MDS 會從元數據池讀取這些信息。
-
-
數據池(Data Pool)
-
存儲 實際的文件內容塊。
-
文件數據先寫入數據池,也可以經過緩存層加速。
-
-
緩存池(Cache Pool)
-
掛在數據池
storage
前端,作為 高速緩存。 -
讀操作:先到緩存池,如果命中就直接返回,未命中則去數據池取,再更新緩存池。
-
寫操作(寫回模式):
-
數據先寫到緩存池(高速寫入)。
-
緩存池在觸發刷寫條件后,把修改的數據異步寫回數據池。
-
-
七.?緩存池卸載流程(以后有需要再用)
寫回模式,要確保緩存池數據刷寫到底層池后才移除緩存。可以用下面命令查看緩存池內對象:
rados ls -p cache
手動觸發刷寫和驅逐:
rados -p cache cache-flush-evict-all
1. 禁用緩存池(將緩存模式改為 none)
ceph osd tier cache-mode cache none
2. 移除流量指向緩存池(取消 Overlay)
ceph osd tier remove-overlay storage
3.?從主存儲池中移除緩存池
ceph osd tier remove storage cache
八.?徹底從集群移除 OSD(以后有需要再用)
1. 查看id號并停止寫入數據
sudo ceph osd tree## 先把 OSD 從 CRUSH map 中移除(停止寫入數據)假設要刪除的是4
sudo ceph osd out 4
2.在 MON 中刪除 OSD 注冊信息
sudo ceph osd crush remove osd.4
sudo ceph auth del osd.4
sudo ceph osd rm 4
#執行完之后再查看一下
sudo ceph osd tree
sudo ceph -s
總結
部署中遇到了很多問題,不只文章中寫的這幾個,初次接觸,難免思緒不夠清晰。ubuntu03的機器也是我做OSD發現,MON必須三臺否則無法創建成功,才又加到集群中的,可能某些地方寫的不正確,望及時指出,我進行更改。