【osd】ceph讀寫流程
阿新 • • 發佈:2021-12-10
概述
OSD是RADOS叢集的基本儲存單元。
PG(placement group)從名字可理解為放置策略組,它是物件的集合,該集合裡的所有物件都具有相同的放置策略:物件的副本都分佈在相同的OSD列表上。一個物件只能屬於一個PG,一個PG對應於放置在其上的OSD列表。一個OSD上可以分佈多個PG。處理來自客戶端的讀寫請求是PG的基本功能。
Pool是整個叢集層面定義的一個邏輯的儲存池,它規定了資料冗餘的型別以及對應的副本分佈策略。目前實現了兩種pool型別:replicated型別和Erasure Code型別。一個pool由多個PG構成。
讀寫流程
讀寫流程大致分為以下幾個階段:
- 客戶端基於物件標識中的32位雜湊值,通過stable_mod找到儲存池中承載該物件的PGID,然後使用該PGID作為CRUSH輸入,找到對應PG當前Primary所在的OSD併發送讀寫請求。
- OSD收到客戶端傳送的讀寫請求,將其封裝為一個op,並基於其攜帶的PGID將其轉發至對應的PG。
- PG收到op後,完成一些列檢查,所有條件均滿足後,開始真正執行op。
- 如果op只包含讀操作,那麼直接執行同步讀(對應多副本)或者非同步讀(對應糾刪碼),等待讀操作完成後由Primary向客戶端應答。
- 如果op包含寫操作,則由Primary基於op生成一個針對原始物件操作的PG事務,然後將其提交至PGBackend,由後者按照備份策略轉化為每個副本真正需要執行的本地事務,並進行分發。當Primary收到所有副本的寫入完成應答之後,對應op執行完成,由Primary向客戶端迴應寫入完成。
物件定址
物件定址參考client寫操作部分。
訊息接收與分發
讀寫請求都是從OSD::ms_fast_dispatch開始,它是接收讀寫訊息message的入口。
訊息出隊處理
do_request
主要進行PG級別的檢查,處理流程:
do_op
主要進行物件級別的檢查和一些上下文的準備工作。處理流程:
execute_ctx
prerare_transaction操作主要分為三個階段:
- 通過do_osd_ops生成原始op對應的PG事務。
- 如果op針對head物件操作通過make_writeable檢查是否需要預先執行克隆操作。
- 通過finish_ctx生成操作原始物件的日誌,並更新物件的OI和SS屬性。
do_osd_ops:
對於讀操作,在do_osd_ops()->do_read()中,如果是同步讀直接呼叫pgbackend->objects_read_sync進行讀操作。如果是非同步讀,先將op新增到pending_async_reads中,然後在execute_ctx()檢測pending_async_reads佇列時執行讀操作。
寫操作步驟如下:
make_writeable:
如果op針對head物件操作,通過make_writeable檢查是否需要預先執行克隆操作。
finish_ctx:
PG事務的記憶體版本已經準備完畢,此時可以生成原始物件的操作日誌,並更新物件上下文中OI與SS屬性。