配置多個活動 MDS 守護程序
也稱為:multi-mds、主動-主動MDS。
每個 CephFS 檔案系統預設配置為一個活動的 MDS 守護程序。要為大型系統擴充套件元資料效能,您可以啟用多個活動的 MDS 守護程式,它們將相互共享元資料工作負載。
什麼時候應該使用多個活動的 MDS 守護程序?
- 當您的元資料效能在預設執行的單個 MDS 上出現瓶頸時,您應該配置多個活動的 MDS 守護程式。
- 新增更多守護程序可能不會提高所有工作負載的效能。通常,在單個客戶端上執行的單個應用程式不會受益於 MDS 守護程式數量的增加,除非該應用程式並行執行大量元資料操作。
- 通常受益於大量活動 MDS 守護程式的工作負載是具有許多客戶端的工作負載,可能在許多單獨的目錄上工作。
增加 MDS 活動叢集大小
每個 CephFS 檔案系統都有一個max_mds設定,它控制將建立多少個rank。檔案系統中的實際 rank 數只有在有備用守護程式可用於承擔新 rank 時才會增加。例如,如果只有一個 MDS 守護程序在執行,並且 max_mds 設定為 2,則不會建立第二個 rank。(請注意,這樣的配置不是高可用性 (HA),因為沒有備用可用於接管失敗的 rank。以這種方式配置時,叢集將通過執行狀況警告進行投訴。)
設定max_mds
為所需的 rank 數。在以下示例中,“ceph status”的“fsmap”行顯示了命令的預期結果。
# fsmap e5: 1/1/1 up {0=a=up:active}, 2 up:standby ceph fs set <fs_name> max_mds 2 # fsmap e8: 2/2/2 up {0=a=up:active,1=c=up:creating}, 1 up:standby # fsmap e9: 2/2/2 up {0=a=up:active,1=c=up:active}, 1 up:standby
新建立的 rank (1) 將通過“creating”狀態,然後進入此“active狀態”。
備用守護程序
即使有多個活動的 MDS 守護程式,如果執行活動守護程式的任何伺服器發生故障,高可用性系統仍然需要備用守護程式來接管。
因此,高可用性系統的max_mds
實際最大值最多比系統中的 MDS 伺服器總數少一。
要在多臺伺服器發生故障時保持可用,請增加系統中備用守護程式的數量以匹配您希望承受的伺服器故障數量。
減少 Rank 數量
減少 rank 的數量就像減少max_mds
一樣簡單:
# fsmap e9: 2/2/2 up {0=a=up:active,1=c=up:active}, 1 up:standby ceph fs set <fs_name> max_mds 1 # fsmap e10: 2/2/1 up {0=a=up:active,1=c=up:stopping}, 1 up:standby # fsmap e10: 2/2/1 up {0=a=up:active,1=c=up:stopping}, 1 up:standby ... # fsmap e10: 1/1/1 up {0=a=up:active}, 2 up:standby
叢集將自動遞增地停止額外的排名,直到max_mds
達到。
注意:stopped rank 將首先進入停止狀態一段時間,同時將其共享的元資料交給剩餘的活動守護程序。此階段可能需要幾秒鐘到幾分鐘。如果 MDS 似乎卡在停止狀態,則應將其作為可能的錯誤進行調查。
如果 MDS 守護程式在該up:stopping
狀態下崩潰或被殺死,備用伺服器將接管,叢集MON將阻止嘗試停止守護程式。
當一個守護程序完成停止時,它會自行重生並回到備用狀態。
手動將目錄樹固定到特定 Rank
在多個活動元資料伺服器配置中,會執行一個平衡器,用於將元資料負載均勻地分佈在整個叢集中。這通常對大多數使用者來說足夠好,但有時需要使用元資料到特定 rank 的顯式對映來覆蓋動態平衡器。這可以允許管理員或使用者平均分配應用程式負載或限制使用者元資料請求對整個叢集的影響。
為此目的提供的機制稱為目錄的export pin
擴充套件屬性。此擴充套件屬性的名稱是 ceph.dir.pin
。使用者可以使用標準命令設定此屬性:
setfattr -n ceph.dir.pin -v 2 path/to/dir
擴充套件屬性的值是分配目錄子樹的 rank 。預設值-1
表示目錄未固定。
目錄的 export pin 是從其最近設定了 export pin 的父級繼承的。這樣,在目錄上設定 export pin 會影響其所有子級。但是,可以通過設定子目錄的 export pin 來覆蓋父 pin。例如:
mkdir -p a/b
# "a" and "a/b" both start without an export pin set # "a" 和 "a/b" 都在沒有設定 export pin 的情況下開始
setfattr -n ceph.dir.pin -v 1 a/
# a and b are now pinned to rank 1 # a 和 b 現在被固定到 rank 1
setfattr -n ceph.dir.pin -v 0 a/b
# a/b is now pinned to rank 0 and a/ and the rest of its children are still pinned to rank 1 # a/b 現在被固定到 rank 0 ,而 a/ 並且它的其餘子目錄仍然被固定到 rank 1
設定子樹分割槽策略
也可以通過一組策略設定子樹的自動靜態分割槽。在 CephFS 中,這種自動靜態分割槽稱為(ephemeral pinning)臨時固定。任何臨時固定的目錄(inode)都將根據其 inode 編號的一致雜湊自動分配到特定 rank 。所有臨時固定目錄的集合應均勻分佈在所有 rank 中。
臨時固定目錄之所以如此命名,是因為一旦目錄 inode 從快取中刪除,該 pin 可能不會持續存在。但是,MDS 故障轉移不會影響固定目錄的短暫性質。MDS 將哪些子樹臨時固定在其日誌中,因此 MDS 故障轉移不會丟棄此資訊。
目錄要麼暫時固定,要麼不固定。它被固定到哪個 rank 是從它的 inode 編號和一致的雜湊值得出的。這意味著臨時固定的目錄在 MDS 叢集中分佈均勻。當MDS 叢集增長或縮小時,一致的雜湊也可以最大限度地減少重新分配。因此,擴充套件 MDS 叢集可能會自動增加您的元資料吞吐量,而無需其他管理干預。
目前,有兩種型別的臨時固定:
-
Distributed Ephemeral Pins:此策略導致目錄碎片(甚至遠低於正常碎片閾值)並將其碎片分發為臨時固定子樹。這具有在一系列 MDS rank 中分配直系子目錄的效果。典型的示例用例是
/home
目錄:我們希望每個使用者的主目錄分佈在整個 MDS 叢集中。這可以通過以下方式設定:
setfattr -n ceph.dir.pin.distributed -v 1 /cephfs/home
-
Random Ephemeral Pins:此策略表明任何後代子目錄都可以被臨時固定。這是通過擴充套件屬性
ceph.dir.pin.random
設定的,其值設定為應固定的目錄百分比。例如:
setfattr -n ceph.dir.pin.random -v 0.5 /cephfs/tmp
將導致載入到快取中或在/tmp
下建立的任何目錄在 50% 的時間內被臨時固定。
建議僅將其設定為較小的值,例如.001
或0.1%
。擁有太多子樹可能會降低效能。出於這個原因,配置 mds_export_ephemeral_random_max
強制限制此百分比的最大值(預設值:.01
)。嘗試設定超出此配置的值時,MDS 會返回EINVAL
。
預設情況下,Octopus 版本中的隨機和分散式臨時 pin 策略均處於關閉狀態。可以通過 mds_export_ephemeral_random
和mds_export_ephemeral_distributed
配置選項啟用這些功能。
臨時 pin 可能會覆蓋父 export pin,反之亦然。決定遵循哪種策略的是最近父目錄的規則:如果更近的父目錄有衝突的策略,則使用該策略。例如:
mkdir -p foo/bar1/baz foo/bar2
setfattr -n ceph.dir.pin -v 0 foo
setfattr -n ceph.dir.pin.distributed -v 1 foo/bar1
foo/bar1/baz
目錄將被臨時固定,因為foo/bar1
策略會覆蓋foo 。
foo/bar2
目錄將正常地繼承 foo
pin 。
對於相反的情況:
mkdir -p home/{patrick,john}
setfattr -n ceph.dir.pin.distributed -v 1 home
setfattr -n ceph.dir.pin -v 2 home/patrick
home/patrick
目錄及其子目錄將被固定到 rank 2,因為它的 export pin 覆蓋了home 。