1. 程式人生 > 其它 >【osd】ceph讀寫流程

【osd】ceph讀寫流程

概述

OSD是RADOS叢集的基本儲存單元。

PG(placement group)從名字可理解為放置策略組,它是物件的集合,該集合裡的所有物件都具有相同的放置策略:物件的副本都分佈在相同的OSD列表上。一個物件只能屬於一個PG,一個PG對應於放置在其上的OSD列表。一個OSD上可以分佈多個PG。處理來自客戶端的讀寫請求是PG的基本功能。

Pool是整個叢集層面定義的一個邏輯的儲存池,它規定了資料冗餘的型別以及對應的副本分佈策略。目前實現了兩種pool型別:replicated型別和Erasure Code型別。一個pool由多個PG構成。

讀寫流程

讀寫流程大致分為以下幾個階段:

  1. 客戶端基於物件標識中的32位雜湊值,通過stable_mod找到儲存池中承載該物件的PGID,然後使用該PGID作為CRUSH輸入,找到對應PG當前Primary所在的OSD併發送讀寫請求。
  2. OSD收到客戶端傳送的讀寫請求,將其封裝為一個op,並基於其攜帶的PGID將其轉發至對應的PG。
  3. PG收到op後,完成一些列檢查,所有條件均滿足後,開始真正執行op。
  4. 如果op只包含讀操作,那麼直接執行同步讀(對應多副本)或者非同步讀(對應糾刪碼),等待讀操作完成後由Primary向客戶端應答。
  5. 如果op包含寫操作,則由Primary基於op生成一個針對原始物件操作的PG事務,然後將其提交至PGBackend,由後者按照備份策略轉化為每個副本真正需要執行的本地事務,並進行分發。當Primary收到所有副本的寫入完成應答之後,對應op執行完成,由Primary向客戶端迴應寫入完成。

物件定址

物件定址參考client寫操作部分

訊息接收與分發

讀寫請求都是從OSD::ms_fast_dispatch開始,它是接收讀寫訊息message的入口。

訊息出隊處理

do_request

主要進行PG級別的檢查,處理流程:

do_op

主要進行物件級別的檢查和一些上下文的準備工作。處理流程:

execute_ctx

prerare_transaction操作主要分為三個階段:

  1. 通過do_osd_ops生成原始op對應的PG事務。
  2. 如果op針對head物件操作通過make_writeable檢查是否需要預先執行克隆操作。
  3. 通過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屬性。

參考資料

1.ceph讀寫流程