跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Enterprise Storage 7 文件 / 操作和管理指南 / 叢集操作 / 確定叢集狀態
適用範圍 SUSE Enterprise Storage 7

12 確定叢集狀態

當叢集正在執行時,您可以使用 ceph 工具來監控它。若要確定叢集狀態,通常需要檢查 Ceph OSD、Ceph 監控程式、放置群組和中繼資料伺服器的狀態。

提示
提示:Interactive mode

若要以互動模式執行 ceph 工具,請不帶任何引數在指令行中輸入 ceph。如果要在一行中輸入多條 ceph 指令,則使用互動模式較為方便。例如:

cephuser@adm > ceph
ceph> health
ceph> status
ceph> quorum_status
ceph> mon stat

12.1 檢查叢集的狀態

您可以使用 ceph statusceph -s 瞭解叢集的即時狀態:

cephuser@adm > ceph -s
cluster:
    id:     b4b30c6e-9681-11ea-ac39-525400d7702d
    health: HEALTH_OK

  services:
    mon: 5 daemons, quorum ses-min1,ses-master,ses-min2,ses-min4,ses-min3 (age 2m)
    mgr: ses-min1.gpijpm(active, since 3d), standbys: ses-min2.oopvyh
    mds: my_cephfs:1 {0=my_cephfs.ses-min1.oterul=up:active}
    osd: 3 osds: 3 up (since 3d), 3 in (since 11d)
    rgw: 2 daemons active (myrealm.myzone.ses-min1.kwwazo, myrealm.myzone.ses-min2.jngabw)

  task status:
    scrub status:
        mds.my_cephfs.ses-min1.oterul: idle

  data:
    pools:   7 pools, 169 pgs
    objects: 250 objects, 10 KiB
    usage:   3.1 GiB used, 27 GiB / 30 GiB avail
    pgs:     169 active+clean

輸出內容提供了以下資訊:

  • 叢集 ID

  • 叢集執行狀態

  • 監控程式地圖版本編號和監控程式仲裁的狀態

  • OSD 地圖版本編號和 OSD 的狀態

  • Ceph 管理員的狀態

  • 物件閘道的狀態

  • 放置群組地圖版本

  • 放置群組和池數量

  • 理論上儲存的資料量和儲存的物件數量

  • 所儲存資料的總量。

提示
提示:Ceph 計算資料使用率的方式

used 值反映實際使用的原始儲存量。xxx GB / xxx GB 值表示叢集可用容量 (兩者中的較小數值),以及叢集的整體儲存容量。理論數量反映在複製所儲存資料或建立其快照前這些資料的大小。因此,實際儲存的資料量一般會超出理論上的儲存量,因為 Ceph 會建立資料的複本,可能還會將儲存容量用於複製和建立快照。

顯示即時狀態資訊的其他指令如下:

  • ceph pg stat

  • ceph osd pool stats

  • ceph df

  • ceph df detail

若要即時更新資訊,請在 watch 指令中以引數的方式使用以上任意指令 (包括 ceph -s):

root # watch -n 10 'ceph -s'

如果您看累了,請按 CtrlC

12.2 檢查叢集狀況

在啟動叢集後到開始讀取和/或寫入資料期間,檢查叢集的狀態:

cephuser@adm > ceph health
HEALTH_WARN 10 pgs degraded; 100 pgs stuck unclean; 1 mons down, quorum 0,2 \
node-1,node-2,node-3
提示
提示

如果之前為您的組態或金鑰圈指定了非預設位置,則此時可以指定它們的位置:

cephuser@adm > ceph -c /path/to/conf -k /path/to/keyring health

Ceph 叢集會傳回下列狀態代碼之一:

OSD_DOWN

一或多個 OSD 標示為已停機。OSD 精靈可能已停止,或對等 OSD 可能無法透過網路連接 OSD。常見原因包括精靈已停止或已當機、主機已停機或網路中斷。

驗證主機是否執行良好,精靈是否已啟動,並且網路是否正常運作。如果精靈已當機,精靈記錄檔案 (/var/log/ceph/ceph-osd.*) 可能會包含除錯資訊。

OSD_crush type_DOWN,例如 OSD_HOST_DOWN

特定 CRUSH 子樹中的所有 OSD (例如主機上的所有 OSD) 均標示為已停機。

OSD_ORPHAN

在 CRUSH 地圖階層中參考了 OSD,但它不存在。可使用以下指令從 CRUSH 階層中移除 OSD:

cephuser@adm > ceph osd crush rm osd.ID
OSD_OUT_OF_ORDER_FULL

以下各項的使用率閾值並不是遞增的:backfillfull (預設值為 0.90)、nearfull (預設值為 0.85)、full (預設值為 0.95)、failsafe_full。特別是,我們需要 backfillfull < nearfullnearfull < fullfull < failsafe_full

若要讀取最新的值,請執行以下指令:

cephuser@adm > ceph health detail
HEALTH_ERR 1 full osd(s); 1 backfillfull osd(s); 1 nearfull osd(s)
osd.3 is full at 97%
osd.4 is backfill full at 91%
osd.2 is near full at 87%

可以使用以下指令調整閾值:

cephuser@adm > ceph osd set-backfillfull-ratio ratio
cephuser@adm > ceph osd set-nearfull-ratio ratio
cephuser@adm > ceph osd set-full-ratio ratio
OSD_FULL

一或多個 OSD 超出了 full 閾值,阻止叢集處理寫入操作。可使用以下指令檢查各池的使用量:

cephuser@adm > ceph df

可使用以下指令查看目前定義的 full 比率:

cephuser@adm > ceph osd dump | grep full_ratio

還原寫入可用性的臨時解決辦法是稍稍提高 full 閾值:

cephuser@adm > ceph osd set-full-ratio ratio

請透過部署更多 OSD 將新的儲存新增至叢集,或者刪除現有資料來騰出空間。

OSD_BACKFILLFULL

一或多個 OSD 超出了 backfillfull 閾值,因而不允許將資料重新平衡到此裝置。這是一則預警,表示重新平衡可能無法完成,並且叢集將滿。可使用以下指令檢查各池的使用量:

cephuser@adm > ceph df
OSD_NEARFULL

一或多個 OSD 超出了 nearfull 閾值。這是一則預警,表示叢集將滿。可使用以下指令檢查各池的使用量:

cephuser@adm > ceph df
OSDMAP_FLAGS

已設定一或多個所需的叢集旗標。可使用以下指令設定或清除這些旗標 (full 除外):

cephuser@adm > ceph osd set flag
cephuser@adm > ceph osd unset flag

這些旗標包括:

full

叢集標記為已滿,無法處理寫入操作。

pauserd、pausewr

已暫停讀取或寫入。

noup

不允許 OSD 啟動。

nodown

將會忽略 OSD 故障報告,如此監控程式便不會將 OSD 標示為 down

noin

先前標示為 out 的 OSD 在啟動時將不會重新標示為 in

noout

停機的 OSD 在設定間隔過後將不會自動標示為 out

nobackfill、norecover、norebalance

復原或資料重新平衡程序已暫停。

noscrub、nodeep_scrub

整理程序已停用 (請參閱第 17.6 節 「整理放置群組」)。

notieragent

快取分層活動已暫停。

OSD_FLAGS

一或多個 OSD 設定了所需的每 OSD 旗標。這些旗標包括:

noup

不允許 OSD 啟動。

nodown

將會忽略此 OSD 的故障報告。

noin

如果此 OSD 先前在發生故障後自動標示為 out,當它啟動時將不會標示為 in

noout

如果此 OSD 已停機,則在設定的間隔過後,它將不會自動標示為 out

可使用以下指令來設定和清除每 OSD 旗標:

cephuser@adm > ceph osd add-flag osd-ID
cephuser@adm > ceph osd rm-flag osd-ID
OLD_CRUSH_TUNABLES

CRUSH 地圖目前使用的設定很舊,應予以更新。mon_crush_min_required_version 組態選項可確定使用時不會觸發此狀態警告的最舊可調參數 (即能夠連接到叢集的最舊用戶端版本)。

OLD_CRUSH_STRAW_CALC_VERSION

CRUSH 地圖目前使用較舊的非最佳方法來計算 straw 桶的中間權數值。應該更新 CRUSH 地圖,以使用較新的方法 (straw_calc_version=1)。

CACHE_POOL_NO_HIT_SET

一或多個快取池未設定命中集來追蹤使用量,這使分層代理程式無法識別要從快取中衝洗和逐出的冷物件。可使用以下指令對快取池設定命中集︰

cephuser@adm > ceph osd pool set poolname hit_set_type type
cephuser@adm > ceph osd pool set poolname hit_set_period period-in-seconds
cephuser@adm > ceph osd pool set poolname hit_set_count number-of-hitsets
cephuser@adm > ceph osd pool set poolname hit_set_fpp target-false-positive-rate
OSD_NO_SORTBITWISE

未在執行 Luminous 12 以下版本的 OSD,但是尚未設定 sortbitwise 旗標。您需要先設定 sortbitwise 旗標,Luminous 12 或更新版本的 OSD 才能啟動:

cephuser@adm > ceph osd set sortbitwise
POOL_FULL

一或多個池已達到其定額,不再允許寫入。您可使用以下指令來設定池定額和使用量:

cephuser@adm > ceph df detail

您可以使用以下指令來提高池定額

cephuser@adm > ceph osd pool set-quota poolname max_objects num-objects
cephuser@adm > ceph osd pool set-quota poolname max_bytes num-bytes

或者刪除一些現有資料以減少使用量。

PG_AVAILABILITY

資料可用性下降,這表示叢集無法處理針對叢集中某些資料的潛在讀取或寫入要求。具體而言,一或多個 PG 處於不允許處理 I/O 要求的狀態。有問題的 PG 狀態包括互聯建立中陳舊不完整和不處於使用中 (如果不迅速解決這些狀況)。執行以下指令可獲得有關哪些 PG 受影響的詳細資訊:

cephuser@adm > ceph health detail

大多數情況下,出現此情形的根本原因在於一或多個 OSD 目前已停機。可使用以下指令來查詢特定的有問題 PG 的狀態:

cephuser@adm > ceph tell pgid query
PG_DEGRADED

某些資料的資料備援降低,這表示叢集沒有所需數量的複本用於所有資料 (對於副本池) 或糾刪碼片段 (對於糾刪碼池)。具體而言,一或多個 PG 設定了 degradedundersized 旗標 (叢集中沒有該放置群組的足夠例項),或者有一段時間未設定 clean 旗標。執行以下指令可獲得有關哪些 PG 受影響的詳細資訊:

cephuser@adm > ceph health detail

大多數情況下,出現此情形的根本原因在於一或多個 OSD 目前已停機。可使用以下指令來查詢特定的有問題 PG 的狀態:

cephuser@adm > ceph tell pgid query
PG_DEGRADED_FULL

由於叢集中的可用空間不足,某些資料的資料備援可能已降低或面臨風險。具體而言,一或多個 PG 設定了 backfill_toofullrecovery_tooful 旗標,這表示叢集無法移轉或復原資料,原因是一或多個 OSD 高於 backfillfull 閾值。

PG_DAMAGED

資料整理 (請參閱第 17.6 節 「整理放置群組」) 程序探查到叢集中存在某些資料一致性問題。具體而言,一或多個 PG 設定了 inconsistentsnaptrim_error 旗標 (表示某個較早的整理操作發現問題),或者設定了 repair 旗標 (表示目前正在修復此類不一致問題)。

OSD_SCRUB_ERRORS

最近的 OSD 整理操作發現了不一致問題。

CACHE_POOL_NEAR_FULL

快取層池將滿。此環境中的「滿」由快取池的 target_max_bytestarget_max_objects 內容確定。當池達到目標閾值時,如果正在從快取衝洗和逐出資料,寫入池的要求可能會被阻擋,出現常會導致延遲很高且效能變差的狀態。可使用以下指令調整快取池目標大小:

cephuser@adm > ceph osd pool set cache-pool-name target_max_bytes bytes
cephuser@adm > ceph osd pool set cache-pool-name target_max_objects objects

正常的快取衝洗和逐出活動還可能因基礎層級可用性或效能下降或者叢集的整體負載較高而受到限制。

TOO_FEW_PGS

使用中的 PG 數量低於每個 OSD 的 PG 數的可設定閾值 mon_pg_warn_min_per_osd。這可能導致叢集中各 OSD 間的資料分發和平衡未達到最佳,以致降低整體效能。

TOO_MANY_PGS

使用中的 PG 數量高於每個 OSD 的 PG 數的可設定閾值 mon_pg_warn_max_per_osd。這可能導致 OSD 精靈的記憶體使用率較高,叢集狀態變更 (例如 OSD 重新啟動、新增或移除) 之後互聯速度降低,並且 Ceph 管理員和 Ceph 監控程式上的負載較高。

雖然不能減少現有池的 pg_num 值,但可以減少 pgp_num 值。這樣可有效地將一些 PG 併置在同組 OSD 上,從而減輕上述的一些負面影響。可使用以下指令調整 pgp_num 值:

cephuser@adm > ceph osd pool set pool pgp_num value
SMALLER_PGP_NUM

一或多個池的 pgp_num 值小於 pg_num。這通常表示 PG 計數有所提高,但未同時提升放置行為。使用以下指令設定 pgp_num,使其與觸發資料移轉的 pg_num 相符,通常便可解決此問題:

cephuser@adm > ceph osd pool set pool pgp_num pg_num_value
MANY_OBJECTS_PER_PG

一或多個池的每 PG 平均物件數大大高於叢集的整體平均值。透過 mon_pg_warn_max_object_skew 組態值來控制該特定閾值。這通常表示包含叢集中大部分資料的池所具有的 PG 太少,以及/或者不包含這麼多資料的其他池具有的 PG 太多。可透過調整監控程式上的 mon_pg_warn_max_object_skew 組態選項提高閾值,來消除該狀態警告。

POOL_APP_NOT_ENABLED

存在包含一或多個物件,但尚未標記為供特定應用程式使用的池。將池標記為供某個應用程式使用即可消除此警告。例如,如果池由 RBD 使用:

cephuser@adm > rbd pool init pool_name

如果池正由自訂應用程式「foo」使用,您還可以使用低層級指令標記它:

cephuser@adm > ceph osd pool application enable foo
POOL_FULL

一或多個池已達到 (或幾乎要達到) 其定額。透過 mon_pool_quota_crit_threshold 組態選項來控制觸發此錯誤狀況的閾值。可使用以下指令上調、下調 (或移除) 池定額:

cephuser@adm > ceph osd pool set-quota pool max_bytes bytes
cephuser@adm > ceph osd pool set-quota pool max_objects objects

將定額值設定為 0 將停用定額。

POOL_NEAR_FULL

一或多個池接近其定額。透過 mon_pool_quota_warn_threshold 組態選項來控制觸發此警告狀況的閾值。可使用以下指令上調、下調 (或移除) 池定額:

cephuser@adm > ceph osd osd pool set-quota pool max_bytes bytes
cephuser@adm > ceph osd osd pool set-quota pool max_objects objects

將定額值設定為 0 將停用定額。

OBJECT_MISPLACED

叢集中的一或多個物件未儲存在叢集希望儲存的節點上。這表示叢集最近的某項變更導致的資料移轉尚未完成。誤放的資料本質上不屬於危險狀況。資料一致性方面永遠不會有風險,僅當所需位置放置了物件所需份數的新副本之後,系統才會移除物件的舊副本。

OBJECT_UNFOUND

找不到叢集中的一或多個物件。具體而言,OSD 知道物件的新複本或更新複本應該存在,但在目前啟用的 OSD 上卻找不到該版物件的複本。系統將阻止對「未找到」物件的讀取或寫入要求。從理論上講,可以將具有未找到物件最近複本的已停機 OSD 重新啟用。可透過負責處理未找到物件的 PG 的互聯狀態識別候選 OSD:

cephuser@adm > ceph tell pgid query
REQUEST_SLOW

正花費很長的時間處理一或多個 OSD 要求。這可能表示負載極重、儲存裝置速度緩慢或有軟體錯誤。您可以從 OSD 主機上執行以下指令,來查詢有問題的 OSD 上的要求佇列:

cephuser@adm > ceph daemon osd.id ops

您可以查看近期最慢的要求摘要:

cephuser@adm > ceph daemon osd.id dump_historic_ops

可使用以下指令尋找 OSD 的位置:

cephuser@adm > ceph osd find osd.id
REQUEST_STUCK

已將一或多個 OSD 要求阻擋一段相當長的時間,例如 4096 秒。這表示叢集已有很長一段時間處於狀況不良狀態 (例如,沒有足夠的執行中 OSD 或非使用中 PG),或者 OSD 存在某種內部問題。

PG_NOT_SCRUBBED

最近未整理 (請參閱第 17.6 節 「整理放置群組」) 一或多個 PG。通常每 mon_scrub_interval 秒整理一次 PG,當 mon_warn_not_scrubbed 這類間隔已過但未進行整理時,就會觸發此警告。如果 PG 未標記為清理,系統將不會整理它們。如果 PG 放置錯誤或已降級,就會出現這種情況 (請參閱上文中的 PG_AVAILABILITY 和 PG_DEGRADED)。您可使用以下指令手動對標記為清理的 PG 啟動整理:

cephuser@adm > ceph pg scrub pgid
PG_NOT_DEEP_SCRUBBED

最近未深層整理 (請參閱第 17.6 節 「整理放置群組」) 一或多個 PG。系統通常每 osd_deep_scrub_interval 秒整理一次 PG,當 mon_warn_not_deep_scrubbed 秒已過但未進行整理時,就會觸發此警告。如果 PG 未標記為清理,系統將不會 (深層) 整理它們。如果 PG 放置錯誤或已降級,就會出現這種情況 (請參閱上文中的 PG_AVAILABILITY 和 PG_DEGRADED)。您可使用以下指令手動對標記為清理的 PG 啟動整理:

cephuser@adm > ceph pg deep-scrub pgid
提示
提示

如果之前為您的組態或金鑰圈指定了非預設位置,則此時可以指定它們的位置:

root # ceph -c /path/to/conf -k /path/to/keyring health

12.3 檢查叢集的使用率統計資料

若要檢視叢集的資料使用率以及資料在多個池之間的分佈,請使用 ceph df 指令。若要獲取更多詳細資料,請使用 ceph df detail

cephuser@adm > ceph df
--- RAW STORAGE ---
CLASS  SIZE    AVAIL   USED     RAW USED  %RAW USED
hdd    30 GiB  27 GiB  121 MiB   3.1 GiB      10.40
TOTAL  30 GiB  27 GiB  121 MiB   3.1 GiB      10.40

--- POOLS ---
POOL                   ID  STORED   OBJECTS  USED     %USED  MAX AVAIL
device_health_metrics   1      0 B        0      0 B      0    8.5 GiB
cephfs.my_cephfs.meta   2  1.0 MiB       22  4.5 MiB   0.02    8.5 GiB
cephfs.my_cephfs.data   3      0 B        0      0 B      0    8.5 GiB
.rgw.root               4  1.9 KiB       13  2.2 MiB      0    8.5 GiB
myzone.rgw.log          5  3.4 KiB      207    6 MiB   0.02    8.5 GiB
myzone.rgw.control      6      0 B        8      0 B      0    8.5 GiB
myzone.rgw.meta         7      0 B        0      0 B      0    8.5 GiB

輸出中的 RAW STORAGE 區段提供叢集用於資料的儲存空間容量綜覽。

  • CLASS:裝置的儲存類別。如需裝置類別的更多詳細資料,請參閱第 17.1.1 節 「裝置類別」

  • SIZE:叢集的整體儲存容量。

  • AVAIL:叢集中的可用空間容量。

  • USED:單純為區塊裝置中儲存的資料物件配置的空間 (所有 OSD 上的累計空間)。

  • RAW USED:「USED」空間與區塊裝置上為實現 Ceph 而配置/保留的空間 (例如 BlueStore 的 BlueFS 部分) 之和。

  • % RAW USED:已用的原始儲存量百分比。將此數字與 full rationear full ratio 結合使用,可確保您不會用完叢集的容量。如需其他詳細資料,請參閱第 12.8 節 「儲存容量」

    注意
    注意:叢集填滿程度

    當原始儲存填滿層級接近 100% 時,您需要新增新儲存空間至叢集。較高的使用量可能導致單個 OSD 填滿,叢集處於不良狀態。

    使用指令 ceph osd df tree 可列出所有 OSD 的填滿程度。

輸出內容的 POOLS 區段提供了池清單和每個池的理論使用量。此區段的輸出反映複本、複製品或快照。例如,如果您儲存含 1MB 資料的物件,理論使用量將是 1MB,但是根據複本、複製品或快照數量,實際使用量可能是 2MB 或更多。

  • POOL:池的名稱。

  • ID:池 ID。

  • STORED:使用者儲存的資料量。

  • OBJECTS:每個池的理論已儲存物件數。

  • USED:所有 OSD 節點單純為儲存資料配置的空間容量 (以 kB 計)。

  • %USED:每個池的理論已用儲存百分比。

  • MAX AVAIL:給定池中的最大可用空間。

注意
注意

POOLS 區段中的數字是理論上的。它們不包括複本、快照或複製品數量。因此,USED 與 %USED 數量之和不會加總到輸出內容 RAW STORAGE 區段中的 RAW USED%RAW USED 數量中。

12.4 檢查 OSD 狀態

您可透過執行以下指令來檢查 OSD,以確定它們已啟動且正在執行:

cephuser@adm > ceph osd stat

cephuser@adm > ceph osd dump

您也可以根據 OSD 在 CRUSH 地圖中的位置檢視 OSD。

ceph osd tree 將列印 CRUSH 樹及主機、它的 OSD、OSD 是否已啟動及其權數:

   cephuser@adm > ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME              STATUS  REWEIGHT  PRI-AFF
-1      3  0.02939  root default
-3      3  0.00980    rack mainrack
-2      3  0.00980            host osd-host
0       1  0.00980                    osd.0   up   1.00000   1.00000
1       1  0.00980                    osd.1   up   1.00000   1.00000
2       1  0.00980                    osd.2   up   1.00000   1.00000

12.5 檢查填滿的 OSD

Ceph 可阻止您向填滿的 OSD 寫入資料,以防遺失資料。在正常運作的叢集中,當叢集接近其填滿比率時,您會收到警告。mon osd full ratio 預設設為容量的 0.95 (95%),達到該比率後,叢集會阻止用戶端寫入資料。mon osd nearfull ratio 預設設為容量的 0.85 (85%),達到該比率時,叢集會產生狀態警告。

可透過 ceph health 指令報告填滿的 OSD 節點:

cephuser@adm > ceph health
  HEALTH_WARN 1 nearfull osds
  osd.2 is near full at 85%

cephuser@adm > ceph health
  HEALTH_ERR 1 nearfull osds, 1 full osds
  osd.2 is near full at 85%
  osd.3 is full at 97%

處理填滿的叢集的最佳方法是新增新的 OSD 主機/磁碟,以便讓叢集將資料重新分佈到新的可用儲存空間。

提示
提示:防止 OSD 填滿

OSD 變滿 (即用完 100% 的磁碟空間) 之後,往往會迅速當機而不發出警告。管理 OSD 節點時需記住下面幾點提示。

  • 每個 OSD 的磁碟空間 (通常掛接於 /var/lib/ceph/osd/osd-{1,2..} 下) 需放置在專屬的基礎磁碟或分割區上。

  • 檢查 Ceph 組態檔案,確定 Ceph 不會將其記錄檔案儲存在專供 OSD 使用的磁碟/分割區上。

  • 確定沒有其他程序寫入專供 OSD 使用的磁碟/分割區。

12.6 檢查監控程式狀態

啟動叢集後,請在第一次讀取和/或寫入資料之前檢查 Ceph 監控程式的仲裁狀態。如果叢集已在處理要求,請定期檢查 Ceph 監控程式的狀態,以確定其正在執行。

若要顯示監控程式地圖,請執行以下指令:

cephuser@adm > ceph mon stat

cephuser@adm > ceph mon dump

若要檢查監控程式叢集的仲裁狀態,請執行以下指令:

cephuser@adm > ceph quorum_status

Ceph 將傳回仲裁狀態。例如,由三個監控程式組成的 Ceph 叢集可能傳回以下內容:

{ "election_epoch": 10,
  "quorum": [
        0,
        1,
        2],
  "monmap": { "epoch": 1,
      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
      "modified": "2011-12-12 13:28:27.505520",
      "created": "2011-12-12 13:28:27.505520",
      "mons": [
            { "rank": 0,
              "name": "a",
              "addr": "192.168.1.10:6789\/0"},
            { "rank": 1,
              "name": "b",
              "addr": "192.168.1.11:6789\/0"},
            { "rank": 2,
              "name": "c",
              "addr": "192.168.1.12:6789\/0"}
           ]
    }
}

12.7 檢查放置群組狀態

放置群組會將物件對應到 OSD。監控放置群組時,您希望它們處於 activeclean 狀態。如需詳細內容,請參閱第 12.9 節 「監控 OSD 和放置群組」

12.8 儲存容量

做為防止資料遺失的安全措施,當 Ceph 儲存叢集接近其容量上限時,Ceph 將阻止您向 Ceph OSD 寫入或從中讀取資料。因此,讓生產叢集接近其填滿比率不是一種好的做法,因為這樣會犧牲高可用性。預設的填滿比率設定為 0.95,即容量的 95%。對於所含 OSD 數量較少的測試叢集而言,如此設定是非常激進的。

提示
提示:增加儲存容量

在監控叢集時,請注意與 nearfull 比率相關的警示。出現該警示表示,如果一或多個 OSD 發生故障,某些 OSD 的故障可能會導致服務暫時中斷。請考慮新增更多 OSD 以增加儲存容量。

測試叢集的一種常見情境是,系統管理員從 Ceph 儲存叢集中移除 Ceph OSD,等待叢集重新達到平衡。然後再移除另一個 Ceph OSD,依此類推,直至叢集最終達到填滿比率並鎖死。我們建議即使使用測試叢集時也進行一定的容量規劃。透過規劃,您可以預估維持高可用性所需的備用容量。從理論上講,您需要規劃能夠應對一系列 Ceph OSD 發生故障的情況的方案,使叢集無需立即取代這些 Ceph OSD 也可復原到 active + clean 狀態。您可以執行 active + degraded 狀態的叢集,但這不適合正常運作狀態。

下圖展示了一個包含 33 個 Ceph 節點的簡化 Ceph 儲存叢集,其中每個主機有一個 Ceph OSD,每個 Ceph OSD 從 3 TB 磁碟機讀取以及向其中寫入資料。此範例叢集實際的容量上限為 99 TB。mon osd full ratio 選項設定為 0.95。如果叢集的剩餘容量降至 5 TB,叢集將不允許用戶端讀取和寫入資料。因此,儲存叢集的運作容量為 95 TB,而不是 99 TB。

Ceph 叢集
圖 12.1︰ Ceph 叢集

在這樣的叢集中,有一或兩個 OSD 發生故障屬於正常現象。一種不常發生但合乎常理的情況是機架的路由器或電源發生故障,導致多個 OSD (例如 OSD 7-12) 同時停機。在這種情況下,您仍然應該設法使叢集保持正常執行並達到 active + clean 狀態,即使這表示需要立即新增一些主機及額外的 OSD。如果容量使用率過高,您可能不會遺失資料。但是,如果叢集的容量使用率超過填滿比率,您雖然解決了故障網域內發生的中斷問題,卻可能會損失資料可用性。因此,我們建議至少進行大致的容量規劃。

針對您的叢集確定以下兩個數值:

  1. OSD 的數量。

  2. 叢集的總容量。

如果您將叢集的總容量除以叢集中的 OSD 數量,將得到叢集內單個 OSD 的平均容量。將該數值與您預期正常運作期間將同時發生故障的 OSD 數量 (一個相對較小的數值) 相乘。最後,將叢集容量與填滿比率相乘得到運作容量上限。然後,減去您預期將發生故障的 OSD 中的資料量,即可得到一個合理的填滿比率。使用更高的 OSD 故障數 (整個機架的 OSD) 重複上述過程,即可得到一個合理的接近填滿比率數值。

以下設定僅在建立叢集時適用,隨後會儲存在 OSD 地圖中:

[global]
 mon osd full ratio = .80
 mon osd backfillfull ratio = .75
 mon osd nearfull ratio = .70
提示
提示

這些設定僅在建立叢集時適用。此後,需要使用 ceph osd set-nearfull-ratioceph osd set-full-ratio 指令在 OSD 地圖中變更這些設定。

mon osd full ratio

在將 OSD 視為已滿之前使用的磁碟空間百分比。預設值為 0.95

mon osd backfillfull ratio

在將 OSD 視為過滿而無法回填之前使用的磁碟空間百分比。預設值為 0.90

mon osd nearfull ratio

在將 OSD 視為將滿之前使用的磁碟空間百分比。預設值為 0.85

提示
提示:檢查 OSD 權數

如果某些 OSD 將滿,但其他 OSD 的容量充足,則表示將滿 OSD 的 CRUSH 權數可能有問題。

12.9 監控 OSD 和放置群組

高可用性和高可靠性要求採用容錯方法來管理硬體和軟體問題。Ceph 沒有單一故障點,並且可以在「已降級」模式下處理資料要求。Ceph 的資料放置引入了一個間接層,以確定資料不會直接結合至特定 OSD 位址。這表示追蹤系統故障原因需要找到屬於問題根源的放置群組和基礎 OSD。

提示
提示:發生故障時的存取

如果叢集的某個組件發生故障,叢集可能會阻止您存取某個特定物件,但這並不表示您無法存取其他物件。遇到故障時,請執行相關步驟來監控 OSD 和放置群組。然後開始進行疑難排解。

Ceph 一般情況下會進行自我修復。但如果問題仍然存在,監控 OSD 和放置群組將有助於您找到問題所在。

12.9.1 監控 OSD

OSD 可能處於在叢集內 (「in」) 狀態,也可能處於在叢集外 (「out」) 狀態。同時,它也可能處於啟用並執行中 (「up」) 或 停機且未執行 (「down」) 狀態。如果某個 OSD 處於「up」狀態,則它可能在叢集內 (您可以讀取和寫入資料),也可能在叢集外。如果該 OSD 之前在叢集內,最近已移出叢集,則 Ceph 會將放置群組移轉至其他 OSD。如果某個 OSD 在叢集外,CRUSH 將不會為其指定放置群組。如果某個 OSD 處於「down」狀態,則它應該也處於「out」狀態。

注意
注意:狀況不良狀態

如果某個 OSD 處於「down」和「in」狀態,則表示存在問題,並且叢集將處於狀況不良狀態。

如果您執行 ceph healthceph -sceph -w 等指令,可能會注意到叢集並非永遠回應 HEALTH OK。對於 OSD,您應當預期叢集在以下情況下不會回應 HEALTH OK

  • 您尚未啟動叢集 (它不會回應)。

  • 您已啟動或重新啟動叢集,但它尚未準備就緒,因為系統正在建立放置群組,並且 OSD 正在互聯。

  • 您已新增或移除某個 OSD。

  • 您已修改叢集地圖。

監控 OSD 的一個重要目的是確定當叢集已啟用且在執行時,叢集中的所有 OSD 也已啟用且在執行。若要確定是否所有 OSD 都在執行,請執行以下指令:

root # ceph osd stat
x osds: y up, z in; epoch: eNNNN

結果應顯示 OSD 總數 (x)、處於「up」狀態的 OSD 數量 (y)、處於「in」狀態的 OSD 數量 (z),以及地圖版本編號 (eNNNN)。如果在叢集內 (「in」) 的 OSD 數量大於處於「up」狀態的 OSD 數量,請執行以下指令來確定未在執行的 ceph-osd 精靈:

root # ceph osd tree
#ID CLASS WEIGHT  TYPE NAME             STATUS REWEIGHT PRI-AFF
-1       2.00000 pool openstack
-3       2.00000 rack dell-2950-rack-A
-2       2.00000 host dell-2950-A1
0   ssd 1.00000      osd.0                up  1.00000 1.00000
1   ssd 1.00000      osd.1              down  1.00000 1.00000

例如,如果 ID 為 1 的 OSD 處於停機狀態,請將其啟動:

cephuser@osd > sudo systemctl start ceph-CLUSTER_ID@osd.0.service

對於與已停止或不會重新啟動的 OSD 相關的問題,請參閱第 4.3 節 「OSDs not running」

12.9.2 指定放置群組集

CRUSH 向 OSD 指定放置群組時,會查看池的複本數量,然後再為 OSD 指定放置群組,以便將每個放置群組複本都指定給不同的 OSD。例如,如果池需要三個放置群組複本,CRUSH 可能會將這三個複本分別指定給 osd.1osd.2osd.3。CRUSH 實際上會尋找一種虛擬隨機放置方法,這種方法會將您在 CRUSH 地圖中設定的故障網域納入考量,因此在大型叢集中,您很少會看到放置群組指定給最鄰近的 OSD 的情況。我們將應包含特定放置群組的複本的 OSD 集稱為在任集。在某些情況下,在任集中的 OSD 會處於停機狀態,或者無法處理要存取放置群組中的物件的要求。當以下其中一種情況發生時,可能會出現這些情況:

  • 您新增或移除了某個 OSD。CRUSH 隨後會將放置群組重新指定給其他 OSD,因而變更了在任集的組成部分,導致系統透過「回填」程序移轉資料。

  • 某個 OSD 之前處於「down」狀態、之前進行了重新啟動,而現在正在復原。

  • 在任集中的某個 OSD 處於「down」狀態,或者無法處理要求,並且另一個 OSD 已暫代其職。

    Ceph 使用啟用集來處理用戶端要求,啟用集是實際處理要求的 OSD 集。在大多數情況下,啟用集在任集幾乎完全相同。當兩者不同時,可能表示 Ceph 正在移轉資料、某個 OSD 正在復原,或者叢集存在問題 (例如,在此類情況下,Ceph 通常會回應 HEALTH WARN 狀態及「stuck stale」訊息)。

若要擷取放置群組清單,請執行以下指令:

cephuser@adm > ceph pg dump

若要檢視哪些 OSD 在給定放置群組的在任集啟用集內,請執行以下指令:

cephuser@adm > ceph pg map PG_NUM
osdmap eNNN pg RAW_PG_NUM (PG_NUM) -> up [0,1,2] acting [0,1,2]

結果應該會顯示 OSD 地圖版本編號 (eNNN)、放置群組數量 (PG_NUM)、啟用集 (「up」) 中的 OSD,以及在任集 (「acting」) 中的 OSD:

提示
提示:叢集問題指示器

如果啟用集在任集不相符,則可能表示叢集正在自行重新平衡,或者叢集可能存在問題。

12.9.3 建立互聯

放置群組必須處於 activeclean 狀態,您才能將資料寫入其中。為了讓 Ceph 確定某個放置群組的目前狀態,該放置群組的主 OSD (在任集中的第一個 OSD) 會與第二個和第三個 OSD 建立互聯,以便就放置群組的目前狀態達成一致 (假設池中包含三個放置群組複本)。

互聯綱要
圖 12.2︰ 互聯綱要

12.9.4 監控放置群組狀態

如果您執行 ceph healthceph -sceph -w 等指令,可能會注意到叢集並非永遠回應 HEALTH OK 訊息。檢查 OSD 是否正在執行之後,還應檢查放置群組狀態。

在一些與放置群組互聯相關的情況下,叢集預期將不會回應 HEALTH OK

  • 您已建立池,並且放置群組尚未互聯。

  • 放置群組正在復原。

  • 您已向叢集新增了 OSD,或已從叢集中移除了 OSD。

  • 您已修改 CRUSH 地圖,並且您的放置群組正在移轉。

  • 在不同的放置群組複本中存在資料不一致的情況。

  • Ceph 正在整理放置群組的複本。

  • Ceph 的儲存容量不足,無法完成回填操作。

如果上述其中一種情況導致 Ceph 回應 HEALTH WARN,請不要驚慌。叢集在許多情況下都會自行復原。在有些情況下,您可能需要採取措施。監控放置群組的一個重要目的是要確定當叢集已啟用且在執行時,所有放置群組都處於「active」狀態,並且最好處於「clean」狀態。若要查看所有放置群組的狀態,請執行以下指令:

cephuser@adm > ceph pg stat
x pgs: y active+clean; z bytes data, aa MB used, bb GB / cc GB avail

結果應該會顯示放置群組總數 (x)、處於特定狀態 (例如「active+clean」) 的放置群組數量 (y),以及儲存的資料量 (z)。

除了放置群組狀態之外,Ceph 還會回應使用的儲存容量 (aa)、剩餘的儲存容量 (bb),以及放置群組的總儲存容量。在以下情況下,這些數值可能非常重要:

  • 已達到 near full ratiofull ratio

  • 由於您的 CRUSH 組態中存在錯誤,您的資料未在叢集中分佈。

提示
提示:放置群組 ID

放置群組 ID 由池編號 (並非池名稱) 加一個句點 (.)和放置群組 ID (一個十六進位數) 組成。您可以在 ceph osd lspools 的輸出中檢視池編號及其名稱。例如,預設池 rbd 與池編號 0 對應。完全合格的放置群組 ID 的格式如下:

POOL_NUM.PG_ID

通常顯示如下:

0.1f

若要擷取放置群組清單,請執行以下指令:

cephuser@adm > ceph pg dump

您還可以將輸出內容設定為 JSON 格式,並將其儲存到檔案中:

cephuser@adm > ceph pg dump -o FILE_NAME --format=json

若要查詢特定的放置群組,請執行以下指令:

cephuser@adm > ceph pg POOL_NUM.PG_ID query

以下清單詳細說明了常見的放置群組狀態。

CREATING (建立中)

當您建立池時,Ceph 會建立您指定數量的放置群組。Ceph 會在建立一或多個放置群組時回應「creating」。建立放置群組之後,屬於放置群組在任集的各 OSD 將會互聯。完成互聯程序時,放置群組狀態應該為「active+clean」,這表示 Ceph 用戶端可以開始向放置群組寫入資料。

放置群組狀態
圖 12.3︰ 放置群組狀態
PEERING (正在互聯)

當 Ceph 在對放置群組執行互聯操作時,會在儲存放置群組複本的各 OSD 之間就該放置群組中物件和中繼資料的狀態達成一致。當 Ceph 完成互聯程序時,便表示儲存放置群組的各 OSD 之間就放置群組的目前狀態達成一致。不過,完成互聯程序並表示每個複本都有最新的內容。

注意
注意:權威歷程

在任集的所有 OSD 都持續進行寫入操作之前,Ceph 將不會向用戶端確認寫入操作。這樣做可確保在上次成功互聯之後,至少有一個在任集成員將擁有每個確認的寫入操作的記錄。

透過準確記錄每個確認的寫入操作,Ceph 可以建構並擴充一個新的權威放置群組歷程,即一個完整且完全有序的操作集,如果執行該操作集,會將 OSD 的放置群組複本更新至最新狀態。

ACTIVE (使用中)

當 Ceph 完成互聯程序時,放置群組可能會變為 active 狀態。active 狀態表示一般可在主放置群組和複本中使用放置群組中的資料來進行讀取和寫入操作。

CLEAN (正常)

如果放置群組處於 clean 狀態,則表示主 OSD 和複本 OSD 已成功互聯,並且該放置群組沒有流浪複本。Ceph 已將放置群組中的所有物件複製正確的次數。

DEGRADED (已降級)

當用戶端將物件寫入主 OSD 時,該主 OSD 負責將複本寫入複本 OSD。主 OSD 將物件寫入儲存空間之後,放置群組將保持「degraded」狀態,直至主 OSD 收到了複本 OSD 傳送的 Ceph 已成功建立複本物件的確認訊息。

放置群組有可能處於「active+degraded」狀態,這是因為即使 OSD 尚未儲存所有物件,它也可能處於「active」狀態。如果某個 OSD 變成停機狀態,Ceph 會將指定給該 OSD 的每個放置群組都標示為「degraded」。當該 OSD 恢復啟用狀態後,各 OSD 必須再次互聯。不過,如果某個已降級放置群組處於「active」狀態,用戶端仍然可以將新物件寫入該放置群組。

如果某個 OSD 處於「down」狀態,並且持續保持「degraded」狀況,Ceph 可能會將該停機的 OSD 標示為「out」(表示移出叢集),並將停機 (「down」) 的 OSD 的資料重新對應至另一個 OSD。透過 mon osd down out interval 選項來控制從將 OSD 標示為「down」到將其標示為「out」相隔的時間,該選項預設設定為 600 秒。

放置群組也可能處於「degraded」狀態,當 Ceph 找不到應在放置群組中的一或多個物件時,便會發生此情況。雖然您無法讀取未找到的物件或向其寫入資料,卻仍然可以存取「degraded」狀態的放置群組中的所有其他物件。

RECOVERING (正在復原)

Ceph 設計用於在發生硬體和軟體問題時進行大規模容錯。當 OSD 變成「down」狀態時,其內容可能落後於放置群組中其他複本的目前狀態。當 OSD 恢復「up」狀態時,必須更新放置群組的內容,以反映最新狀態。在此期間,OSD 可能會顯現出「recovering」狀態。

復原並非永遠都是無足輕重的,因為硬體故障可能會導致多個 OSD 發生串聯故障。例如,一個機架或機櫃的網路交換器可能會發生故障,這可能會導致一些主機的 OSD 落後於叢集的目前狀態。解決故障之後,必須復原每個 OSD。

Ceph 提供了一些設定,用來平衡新服務要求與復原資料物件並將放置群組還原到最新狀態的需求之間的資源爭用。osd recovery delay start 設定允許 OSD 在啟動復原程序之前重新啟動、重新互聯,甚至處理一些重播要求。osd recovery thread timeout 用於設定線串逾時,因為有可能會有多個 OSD 交錯發生故障、重新啟動以及重新互聯。osd recovery max active 設定用於限制 OSD 將同時處理的復原要求數,以防止 OSD 無法處理要求。osd recovery max chunk 設定用於限制復原的資料區塊大小,以避免出現網路阻塞。

BACK FILLING (正在回填)

當新 OSD 加入叢集時,CRUSH 會將叢集中 OSD 的放置群組重新指定給新增的 OSD。強制新 OSD 立即接受重新指定的放置群組可能會使新 OSD 過載。向 OSD 回填放置群組可讓此程序在背景中開始。完成回填後,新 OSD 將在準備就緒時開始處理要求。

在執行回填操作期間,系統可能會顯示以下其中一種狀態:「backfill_wait」表示回填操作待處理,但尚未進行;「backfill」表示正在進行回填操作;「backfill_too_full」表示已要求進行回填操作,但由於儲存容量不足而無法完成。如果無法回填某個放置群組,則可能會將其視為「incomplete」。

Ceph 提供了一些設定來管理與向某個 OSD (尤其是新 OSD) 重新指定放置群組有關的負載。osd max backfills 預設將向或從一個 OSD 同時進行的最大回填數設定為 10。backfill full ratio 允許 OSD 在接近其填滿比率 (預設為 90%) 時拒絕回填要求,並使用 ceph osd set-backfillfull-ratio 指令進行變更。如果某個 OSD 拒絕回填要求,osd backfill retry interval 可讓 OSD 重試要求 (預設在 10 秒後)。OSD 還可以設定 osd backfill scan minosd backfill scan max,以管理掃描間隔 (預設值分別為 64 和 512)。

REMAPPED (已重新對應)

當用於處理放置群組的在任集發生變化時,資料會從舊在任集移轉至新在任集。新主 OSD 可能需要一段時間才能處理要求。因此,新主 OSD 可能會要求舊主 OSD 繼續處理要求,直至放置群組移轉完成。資料移轉完成時,對應將使用新在任集的主 OSD。

STALE (過時)

儘管 Ceph 使用活動訊號來確定主機和精靈正在執行,但 ceph-osd 精靈也可能會卡住,無法及時報告統計資料 (例如,當發生暫時的網路故障時)。依預設,OSD 精靈每半秒鐘 (0.5) 報告一次其放置群組、開機及故障統計資料,這個頻率高於活動訊號閾值。如果某個放置群組在任集的主 OSD 未能向監控程式報告,或者其他 OSD 已將該主 OSD 報告為「down」,則監控程式會將該放置群組標示為「stale」。

當您啟動叢集後,叢集常常會在互聯程序完成之前顯示為「stale」狀態。叢集執行一段時間之後,如果放置群組顯示為「stale」狀態,則表示這些放置群組的主 OSD 處於停機狀態,或者未向監控程式報告放置群組統計資料。

12.9.5 尋找物件位置

若要在 Ceph 物件儲存中儲存物件資料,Ceph 用戶端需要設定物件名稱並指定相關的池。Ceph 用戶端會擷取最新的叢集地圖,並且 CRUSH 演算法會計算如何將物件對應至放置群組,然後計算如何以動態方式將該放置群組指定給 OSD。若要尋找物件位置,您只需知道物件名稱和池名稱。例如:

cephuser@adm > ceph osd map POOL_NAME OBJECT_NAME [NAMESPACE]
範例 12.1︰ 尋找物件

做為範例,我們來建立一個物件。在指令行上使用 rados put 指令指定物件名稱「test-object-1」、包含一些物件資料的範例檔案「testfile.txt」的路徑,以及池名稱「data」。

cephuser@adm > rados put test-object-1 testfile.txt --pool=data

若要確認 Ceph 物件儲存是否已儲存物件,請執行以下指令:

cephuser@adm > rados -p data ls

現在,我們來確定物件位置。Ceph 將會輸出物件的位置:

cephuser@adm > ceph osd map data test-object-1
osdmap e537 pool 'data' (0) object 'test-object-1' -> pg 0.d1743484 \
(0.4) -> up ([1,0], p0) acting ([1,0], p0)

若要移除範例物件,只需使用 rados rm 指令將其刪除:

cephuser@adm > rados rm test-object-1 --pool=data