自研資料庫CynosDB儲存系統如何實現即時恢復

qcloud發表於2018-12-25

> 本文由雲 + 社群發表 >本文作者:許中清,騰訊雲自研資料庫 CynosDB 的分散式儲存 CynosStore 負責人。從事資料庫核心開發、資料庫產品架構和規劃。曾就職於華為,2015 年加入騰訊,參與過 TBase(PGXZ)、CynosDB 等資料庫產品研發。專注於關聯式資料庫、資料庫叢集、新型資料庫架構等領域。目前擔任 CynosDB 的分散式儲存 CynosStore 負責人。

CynosDB for PostgreSQL 是騰訊雲自研的一款雲原生資料庫,其主要核心思想來自於亞馬遜的雲資料庫服務 Aurora。這種核心思想就是 “基於日誌的儲存” 和 “儲存計算分離”。同時,CynosDB 在架構和工程實現上確實有很多和 Aurora 不一樣的地方。

下圖為 CynosDB for PostgreSQL 的產品架構圖,CynosDB 是一個基於共享儲存、支援一寫多讀的資料庫叢集。

imgCynosDB for PostgreSQL 產品架構圖

CynosDB 基於 CynosStore 之上,CynosStore 是一個分散式儲存,為 CynosDB 提供堅實的底座。CynosStore 由多個 Storage Node 和 CynosStore Client 組成。CynosStore Client 以二進位制包的形式與 DB(PostgreSQL)一起編譯,為 DB 提供訪問介面,以及負責主從 DB 之間的日誌流傳輸。除此之外,每個 Storage Node 會自動將資料和日誌持續地備份到騰訊雲物件儲存服務 COS 上,用來實現 PIT(Point In Time)功能。

CynosStore 會為每一個資料庫分配一段儲存空間,我們稱之為 Pool,一個資料庫對應一個 Pool。資料庫儲存空間的擴縮容是通過 Pool 的擴縮容來實現的。一個 Pool 會分成多個 Segment Group(SG),每個 SG 固定大小為 10G。我們也把每個 SG 叫做一個邏輯分片。一個 Segment Group(SG)由多個物理的 Segment 組成,一個 Segment 對應一個物理副本,多個副本通過 RAFT 協議來實現一致性。Segment 是 CynosStore 中最小的資料遷移和備份單位。每個 SG 儲存屬於它的資料以及對這部分資料最近一段時間的寫日誌。

imgCynosStore 資料組織形式

圖二中 CynosStore 一共有 3 個 Store Node,CynosStore 中建立了一個 Pool,這個 Pool 由 3 個 SG 組成,每個 SG 有 3 個副本。CynosStore 還有空閒的副本,可以用來給當前 Pool 擴容,也可以建立另一個 Pool,將這空閒的 3 個 Segment 組成一個 SG 並分配個這個新的 Pool。

資料庫使用者有可能因為某種原因需要回到過去某個時間點的資料庫快照,CynosDB 提供快照備份特性,滿足使用者的回檔需求。當然,可以回到過去的時間段總是有限的,這取決於快照備份的儲存空間成本。CynosStore 通過持續不斷地將各個 SG 上的資料和日誌備份到騰訊雲物件儲存服務 COS 上。其中,基礎資料的快照根據一定頻率定期備份,而日誌則從 RAFT 狀態機中源源不斷地向 COS 備份。為了避免備份本身對 SG 的同步日誌過程產生影響, SG 會先將日誌持久化到所在 Store Node 的本地儲存,然後通過 Journal Backup Service 將本地 Journal 上傳到 COS。每個 SG 向 COS 備份的過程是完全獨立並互不依賴的。每個 SG 備份時的故障處理也是獨立的。

imgCynosStore 即時恢復

相比 SG 的備份,一個資料庫例項回檔到某個時間點的過程要複雜得多,因為回檔過程必須保證這個 Pool 的所有 SG 回到同一個快照點。當 CynosStore 接收到一個回檔 Pool 的請求,CynosStore 會根據這個 Pool 上所有 SG 備份的日誌資訊找到並計算出與這個時間點對應的 VDL。這個計算的依據是每個 SG 的日誌中會定期不斷地加入一個時間戳日誌。每個 SG 根據需要回檔的時間點和 Pool 全域性 VDL 找到時間上最接近的前一個快照以及相應的日誌檔案。然後根據快照和日誌重放 SG,各個 SG 重放過

程互不依賴。這個回檔過程藉助 Replayer Service 服務來完成,其根據某個 SG 的快照資料和日誌重放到給定的一致性點,並將新產生的快照資料上傳到 COS。然後由 META Center 在 CynosStore 中構建新的 Pool 和新的 SG,通知新 SG leader 從 COS 獲取剛剛生成的快照資料,這樣就完成了一個 SG 的回檔。當這個 Pool 上所有的 SG 的回檔完成,那麼這個 Pool 的回檔也就完成了。

此文已由作者授權騰訊雲 + 社群釋出


更多原創文章乾貨分享,請關注公眾號
  • 自研資料庫CynosDB儲存系統如何實現即時恢復
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章