Ⅰ 思科交換機3560如何清空DHCP地址池緩存
clear ip dhcp binding *
Ⅱ ceph:rados淺析
在傳統分布式存儲架構中,存儲節點往往僅作為被動查詢對象來使用,隨著存儲規模的增加,數據一致性的管理會出現很多問題。
而新型的存儲架構傾向於將基本的塊分配決策和安全保證等操作交給存儲節點來做,然後通過提倡客戶端和存儲節點直接交互來簡化數據布局並減小io瓶頸。
RADOS就是這樣一個可用於PB級規模數據存儲集群的可伸縮的、可靠的對象存儲服務。它包含兩類節點:存儲節點、管理節點。它通過利用存儲設備的智能性,將諸如一致性數據訪問、冗餘存儲、錯誤檢測、錯誤恢復分布到包含了上千存儲節點的集群中,而不是僅僅依靠少數管理節點來處理。
RADOS中的存儲節點被稱為OSD(object storage device),它可以僅由很普通的組件來構成,只需要包含CPU、網卡、本地緩存和一個磁碟或者RAID,並將傳統的塊存儲方式替換成面向對象的存儲。
在PB級的存儲規模下,存儲系統一定是動態的:系統會隨著新設備的部署和舊設備的淘汰而增長或收縮,系統內的設備會持續地崩潰和恢復,大量的數據被創建或者刪除。RADOS通過 cluster map來實現這些,cluster map會被復制到集群中的所有部分(存儲節點、控制節點,甚至是客戶端),並且通過怠惰地傳播小增量更新而更新。cluster map中存儲了整個集群的數據的分布以及成員。
通過在每個存儲節點存儲完整的cluster map,存儲設備可以表現的半自動化,通過peer-to-peer的方式(比如定義協議)來進行數據備份、更新,錯誤檢測、數據遷移等等操作。這無疑減輕了佔少數的monitor cluster(管理節點組成的集群)的負擔。
一個RADOS系統包含大量的OSDs 和 很少的用於管理OSD集群成員的monitors。OSD的組成如簡介所說。而monitor是一些獨立的進程,以及少量的本地存儲,monitor之間通過一致性演算法保證數據的一致性。
存儲節點集群通過monitor集群操作cluster map來實現成員的管理。cluster map 描述了哪些OSD被包含進存儲集群以及所有數據在存儲集群中的分布。
cluster map不僅存儲在monitor節點,它被復制到集群中的每一個存儲節點,以及和集群交互的client。
當因為一些原因,比如設備崩潰、數據遷移等,cluster map的內容需要改變時,cluster map的版本號被增加,map的版本號可以使通信的雙方確認自己的map是否是最新的,版本舊的一方會先將map更新成對方的map,然後才會進行後續操作。
首先,如下圖,總體說下RADOS的存儲層次,RADOS中基本的存儲單位是對象,一般為2MB或4MB,當一個文件要存入RADOS時,首先會被切分成大小固定的對象(最後一個對象大小可能不同),然後將對象分配到一個PG(Placement Group)中,然後PG會復制幾份,偽隨機地派給不同的存儲節點。當新的存儲節點被加入集群,會在已有數據中隨機抽取一部分數據遷移到新節點。這種概率平衡的分布方式可以保證設備在潛在的高負載下正常工作。更重要的是,數據的分布過程僅需要做幾次隨機映射,不需要大型的集中式分配表。
對於每個層次的詳細說明:
2.Object—— RADOS的基本存儲單元。Object與上面提到的file的區別是,object的最大size由RADOS限定(通常為2MB或4MB),以便實現底層存儲的組織管理。因此,當上層應用向RADOS存入size很大的file時,需要將file切分成統一大小的一系列object(最後一個的大小可以不同)進行存儲。
各層次之間的映射關系:
前面的介紹中已經提到,由若干個monitor共同負責整個RADOS集群中所有OSD狀態的發現與記錄,並且共同形成cluster map的master版本,然後擴散至全體OSD以及client。OSD使用cluster map進行數據的維護,而client使用cluster map進行數據的定址。
monitor並不主動輪詢各個OSD的當前狀態。相反,OSD需要向monitor上報狀態信息。常見的上報有兩種情況:一是新的OSD被加入集群,二是某個OSD發現自身或者其他OSD發生異常。在收到這些上報信息後,monitor將更新cluster map信息並加以擴散。其細節將在下文中加以介紹。
Cluster map的實際內容包括:
(1) Epoch,即版本號。cluster map的epoch是一個單調遞增序列。epoch越大,則cluster map版本越新。因此,持有不同版本cluster map的OSD或client可以簡單地通過比較epoch決定應該遵從誰手中的版本。而monitor手中必定有epoch最大、版本最新的cluster map。當任意兩方在通信時發現彼此epoch值不同時,將默認先將cluster map同步至高版本一方的狀態,再進行後續操作。
(2)各個OSD的網路地址。
(3)各個OSD的狀態。OSD狀態的描述分為兩個維度:up或者down(表明OSD是否正常工作),in或者out(表明OSD是否在至少一個PG中)。因此,對於任意一個OSD,共有四種可能的狀態:
(4)CRUSH演算法配置參數。表明了Ceph集群的物理層級關系(cluster hierarchy),位置映射規則(placement rules)。
根據cluster map的定義可以看出,其版本變化通常只會由(3)和(4)兩項信息的變化觸發。而這兩者相比,(3)發生變化的概率更高一些。這可以通過下面對OSD工作狀態變化過程的介紹加以反映。
一個新的OSD上線後,首先根據配置信息與monitor通信。Monitor將其加入cluster map,並設置為up且out狀態,再將最新版本的cluster map發給這個新OSD。
收到monitor發來的cluster map之後,這個新OSD計算出自己所承載的PG(為簡化討論,此處我們假定這個新的OSD開始只承載一個PG),以及和自己承載同一個PG的其他OSD。然後,新OSD將與這些OSD取得聯系。如果這個PG目前處於降級狀態(即承載該PG的OSD個數少於正常值,如正常應該是3個,此時只有2個或1個。這種情況通常是OSD故障所致),則其他OSD將把這個PG內的所有對象和元數據復制給新OSD。數據復制完成後,新OSD被置為up且in狀態。而cluster map內容也將據此更新。這事實上是一個自動化的failure recovery過程。當然,即便沒有新的OSD加入,降級的PG也將計算出其他OSD實現failure recovery。
如果該PG目前一切正常,則這個新OSD將替換掉現有OSD中的一個(PG內將重新選出Primary OSD),並承擔其數據。在數據復制完成後,新OSD被置為up且in狀態,而被替換的OSD將退出該PG(但狀態通常仍然為up且in,因為還要承載其他PG)。而cluster map內容也將據此更新。這事實上是一個自動化的數據re-balancing過程。
如果一個OSD發現和自己共同承載一個PG的另一個OSD無法聯通,則會將這一情況上報monitor。此外,如果一個OSD deamon發現自身工作狀態異常,也將把異常情況主動上報給monitor。在上述情況下,monitor將把出現問題的OSD的狀態設為down且in。如果超過某一預訂時間期限,該OSD仍然無法恢復正常,則其狀態將被設置為down且out。反之,如果該OSD能夠恢復正常,則其狀態會恢復為up且in。在上述這些狀態變化發生之後,monitor都將更新cluster map並進行擴散。這事實上是自動化的failure detection過程。
對於一個RADOS集群而言,即便由數千個甚至更多OSD組成,cluster map的數據結構大小也並不驚人。同時,cluster map的狀態更新並不會頻繁發生。即便如此,Ceph依然對cluster map信息的擴散機制進行了優化,以便減輕相關計算和通信壓力:
基於上述機制,Ceph避免了由於cluster map版本更新而引起的廣播風暴。這雖然是一種非同步且lazy的機制,但根據論文中的結論,對於一個由n個OSD組成的Ceph集群,任何一次版本更新能夠在O(log(n))時間復雜度內擴散到集群中的任何一個OSD上。
一個可能被問到的問題是:既然這是一種非同步和lazy的擴散機制,則在版本擴散過程中,系統必定出現各個OSD看到的cluster map不一致的情況,這是否會導致問題?答案是:不會。事實上,如果一個client和它要訪問的PG內部的各個OSD看到的cluster map狀態一致,則訪問操作就可以正確進行。而如果這個client或者PG中的某個OSD和其他幾方的cluster map不一致,則根據Ceph的機制設計,這幾方將首先同步cluster map至最新狀態,並進行必要的數據re-balancing操作,然後即可繼續正常訪問。
Ⅲ 如何獲取ceph的緩存池中對象的大小和偏移
連續容器如:Vector,內部是預先分配一段連續緩存來保存對象,所分配內存可以保存對象的個數為容量,而已保存的對象個數為長度。
當程序調用push時候,如果容量不夠了,Vector自動重新分配一段緩存,大小是原來的2倍,然後把原來的內容拷貝到新緩存中,最後釋放原來的緩存。出現這種情況是很費時間的!所以Vector內部的指針的地址是可能變得的!
list 是每次添加對象的時候動態分配內存,所以沒有容量的概念!
Ⅳ 星際爭霸2老是提示我緩存池不足啊!!!求解決方法!!
聽我的4G內存就弄512緩存優化一下系統就用你的魯大師還有垃圾病毒這些都是基本的就算不玩游戲也得經常弄我就不多說了
不要把緩存弄得過多普通的民用硬碟的速度怎麼可能比得上內存條?這絕對是在開國際玩笑,天方夜談
之後一定要重啟絕對
保證你的每個盤符下至少有15%的剩餘空間實在不行就保證C盤和游戲盤也行C盤東西不能多多了你再好電腦也得卡
我的渣配置玩都不卡
Ⅳ ceph分布式存儲-常見 PG 故障處理
創建一個新集群後,PG 的狀態一直處於 active , active + remapped 或 active + degraded 狀態, 而無法達到 active + clean 狀態 ,那很可能是你的配置有問題。
你可能需要檢查下集群中有關 Pool 、 PG 和 CRUSH 的配置項,做以適當的調整。
一般來說,你的集群中需要多於 1 個 OSD,並且存儲池的 size 要大於 1 副本。
有時候,我們需要搭建一個單節點的 Ceph 實驗環境。此時,在開始創建 monitor 和 OSD 之前,你需要把 Ceph 配置文件中的 osd crush chooseleaf type 選項從默認值 1 (表示 host 或 node )修改為 0 (表示 osd )。這樣做是告訴 Ceph 允許把數據的不同副本分布到同一 host 的 OSDs 上。
如果你已經啟動了 2 個 OSD,它們都處於 up 和 in 的狀態,但 PG 仍未達到 active + clean 狀態,那可能是給 osd pool default size 設置了一個大於 2 的值。
如果你想要在 active + degraded 狀態( 2 副本)操作你的集群,可以設置 osd pool default min size 為 2 ,這樣你就可以對處於 active + degraded 的對象寫入數據。然後你還可以把 osd pool default size 的值改為 2 ,這樣集群就可以達到 active + clean 狀態了。
另外,修改參數 osd pool default size/min_size 後,只會對後面新建的 pool 起作用。如果想修改已存在的 pool 的 size/min_size ,可用下面的命令:
注意: 你可以在運行時修改參數值。如果是在 Ceph 配置文件中進行的修改,你可能需要重啟集群。
如果你設置了 osd pool default size 的值為 1 ,那你就僅有對象的單份拷貝。OSD 依賴於其他 OSD 告訴自己應該保存哪些對象。如果第一個 OSD 持有對象的拷貝,並且沒有第二份拷貝,那麼也就沒有第二個 OSD 去告訴第一個 OSD 它應該保管那份拷貝。對於每一個映射到第一個 OSD 上的 PG (參考 ceph pg mp 的輸出),你可以強制第一個 OSD 關注它應該保存的 PGs :
PG 達不到 clean 狀態的另一個可能的原因就是集群的 CRUSH Map 有錯誤,導致 PG 不能映射到正確的地方。
有失敗發生後,PG 會進入「degraded」(降級)或「peering」(連接建立中)狀態,這種情況時有發生。通常這些狀態意味著正常的失敗恢復正在進行。然而,如果一個 PG 長時間處於這些狀態中的某個,就意味著有更大的問題。因此 monitor 在 PG 卡 ( stuck ) 在非最優狀態時會告警。我們具體檢查:
你可以用下列命令顯式地列出卡住的 PGs:
卡在 stale 狀態的 PG 通過重啟 ceph-osd 進程通常可以修復;卡在 inactive 狀態的 PG 通常是互聯問題(參見 PG 掛了 —— 互聯失敗 );卡在 unclean 狀態的 PG 通常是由於某些原因阻止了恢復的完成,像未找到的對象(參見 未找到的對象 )。
在某些情況下, ceph-osd 互聯 進程會遇到問題,阻值 PG 達到活躍、可用的狀態。例如, ceph health 也許顯示:
可以查詢到 PG 為何被標記為 down :
recovery_state 段告訴我們互聯過程因 ceph-osd 進程掛了而被阻塞,本例是 osd.1 掛了,啟動這個進程應該就可以恢復。
或者,如果 osd.1 發生了災難性的失敗(如硬碟損壞),我們可以告訴集群它丟失( lost )了,讓集群盡力完成副本拷貝。
重要: 集群不能保證其它數據副本是一致且最新的,就會很危險!
讓 Ceph 無論如何都繼續:
恢復將繼續進行。
某幾種失敗相組合,可能導致 Ceph 抱怨有找不到( unfound )的對象:
這意味著存儲集群知道一些對象(或者存在對象的較新副本)存在,卻沒有找到它們的副本。下例展示了這種情況是如何發生的,一個 PG 的數據存儲在 ceph-osd 1 和 2 上:
這時, 1 知道這些對象存在,但是活著的 ceph-osd 都沒有這些副本。這種情況下,讀寫這些對象的 IO 就會被阻塞,集群只能指望 down 掉的節點盡早恢復。這樣處理是假設比直接給用戶返回一個 IO 錯誤要好一些。
首先,你應該確認哪些對象找不到了:
如果在一次查詢里列出的對象太多, more 這個欄位將為 true ,你就可以查詢更多。
其次,你可以找出哪些 OSD 上探測到、或可能包含數據:
本例中,集群知道 osd.1 可能有數據,但它掛了( down )。所有可能的狀態有:
有時候集群要花一些時間來查詢可能的位置。
還有一種可能性,對象存在於其它位置卻未被列出。例如,集群里的一個 ceph-osd 停止且被剔出集群,然後集群完全恢復了;後來一系列的失敗導致了未找到的對象,它也不會覺得早已死亡的 ceph-osd 上仍可能包含這些對象。(這種情況幾乎不太可能發生)。
如果所有可能的位置都查詢過了但仍有對象丟失,那就得放棄丟失的對象了。這仍可能是罕見的失敗組合導致的,集群在寫操作恢復後,未能得知寫入是否已執行。以下命令把未找到的( unfound )對象標記為丟失( lost )。
上述最後一個參數告訴集群應如何處理丟失的對象。
擁有 PG 拷貝的 OSD 可能會全部失敗,這種情況下,那一部分的對象存儲不可用, monitor 也就不會收到那些 PG 的狀態更新了。為檢測這種情況,monitor 會把任何主 OSD 失敗的 PG 標記為 stale (不新鮮),例如:
可以找出哪些 PG 是 stale 狀態,和存儲這些歸置組的最新 OSD ,命令如下:
如果想使 PG 2.5 重新上線,例如,上面的輸出告訴我們它最後由 osd.0 和 osd.2 管理,重啟這些 ceph-osd 將恢復之(可以假定還有其它的很多 PG 也會進行恢復 )。
如果你的集群有很多節點,但只有其中幾個接收數據, 檢查 下存儲池裡的 PG 數量。因為 PG 是映射到多個 OSD 的,較少的 PG 將不能均衡地分布於整個集群。試著創建個新存儲池,設置 PG 數量是 OSD 數量的若干倍。更詳細的信息可以參考 Ceph 官方文檔 —— Placement Groups 。
如果你的集群已啟動,但一些 OSD 沒起來,導致不能寫入數據,確認下運行的 OSD 數量滿足 PG 要求的最低 OSD 數。如果不能滿足, Ceph 就不會允許你寫入數據,因為 Ceph 不能保證復制能如願進行。這個最低 OSD 個數是由參數 osd pool default min size 限定的。
如果收到 active + clean + inconsistent 這樣的狀態,很可能是由於在對 PG 做擦洗( scrubbing )時發生了錯誤。如果是由於磁碟錯誤導致的不一致,請檢查磁碟,如果磁碟有損壞,可能需要將這個磁碟對應的 OSD 踢出集群,然後進行更換。生產環境中遇到過不一致的問題,就是由於磁碟壞道導致的。
當集群中出現 PG 不一致的問題時,執行 ceph -s 命令會出現下面的信息:
1、查找處於 inconsistent 狀態的問題 PG :
這個有問題的 PG 分布在 osd.1 、 osd.2 和 osd.0 上,其中 osd.1 是主 OSD。
2、去主 OSD( osd.1 )的日誌中查找不一致的具體對象 。
從日誌中可以知道,是 rbd_data.1349f035c101d9.0000000000000001 這個對象的屬性 _ 丟失了,所以在 scrub 的過程中產生了 error 。
3、執行 ceph pg repair 命令修復問題 PG 。
4、檢查 Ceph 集群是否恢復到 HEALTH_OK 狀態。
osd.1 的日誌里也提示修復成功:
如果經過前面的步驟,Ceph 仍沒有達到 HEALTH_OK 狀態,可以嘗試用下面這種方式進行修復。
1、停掉不一致的 object 所屬的 osd 。
2、刷新該 osd 的日誌。
3、將不一致的 object 移除。
4、重新啟動該 osd 。
5、重新執行修復命令。
6、檢查 Ceph 集群是否恢復到 HEALTH_OK 狀態。
有時候,我們在 ceph -s 的輸出中可以看到如下的告警信息:
這是因為集群 OSD 數量較少,測試過程中建立了多個存儲池,每個存儲池都要建立一些 PGs 。而目前 Ceph 配置的默認值是每 OSD 上最多有 300 個 PGs 。在測試環境中,為了快速解決這個問題,可以調大集群的關於此選項的告警閥值。方法如下:
在 monitor 節點的 ceph.conf 配置文件中添加:
然後重啟 monitor 進程。
或者直接用 tell 命令在運行時更改參數的值而不用重啟服務:
而另一種情況, too few PGs per OSD (16 < min 20) 這樣的告警信息則往往出現在集群剛剛建立起來,除了默認的 rbd 存儲池,還沒建立自己的存儲池,再加上 OSD 個數較多,就會出現這個提示信息。這通常不是什麼問題,也無需修改配置項,在建立了自己的存儲池後,這個告警信息就會消失。
Ⅵ ceph(第一步) 基礎架構
ceph 是什麼?
ceph 是一種開源存儲軟體。底層實現了對象存儲,並以此為基礎對外提供對象存儲介面、塊存儲介面、文渣跡穗件級存儲介面。
ceph 結構包含兩個部分:
ceph 版本:Nautilus
官網的一張架構圖:
對於這張圖,一開始沒有看懂它想表達什麼,後來明白了。如下圖:
相關名詞解釋:
ceph 組件分為兩部分:
此部分介紹構成 ceph 集群的基礎組件。
其中包含 OSD、Manager、MDS、Monitor。
此部分介紹 ceph 對外提供各種功能的組件。
其中包含:Block Device、Object Storage、Filesystem。
前面兩個部分主要介紹了 ceph 的一些組件及對外提供的功能。
這部分主要介紹 ceph 的存儲邏輯。
首先,在對象存儲中,一切都是扁平化的,並且存儲的最小單元為對象(obj)。存儲 obj 如下圖:
ceph 在對象存儲的基礎上提供了更加高級的思想。
當對象數量達到了百萬級以上,原生的對象存儲在索引對象時消耗的性能非常大。ceph 因此引入了 placement group (pg)的概念。一個 pg 就是一組對象的集合。如下圖:
obj 和 pg 之間的映射由 ceph client 計算得出。
討論 pg 時,不得不提的另外一個名詞:pgp。
pgp 決定了 pg 和 osd 之間的映射關系。一般將 pgp_num 設置成和 pg_num 一樣大小。
這里還有一個名詞需要提一下,在 ceph 中會經常見到 crush 演算法。簡單來說,crush 演算法就是指 ceph 中數據如何存儲、讀取的過程。如卜
由於 ceph 集群面對許多的獨立項目,因此 ceph 還引入了 ceph pool 的概念用於劃分不同的項目。
ceph pool 是對 ceph 對象的邏輯劃分,並不是物理劃分。
pg 和 ceph pool 的區別:
像大多數集群軟體一樣,ceph 也提供了緩存的概念。稱之為 Cache Tier(緩存層,在具體使用時有時會稱之為緩存池)。
緩存池對用戶來說是透明的,因此不會改變用戶的原有使用邏輯。以下緩存池的介紹,均為底層邏輯。
在沒有緩存池時,ceph client 直接指向存儲池。
在添加緩存池後,ceph client 指向緩存池,緩存池再指向存儲池。
官方原話:
When pg_num is increased for any pool, every PG of this pool splits into half, but they all remain mapped to their parent OSD.
Until this time, Ceph does not start rebalancing. Now, when you increase the pgp_num value for the same pool, PGs start to migrate from the parent to some other OSD, and cluster rebalancing starts. This is how PGP plays an important role.
By Karan Singh
個人翻譯:
當州旦一個池增加 pg 數量時,這個池中的所有 pg 都會變化。但是原 pg 的實際物理存儲位置不會改變。
當一個池增加 pgp 的數量時,pg 的實際物理存儲位置會發生改變。
首先,截至目前,沒有具體查到資料證明以下觀點。(基於一致性hash的猜想)
圖中出現了一個新詞: vosd ,這個是指虛擬 osd。它的數量等於 pgp 的數量,而 pgp 一般又等於 pg。
pgp 的數量就是 vosd 的數量。
引入 pg 可以實現 pool 概念,以及優化碎片管理(這一點十分不確定)。
引入 pgp(vosd),是為了在增加 osd 時可以讓數據更加均衡的分布。
如猜想圖:
當我們增加池的 pg 數量時,不會改變 vosd,因此原 pg 與 vosd 之間的映射未變,原 pg 的實際物理位置也不會發生變化。只是會影響同一個池中 obj 的分布。
當我們增加池的 pgp 數量時,相當於改變了 vosd,通過 hash 計算出的部分 pg 與 vosd 之間的映射就要發生改變,從而導致 pg 的實際物理位置發生改變。
與一致性hash不同的地方:
一般情況下,一致性hash只有一層虛擬化層,並且虛擬化層是根據物理硬體而變化的。但是ceph卻是一種反著來的意思。
當 ceph 增加一個 osd 時,pg 的物理位置也會發生改變。
在該猜想下:
當增加 osd 時,並不會增加 vosd 的數量,原部分 vosd 會映射到新的 osd 上,因此產生一種部分 pg 的實際物理位置發生變化的情況。
創建池時,會分配固定的 pg,以及設置與 pg 一樣大小的 pgp。
注意,一般 pg 數量都設置為 2 的次方。
嚴格意義上,我們無論為池分配多少個 pg 都沒有問題。但有時候 pg num 配置小了會報錯,配置大了也會報錯。這不是因為這么配置不對,是因為有其它的參數在限制我們隨意配置 pg num。
比如:
osd 有兩個配置,當每個 osd 的 pg num 過少(默認30)時會告警,當每個 osd 的 pg num 過多(默認300)也會告警。
所以,想要入門使用 ceph,還是需要了解許多基礎知識才可以。否則,各種意外。
https://docs.ceph.com/docs/master/architecture/
https://ceph.com/pgcalc/
Ⅶ Ceph 分層緩存--Tiering Cache
原文來自Ceph官方文檔: CACHE TIERING
部分摘抄自Ceph中國社區翻譯文檔: 分級緩存
分層緩存為ceph客戶端中的某些存放在存儲層的數據提供更好的IO性能。分級緩存需創建一個由高速而昂貴存儲設備(如 SSD )組成的存儲池、作為緩存層,以及一個相對低速/廉價設備組成的後端存儲池(或糾刪碼編碼的)、作為經濟存儲層。Ceph 的對象處理器決定往哪裡存儲對象,分級代理決定何時把緩存內的對象刷回後端存儲層;所以緩存層和後端存儲層對 Ceph 客戶端來孫禪孝說是完全透明的。
緩存代理層管理著數據在緩存層和存儲層之間的自動遷移。但是, 管理員也可以通過配置來干預遷移規則, 下面是對兩個主要場景的介紹:
Writeback Mode: 當管理員將緩存層配置成回寫模式, Ceph客戶端將數據寫入緩存層,並接收返回的ACK。同時,寫入緩存層的數據遷移到存儲層, 然後從緩存層刷掉。 直觀的看, 緩存層在存儲層之前。 當Ceph客戶端需要存在於存儲層的數據時, 緩存層代理會把這些數據遷移到緩存層,然後再發往 Ceph 客戶端。因此,Ceph 客戶端將與緩存層進行 I/O 操作,直到數據不再被讀寫。此模式對於易變數據來說較理想(如照片/視頻編輯、事務數據等)。
Read-proxy Mode: 這個模式將使用一些已經存在於緩存層的數據,但是,如果數據不在緩存層,請求將被代理轉發到底層。這個模式對於從回寫模式過渡到禁用緩存非常有用的, 因為它潤需負載一直工作到緩存乾涸,不再向緩存添加任何數據。
如果負載過多,分層緩存會降低性能。用戶在使用以下特性時需要極其謹慎。
Workload dependent : 緩存是否能提升性能,高度依賴於負載能力。因為將數據移入或移除緩存會導致額外的開銷,它只在對數據集的訪問有大的偏離時有影響。例如, 眾多的請求訪問小數量的objects,這時,你的緩存池需要非常大,才能在處理所有請求時,避免數據過渡。
Difficult to benchmark : 用戶使用評測性能時,大部分的關於分層緩存bechmarks測試結果,將會是一個糟糕的結果。其中部分原因是很少的bechmarks傾斜於一組小的對象集合的請求 , 這會使緩存經過很長時間後才能「活躍起來」,並且這種「活躍起來」會導致高昂的開銷。
Usually slower : 對於並沒有友好使用分級緩存的工作負載,性能普遍低於一個沒使用分級緩存的普通rados池。
librados object enumeration : 對於librados級別的枚舉對象API並不能連貫存在在這種情況中(The librados-level object enumeration API is not meant to be coherent in the presence of the case)。 如果你的應用直接使用則稿rados,並且依賴於枚舉對象,分級緩存不能向期待的那樣工作. (對於RGW, RBD, or CephFS,沒有這個問題)
Complexity : 在使用RADOS集群時,使用分級緩存意味著大量的額外器械和復雜性。這會增加你遇到未知的BUG(可能其他人未遇到過)的可能性, 並且使你的部署擁有更大的風險。
RGW time-skewed : 如果RGW工作中遇到的大部分操作是朝向最近寫入的數據,一個簡單的分級緩存可以工作得很好。
下面的配置使用分層緩存效果不佳。
RBD with replicated cache and erasure-coded base : 這是一個普遍的需求, 但是通常不能很好工作。即使合理的傾斜工作負載,仍然會遇到一些對於冷門object的寫操作的情況,並且由於糾刪襲仿碼類型的池還不支持輕微的讀寫操作,為了適應一些小的寫入操作(通常4kb),整個object塊(通常4MB)必須被全部遷移到緩存 。只有少數用戶成功的應用了這種部署方式,並且這種部署方案只能為他們工作是因為他們的數據是極其「冷門」的(例如備份),並且他們對於性能並不敏感。
RBD with replicated cache and base : 在使用備份類型為基礎層時比以糾刪碼為基礎層時,RBD的表現更為良好, 但是它在工作負載中仍然依賴於大量的傾斜,並且很難驗證。用戶需要對他們的工作負載有更好的理解, 並且需要仔細調整分層緩存參數。
為了建立分層緩存,你必須擁有兩個存儲池。一個作為後端存儲,一個作為緩存。
建立一個後端存儲池包含兩種場景:
標准存儲 : 在這種場景中,這個池在Ceph存儲集群中存儲一個對象的多個副本。
糾刪碼: 在這種場景中,存儲池用糾刪碼高效地存儲數據,性能稍有損失。
在標准存儲場景中,你可以用 CRUSH 規則集來標識失敗域(如 osd 、主機、機箱、機架、排等)。當規則集所涉及的所有驅動器規格、速度(轉速和吞吐量)和類型相同時, OSD 守護進程運行得最優。創建規則集的詳情見 CRUSH 圖 。創建好規則集後,再創建後端存儲池。
在糾刪碼編碼情景中,創建存儲池時指定好參數就會自動生成合適的規則集,詳情見 創建存儲池 。
在後續例子中,我們把cold-storage當作後端存儲池。