系統的開始使用壹個 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 規則。
具體屬性解釋參考:
/docs/mimic/rados/operations/crush-map-edits/#crush-map-rules
如上圖劃線處,當前規則只會使用 default 根的 osd。
前面創建高性能設備時,將其設置根為 cache。我們現在就可以創建壹個只使用 cache 根中的 osd 的規則,從而實現緩存池和存儲池使用不同的設備。
創建緩存池使用的規則:
其中:
replicated_cache 指該規則的名字。
cache 指該規則使用的根。
host 指故障域級別。
再次查看所有規則:
現在我們有了壹個只使用高性能存儲設備的規則了。接下來就可以開始創建使用不同規則的池了。
創建存儲池:
查看池:
查看該池的規則:
存儲池至此已經好了。
緩存池在 ceph 中常以 hot 標識。
普通存儲池在 ceph 中常以 cold 標識。
緩存有多種形式(官方文檔列出以下幾種,實際更多):
緩存參考:
/docs/master/rados/operations/cache-tiering/
創建緩存池
緩存池創建好以後,要將這個緩存池與對應存儲池聯系起來。這個聯系的概念叫做 cache tiering,可以稱之為緩存層,緩存代理。
參考:
/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 規則參考:
/docs/master/rados/operations/crush-map/