Ceph 細節原理
OSD daemon
osd daemon 狀態: 默認每2s匯報自己的狀態給monitor (同時監控組內其他OSD狀態)
up
:可以提供IOdown
:不能提供IOin
:有數據out
:沒有數據
PG 的概念
epoach
: 單調遞增的版本號,用於數據校驗使用acting set
: OSD 列表,第一個為primary OSD
,其余的為replicated OSD
PG 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 所有的操作 ,如:在數據清理是,不支持局部鎖定清理的功能