Pg和pgp的含義:
PG是指定存儲池存儲對象的目錄有多少個,PGP是存儲池PG的OSD分布組合個數
PG的增加會引起PG內的數據進行分裂,分裂到相同的OSD上新生成的PG當中
PGP的增加會引起部分PG的分布進行變化,但是不會引起PG內對象的變動
存儲池pg的計算:
Pg數量=(osd數量*200)/副本數
例子 1:創建存儲池時,有 10 個硬盤,副本數為 2。
PgNumBase = (10 * 200) / 2 = 1000,找到的 N 為 9,即 29 < 1000 < 210 ,因為 1000 > ( 29 * 1.25 ),所以最后得到 PgNum = 1024。
例子 2:創建存儲池時,有 9 個硬盤,副本數為 3。
PgNumBase = (9 * 200) / 3 = 600,找到的 N 為 9,即 29 < 600 < 210 ,因為 600 <= ( 29 * 1.25 ),所以最后得到的 PgNum = 512。
Pg的角色
正常情況下同一個pg所有的實例保存的內容完全相同,原則上不需要對它們的身份加以區分,但是出於數據一致性考慮,仍然需要從中選出一個起主導作用的實例,稱為Primary,由其作為集中點對所有任務進行統籌管理。Primary之外的實例統稱為Replica(副本),所有的寫操作都是寫道primary完后再由主傳遞到其他的副本。這樣能夠保證數據的一致性
Pg的常見狀態
狀態 |
描述 |
Activating |
Peering即將完成,PG正在等待所有PG實例同步並固化Peering的結果(Info、Log等) |
Active |
PG可以正常處理來自客戶端的讀寫請求 |
Backfilling |
正在后台填充態。 backfill是recovery的一種特殊場景,指peering完成后,如果基於當前權威日志無法對Up Set當中的某些PG實例實施增量同步(例如承載這些PG實例的OSD離線太久,或者是新的OSD加入集群導致的PG實例整體遷移) 則通過完全拷貝當前Primary所有對象的方式進行全量同步 |
Backfill-toofull |
某個需要被Backfill的PG實例,其所在的OSD可用空間不足,Backfill流程當前被掛起 |
Backfill-wait |
等待Backfill 資源預留 |
Clean |
PG當前不存在待修復的對象, Acting Set和Up Set內容一致,並且大小等於存儲池的副本數 |
Creating |
PG正在被創建 |
Deep |
PG正在或者即將進行對象一致性掃描清洗(Deep-Scrub) |
Degraded |
降級狀態。Peering完成后,PG檢測到任意一個PG實例存在不一致(需要被同步/修復)的對象,或者當前ActingSet 小於存儲池副本數 |
Down |
Peering過程中,PG檢測到某個不能被跳過的Interval中(例如該Interval期間,PG完成了Peering,並且成功切換至Active狀態,從而有可能正常處理了來自客戶端的讀寫請求),當前剩余在線的OSD不足以完成數據修復 |
Incomplete |
Peering過程中, 由於 a. 無非選出權威日志 b. 通過choose_acting選出的Acting Set后續不足以完成數據修復,導致Peering無非正常完成 |
Inconsistent |
不一致態。集群清理和深度清理后檢測到PG中的對象在副本存在不一致,例如對象的文件大小不一致或Recovery結束后一個對象的副本丟失 |
Peered |
Peering已經完成,但是PG當前ActingSet規模小於存儲池規定的最小副本數(min_size) |
Peering |
正在同步態。PG正在執行同步處理 |
Recovering |
正在恢復態。集群正在執行遷移或同步對象和他們的副本 |
Recovering-wait |
等待Recovery資源預留 |
Remapped |
重新映射態。PG活動集任何的一個改變,數據發生從老活動集到新活動集的遷移。在遷移期間還是用老的活動集中的主OSD處理客戶端請求,一旦遷移完成新活動集中的主OSD開始處理 |
Repair |
PG在執行Scrub過程中,如果發現存在不一致的對象,並且能夠修復,則自動進行修復狀態 |
Scrubbing |
PG正在或者即將進行對象一致性掃描 |
Unactive |
非活躍態。PG不能處理讀寫請求 |
Unclean |
非干凈態。PG不能從上一個失敗中恢復 |
Stale |
未刷新態。PG狀態沒有被任何OSD更新,這說明所有存儲這個PG的OSD可能掛掉, 或者Mon沒有檢測到Primary統計信息(網絡抖動) |
Undersized |
PG當前Acting Set小於存儲池副本數 |
Ceph pg map 1.6c //查看pg和osd的映射關系
Ceph pg 1.6c query //查看pg的詳細信息
Ceph pg scrub {pg-id} //清洗單個pg意思就是將這個pg中的數據和主pg同步達到數據一致性。
Ceph pg dump //查看pg的map
Ceph pg ls-by-osd 0 //指定osd.0查看pg的狀態
Ceph pg ls-by-pool mytest //指定mytest池查看pg的狀態
Ceph pg ls-by-primary osd.0 //指定osd.0查看主pg的狀態
如果pg的狀態一直卡在recovery_wait或backfill_wait這倆個狀態中
1、查看卡住PG的具體信息
# ceph pg $pgid query (重點關注recovery_state信息)
2、查看pg分布及各個分布osd上的資源預留情況
查看pg分布的osd
# ceph pg map $pgid
3、查看osd的資源預留情況(主要針對流控,涉及對端和本地)
# ceph daemon osd.$id dump_reservations
Local_reservations為本地資源預留信息,remote_reservations為遠端信息
可以通過手動觸發資源預留比如ceph osd down $id