Ceph 細節原理
OSD daemon
osd daemon 狀態: 默認每2s匯報自己的狀態給monitor (同時監控組內其他OSD狀態)
up:可以提供IOdown:不能提供IOin:有數據out:沒有數據
PG 的概念
epoach: 單調遞增的版本號,用於數據校驗使用acting set: OSD 列表,第一個為primary OSD,其余的為replicated OSDPG tmp:當主OSD故障后,monitor通過CRUSH找一個OSD頂替,但此OSD中沒有數據,會在副本OSD中臨時當做主的,就是此狀態
當新調過來的主OSD數據同步完成后,恢復正常狀態up set: 是acting set過去版本,是出現PG tmp后,以前的一個版本
PG 中 OSD 組長是如何建立的
如在 副本數為 3 的配置中,一個
PG中 包含 三個OSD daemon,也就是三塊硬盤,其中一個是master,剩下兩個是副本;
PG 和 OSD daemon 之間的關系,是通過 CRUSH 算法得出的;常規這三個 OSD daemon 可以在一台機器上,也可以在不同機器上;那么根據 CRUSH 算法會盡可能的保證一個平衡,就是不在同一個機器上;畢竟Ceph中的數據是一個為平衡的狀態,一切都是通過CRUSH 算法來實現的數據平衡;
而 PG 本身是個有序列表,位於第一的位置是 master;這個列表的產生是由 monitor 來產生的;
- 在
monitor節點上會運行一個叫PG monitor的進程; - 定時檢索整個集群中是否存在新建的存儲池
pool(這個存儲池其實就一個一堆 PG 的集合); - 當發現新的
存儲池時,會繼續檢查存儲池中的 PG 狀態; - 檢查出PG的狀態為新狀態(待創建),該PG會進入一個
creating的狀態,會把該PG放到創建隊列中 - 之后
monitor再根據CRUSH算法 計算得出 PG 中包含的三個OSD daemon同時算出組長; - 此時
monitor會把剛剛計算出來的所有PG、OSD daemon的信息直接發給組長; PG中的OSD daemon組長收到信息后,此時組員之間的就知道彼此,這個過程叫做peering建立連接;- 最終生成
PG
由以上步驟看出,PG 實際是個邏輯單位,PG 的信息保存在 crush map 和 OSD daemon 中。
PG 的狀態
ceph -s 命令查看
creating: 正在創建的狀態peering: PG內OSD內相互認知的狀態active: PG內OSD相互認識后,就會處於此狀態,能寫數據,但PG內的OSD相互數據並沒有同步clean:PG內的的OSD能寫數據,並且所有的OSD的數據已同步stable:PG 內有OSD在 2s內沒有匯報自己的狀態給monitorbackfilling:一個新的OSD被加入到PG組內,正在做全量的數據拷貝recovery:同PG組內一個OSD與主OSD的數據存在差異被檢測出來,會被改為此狀態,同時進行數據同步
stable 狀態說明:
monitor一旦發現OSD daemon沒有匯報狀態,會立即把此OSD daemon對應的PG組,標記為stable;
表示該 PG 組內有OSD daemon在2s中沒有匯報狀態;如果在300s內OSD daemon還沒有匯報狀態,此OSD daemon就會被踢出 對應的PG組;
被踢出后,PG組內的副本數就變少了,monitor又會使用CRUSH算法重新加入一個新的OSD daemon加入到PG組中
PG 內 OSD 的數據校驗方式
- HASH 校驗,同PG下的OSD數據進行HASH比較,副本OSD會跟主OSD比較,有區別就會同步主OSD的數據
- 版本號校驗,同PG下的OSD數據每次同步時,都會產生一個版本號,當版本號有差異時,會同步數據
- 數據大小
SIZE的比較,同PG下的OSD數據直接比較大小,有差異的副本OSD就會同步主OSD的數據
pool:存儲池
提供的功能:
- PG 的邏輯集合
- 副本數,提供數據冗余性
- CRUSH 規則,PG 是如何 發現 OSD 的
- 存儲池存在用戶權限
pool 類型:
- 復制類型 一個 PG 中 有多個 OSD
- 糾錯碼類型 分為 k 個 數據塊、M個編碼快,然后進行存放,沒有一個數據存放多份
缺點:1.速度慢 2. 不支持Ceph 所有的操作 ,如:在數據清理是,不支持局部鎖定清理的功能
