1. 程式人生 > 其它 >Ceph叢集架構介紹(pacific版本)

Ceph叢集架構介紹(pacific版本)

1. 同一物理硬體上執行多個叢集(已棄用)

  • 每個 Ceph 叢集都有一個內部名稱,用作配置和日誌檔名稱以及目錄和掛載點名稱的一部分。此名稱預設為“ceph”。
  • 以前的 Ceph 版本允許指定自定義名稱,例如“ceph2”。這旨在促進在同一物理硬體上執行多個邏輯叢集,但實際上這很少被利用,不應再嘗試。自定義叢集名稱現在被認為已棄用。
  • 先前的文件也可能被誤解為需要唯一的叢集名稱才能使用rbd-mirror。
  • 強烈建議使用預設名稱“ceph”部署所有新叢集。

2. 延伸叢集

2.1 介紹

Ceph 通常期望其網路和整個叢集的所有部分都同樣可靠,故障隨機分佈在 CRUSH 對映中。因此,您可能會丟失一個交換機,該交換機會破壞多個 OSD,但我們希望剩餘的 OSD 和MON能夠繞過該交換機。

這通常是一個不錯的選擇,但在某些擴充套件叢集配置中可能無法正常工作,因為叢集的很大一部分卡在單個網路元件後面。例如,位於多個數據中心的單個叢集,並且您希望承受整個 DC 的丟失。

我們已經看到部署了兩種標準配置,有兩個或三個資料中心(或者,在雲中,可用區)。對於兩個區域,我們希望每個站點都儲存一份資料副本,並且對於第三個站點有一個決勝MON(這可以是一個虛擬機器或與主要站點相比具有高延遲),以便在網路連線的情況下選擇獲勝者失敗,兩個 DC 都還活著。對於三個站點,我們希望每個站點都有一份資料副本和相同數量的MON。

請注意,標準的 Ceph 配置可以承受網路或資料中心的許多故障,並且永遠不會損害資料的一致性。如果您在發生故障後恢復了足夠多的 Ceph 伺服器,它就會恢復。如果你失去了一個數據中心,但仍然可以組成一個法定人數的MON並擁有所有可用的資料(有足夠的副本來滿足池的min_size

要求,或者 CRUSH 規則會重新複製以滿足它),Ceph 將保持可用性。

2.2 問題

無論發生什麼,Ceph 都不會在資料完整性和一致性上妥協。如果您的網路出現故障或節點丟失並且您可以恢復服務,Ceph 將自行恢復正常功能。

但是在某些情況下,儘管有足夠的可用伺服器來滿足 Ceph 的一致性和大小限制,但您會失去資料可用性,或者您可能會驚訝於不滿足 Ceph 的限制。

  • 這些故障的第一個重要類別是圍繞不一致的網路解決的——如果存在 netsplit(網路分割槽),Ceph 可能無法將 OSD 標記為 down 並將它們踢出正在執行的 PG 集中,儘管主節點無法複製資料。如果發生這種情況,將不允許 IO,因為 Ceph 無法滿足其永續性保證。
  • 第二類重要的故障是當您認為您的資料跨資料中心複製時,但約束不足以保證這一點。例如,您可能有資料中心 A 和 B,您的 CRUSH 規則以 3 個副本為目標,並在每個資料中心放置一個副本,其中 Amin_size為 2。PG 可能會在站點 A 中有 2 個副本而在站點 B 中沒有副本時處於活動狀態,這意味著如果您隨後丟失站點 A,您將丟失資料並且 Ceph 無法對其進行操作。使用標準 CRUSH 規則,這種情況出奇地難以避免。

2.3 延伸模式

新的延伸模式旨在處理 2-site case。三個站點同樣容易受到 netsplit 問題的影響,但比 2 站點叢集更能容忍元件可用性中斷。

要進入延伸模式,您必須設定每臺MON的位置,以匹配您的 CRUSH Map。例如,放置mon.a在您的第一個資料中心:

$ ceph mon set_location a datacenter=site1

接下來,生成一個 CRUSH 規則,它將在每個資料中心放置 2 個副本。這將需要直接編輯 CRUSH Map:

$ ceph osd getcrushmap > crush.map.bin
$ crushtool -d crush.map.bin -o crush.map.txt

現在編輯crush.map.txt檔案以新增新規則。這裡只有一個其他規則,所以這是 ID 1,但您可能需要使用不同的規則 ID。我們還有兩個名為site1andsite2的資料中心儲存桶:

rule stretch_rule {
        id 1
        type replicated
        min_size 1
        max_size 10
        step take site1
        step chooseleaf firstn 2 type host
        step emit
        step take site2
        step chooseleaf firstn 2 type host
        step emit
}

最後,注入 CRUSH Map以使規則對叢集可用:

$ crushtool -c crush.map.txt -o crush2.map.bin
$ ceph osd setcrushmap -i crush2.map.bin

如果您尚未在連線模式下執行監視器,請按照更改監視器選舉中的說明進行操作。

最後,告訴叢集進入延伸模式。這mon.e是決勝站點,我們正在跨資料中心進行拆分

$ ceph mon enable_stretch_mode e stretch_rule data center
  • 啟用延伸模式後,OSD 將僅在 PG 對等跨資料中心(或您指定的任何其他 CRUSH 儲存桶型別)時啟用 PG,假設兩者都處於活動狀態。池的大小將從預設的 3 增加到 4,預計每個站點中有 2 個副本。OSD 只能連線到同一資料中心的MON。如果未指定位置,則不允許新MON加入叢集。
  • 如果一個數據中心的所有 OSD 和MON一次都無法訪問,則倖存的資料中心將進入降級延伸模式。這將發出警告,將 min_size 減小到 1,並允許叢集在剩餘的單個站點中使用資料進行活動。請注意,我們不會更改池副本數,因此您還會收到池副本數太小的警告——但一個特殊的拉伸模式標誌會阻止 OSD 在剩餘的資料中心建立額外的副本(因此它只會保留 2 個副本, 像之前一樣)。
  • 當丟失的資料中心回來時,叢集將進入恢復延伸模式。這會改變警告並允許對等,但仍然只需要來自一直處於執行狀態的資料中心的 OSD。當所有 PG 都處於已知狀態,並且既沒有降級也沒有不完整時,叢集將轉換回常規延伸模式,結束警告,將 min_size 恢復為其起始值 (2) 並要求兩個站點對等,並停止要求始終對等時的活動站點(以便您可以在必要時故障轉移到另一個站點)。

2.4 限制

  • 正如上述設定所示,延伸模式僅處理 2 個具有 OSD 的站點。
  • 雖然沒有強制執行,但您應該在每個站點執行 2 個MON,外加一個 tiebreaker(仲裁站點MON),總共 5 個。這是因為 OSD 只能在延伸模式下連線到自己站點中的MON。
  • 您不能將糾刪碼池與延伸模式一起使用。如果您嘗試,它會拒絕,並且不允許您在延伸模式下建立 EC 池。
  • 您必須建立自己的 CRUSH 規則,該規則在每個站點提供 2 個副本,並且您必須使用 4 個副本,每個站點有 2 個副本。如果您的現有池具有非預設 size/min_size,則當您嘗試啟用延伸模式時,Ceph 將反對。
  • 因為它可能會在降級min_size 1時執行,所以您應該只對全快閃記憶體 OSD 使用延伸模式。這可以最大限度地減少連線恢復後資料恢復所需的時間,從而最大限度地減少資料丟失的可能性。
  • 希望未來的開發將擴充套件此功能以支援 EC 池並執行超過 2 個完整站點。

2.5 其他命令

從 Pacific v16.2.8 開始,如果您的 tiebreaker MON由於某種原因出現故障,您可以更換它。啟動新MON並執行:

$ ceph mon set_new_tiebreaker mon.<new_mon_name>

如果新MON與現有的非決勝MON位於同一位置,此命令將發出抗議。此命令不會刪除之前的決勝MON;你應該自己刪除。

同樣在 16.2.7 中,如果您正在編寫自己的工具來部署 Ceph,您可以在啟動監視器時使用新選項--set-crush-location,而不是執行 ceph mon set_location。此選項僅接受一個“bucket=loc”對,例如 ,它必須與您在執行ceph-mon --set-crush-location 'datacenter=a'enable_stretch_mode時指定的儲存桶型別匹配。

在延伸降級模式下,當斷開連線的資料中心恢復時,叢集將自動進入“恢復”模式。如果這不起作用,或者您想盡早啟用恢復模式,您可以呼叫:

$ ceph osd force_recovery_stretch_mode --yes-i-realy-mean-it

但是這個命令應該不是必需的;它包括處理意外情況。

當處於恢復模式時,叢集應該在 PG 健康時回到正常的延伸模式。如果這沒有發生,或者您想盡早強制跨資料中心對等並願意冒資料停機的風險(或已單獨驗證所有 PG 都可以對等,即使它們沒有完全恢復),您可以呼叫:

$ ceph osd force_healthy_stretch_mode --yes-i-really-mean-it

這個命令應該不是必需的;它包括處理意外情況。但是您可能希望呼叫它來刪除HEALTH_WARN恢復模式生成的狀態。