① CentOS 7部署 Ceph分布式存儲架構
隨著OpenStack日漸成為開源雲計算的標准軟體棧,Ceph也已經成為OpenStack的首選後端存儲。Ceph是一種為優秀的性能、可靠性和可擴展性而設計的統一的、分布式文件系統。
Ceph是一個開源的分布式文件系統。因為它還支持塊存儲、對象存儲,所以很自然的被用做雲計算框架openstack或cloudstack整個存儲後端。當然也可以單獨作為存儲,例如部署一套集群作為對象存儲、SAN存儲、NAS存儲等。
前三台伺服器增加一塊硬碟/dev/sdb實驗, 創建目錄並掛載到/var/local/osd{1,2,3};
規范系統主機名添加hosts文件實現集群主機名與主機名之間相互能夠解析(host 文件添加主機名不要使用fqdn方式)可用 hostnamectl set-hostname [name] 設置分別打開各節點的 /etc/hosts 文件,加入這四個節點ip與名稱的對應關系:
在管理節點使用ssh-keygen 生成ssh keys 發布到各節點
第一步:增加 yum配置文件(各個節點都需要增加yum源) vim /etc/yum.repos.d/ceph.repo
或阿里的ceph源
復制配置文件到其它節點和客戶端
在ceph1更新軟體源並安裝ceph-deploy 管理工具
配置文件的默認副本數從3改成2,這樣只有兩個osd也能達到 active+clean 狀態,添加行 osd_pool_default_size = 2
(如果網路源安裝失敗,手工安裝epel-release 然後安裝yum –yinstall cep-release再yum –y install ceph ceph-radosgw)
錯誤參考: https://blog.csdn.net/yenai2008/article/details/72457463
添加osd節點 (所有osd節點執行)
我們實驗准備時已經創建目錄/var/local/osd{id}
(用ceph-deploy把配置文件和admin密鑰拷貝到所有節點,這樣每次執行Ceph命令行時就無需指定monitor地址和ceph.client.admin.keyring了)
以上基本上完成了ceph存儲集群的搭建。
其中: <pg_num> = 128 ,
關於創建存儲池
確定 pg_num 取值是強制性的,因為不能自動計算。下面是幾個常用的值:
隨著 OSD 數量的增加,正確的 pg_num 取值變得更加重要,因為它顯著地影響著集群的行為、以及出錯時的數據持久性(即災難性事件導致數據丟失的概率)。
創建好存儲池後,你就可以用 fs new 命令創建文件系統了
ceph fs new <fs_name> cephfs_metadata cephfs_data
其中: <fs_name> = cephfs 可自定義
在這里想起沒在/etc/fstab配置ceph1、ceph2、ceph3的sdb自動掛載。
ceph在開源社區還是比較熱門的,但是更多的是應用於雲計算的後端存儲。所以大多數在生產環境中使用ceph的公司都會有專門的團隊對ceph進行二次開發,ceph的運維難度也比較大。但是經過合理的優化之後,ceph的性能和穩定性都是值得期待的。
清理機器上的ceph相關配置
可以參考內容: http://blog.51cto.com/12270625/1887648
② ceph(第三步) 基本使用
系統的開始使用一個 ceph 集群。
本文將系統的介紹如何使用一個 ceph 集群。
涉及: crush、osd、pool、cache
ceph 版本:nautilus
ceph-deploy 版本:2.0.1
在基本使用需求下,一般需要存儲集群提供高性能存儲(SSD)和普通存儲(hdd)。
在 ceph 中,具體表現為某些池使用高性能存儲,某些池使用普通存儲。而這種需求在 ceph 中由 crush 規則實現。
ceph 提供了緩存的概念。在普通的存儲池之上架設一層高性能的緩存池,外部訪問首先到達緩存池,如果發生未命中等情況再去訪問存儲池。這里需要提一點,並不是任何情況都需要緩存。
針對不同的場景,ceph 的使用方式多種多樣,這里的介紹只能一切從簡,但是會盡量全面。
一個標準的場景:一個存儲池加一個緩存池,存儲池使用普通設備,緩存池使用高性能設備。
首先添加一塊高性能硬碟(我這里是虛擬環境,只能用普通硬碟充數)
然後需要利用 crush 讓不同池使用不同的存儲設備
這里只能拿普通的虛擬硬碟來做測試。
在 ceph02 虛擬機上增加一塊 30G 的虛擬硬碟弊罩。
在 ceph03 虛擬機上增加一塊 30G 的虛擬硬碟。
現在到部署節點進行操作:
如圖 ceph02 出現了 osd.6,ceph03 出現了 osd.7。
這里涉及到 root (根)的概念,在文章末尾【擴展】中會介紹。這里可以直接先使用。
將 osd.6 osd.7 加入名稱為 cache 的根中(根名稱會自動創建,注意,由於默認情況下 osd 在啟動時讀取的是 hostname,因此該方法只是臨時生效,在文章末尾【擴展】中會介紹永久生效辦法)
「高性能」存儲盤現在已經有了,並且將其置於 cache 根下,這么做的意義在下一步中有體現。
現在可以進行下一步了。
當前環境下已經有一個默認的 crush 規則。
具體屬性解釋參考:
https://docs.ceph.com/docs/mimic/rados/operations/crush-map-edits/#crush-map-rules
如上圖劃線處,當前規則只會使用 default 根的 osd。
前面創建高性能設備時,將其設帆卜稿置根為 cache。我們現在就可以創建一個只使用 cache 根中的 osd 的規則,從而實現緩存池和存儲池使用不同的設備。
創建緩存池使用的規則:
其中:
replicated_cache 指該規則的名字。
cache 指該規則使用的根。
host 指故障域級別。
再次查看所有規則:
現在我們有了一個只使用高性能存儲設備的規則了。接下來就可以開始創建使用不同規則的池了。
創建存儲池:
查看池:
查看該池的規則:
存儲池至此已經好了。
緩存池在 ceph 中常以 hot 標識。
普通存儲池在 ceph 中常以 cold 標識。
緩存有多種形式(官方文檔列出以下幾種,實際更多):
緩存參考:
https://docs.ceph.com/docs/master/rados/operations/cache-tiering/
創建緩存池
緩存池創建好以後,要將這個緩存池與對應存儲池聯系起來。這個聯系的概念叫做 cache tiering,可以稱之為緩存態孝層,緩存代理。
參考:
https://docs.ceph.com/docs/master/rados/operations/cache-tiering/
對於 test_storage 池,我們有一個只讀的緩存池了。只要我們讀取 test_storage 中的某個對象,這個對象就應該自動的置於緩存池中一段時間。
可以發現,將對象上傳回寫模式的緩存池,存儲池中也出現了對應的數據。
osd 的大小可能不相同,因此其上的數據量也不應該相同,因此引入權重來影響數據分布。
比如100G的 osd 權重為1,則200G的 osd 權重就應設置為2。
ceph osd tree 命令可以看到存儲結構。可以結合自己機器執行的結果往下閱讀。
一張官方圖:
這是描述 ceph 存儲結構的一張圖。
首先這是一個樹形結構。
其中最上層的 root default :root 是根的意思,default 就是這個根的名字。
中間 host foo :host 是主機的意思,foo 就是這個主機的名字。這里的主機名僅僅是個別稱,不代表實際的主機,可以隨意更改。
最下面的就是葉子節點了,具體指向 osd。
劃分這三層結構的意義(不完全):
本文使用 ceph-deploy 添加 osd 時,並沒有直接將其設置到最終根下,後續還需要手動配置。這么操作是不合理的,暫時未找到 ceph-deploy 指定根的參數。
當前文章配置的緩存池是2副本的。
某些時候,緩存數據是允許丟失的,比如只讀的緩存。這種緩存池單副本即可,但是經測試,單副本池在 ceph 中似乎困難重重。
可以通過修改該機器的 hostname ,一勞永逸
這個時候,當機器重啟後,該機器的所有 osd 的 host 名稱都一樣了,導致 osd tree 混亂。這個時候可以在 ceph.conf 中具體配置某塊盤的信息。
當前環境配置參考:
增加如下內容:
重啟後,一切正常。
在 osd 的啟動上做文章。
比如,配置 osd 的啟動方式,容器化 osd,容器會記住某些信息,因此可以實現永久生效 hostname。
osd 上的 pg 數量會對整體集群性能造成影響,並不是越多越好,也不是越少越好。
由於池有副本的概念,因此產生了如下的計算方式:
官方建議每個 osd 上的 pg 數為 100。實際測試每個 osd 上的 pg 數到達 250 時開始告警,因此該集群的總 pg 數不應超過:
因此出現此問題的原因:
所有池的 pg 數加起來超過了設定的 總 pg 數 。但集群依然可正常使用,因此只是一個警告。
解決該問題的手段:
目前個人經驗來說,不要使用單副本。
crush 規則參考:
https://docs.ceph.com/docs/master/rados/operations/crush-map/
③ ceph相關命令
Ceph 存儲集群包含兩種類型的守護進程: Ceph 監視器 Ceph OSD 守護進程
RBD是Ceph對外提供的基於塊的存儲介面
ceph常用命令
集群狀態監控
ceph -s #顯示ceph集群狀態
ceph osd tree #顯示當前osd樹結構
ceph osd pool ls 顯示所有資源池
ceph -w #動態顯示ceph當前動態,主要可以觀察讀寫流量
ceph df #集群的數據用量及其在存儲池內的分布情況
ceph osd df # 查看所有osd使用情況
ceph osd perf #顯示各個osd響應時間,個別響應慢的osd可以考慮踢出集群(慎用)
設置pool副本數
ceph osd pool get <pool-name> size #查看pool副本數
ceph osd pool set <pool-name> size *** #設襲明置pool副本數
設置pg和pgp數(一磨培般pg=pgp)
ceph osd pool get <pool-name> pg_num #查看pool pg_num
ceph osd pool set <pool-name> pg_num *** #設置pool pg_num
ceph osd pool get <pool-name> pgp_num #查看pool pgp_num
ceph osd pool set <pool-name> pgp_num *** #設置pool pgp_num
查看當前ceph配置 ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show
rbd常用命令
rbd –p <pool-name> create <rbd-name> --size 1G #創建
rbd –p <pool-name> list #查看pool下所有塊
rbd –p <pool-name> info <rbd-name> #查看塊詳情
rbd –p <pool-name> resize --size *G <rbd-name> #擴拍游告容大小至*G
rbd –p <pool-name> resize –size *G <rbd-name> --allow-shrink #縮容至*G
rbd –p <pool-name> rm <rbd-name> #刪除
快照操作
rbd –p <pool-name> snap create <rbd-name> --snap <snap-name> #創建快照
rbd –p <pool-name> snap ls <rbd-name> #列出卷的所有快照
rbd –p <pool-name> snap rollback <rbd-name> --snap <snap-name> #回滾快照
rbd –p <pool-name> snap rm <rbd-name> --snap <snap-name> #刪除快照
rbd –p <pool-name> snap protect <rbd-name> --snap <snap-name> #保護快照,此時無法刪除
rbd –p <pool-name> snap unprotect <rbd-name> --snap <snap-name> #解除保護
rbd –p <pool-name> import <file-name> #導入文件
krbd使用
rbd –p <pool-name> create <rbd-name> --size *G –image-feature layering #創建krbd塊
rbd map <pool-name>/<rbd-name> #映射到本地
rbd –p <pool-name> showmapped #查看映射關系
rbd unmap <pool-name>/<rbd-name> #解除本地映射