OceanBase 原始碼解讀(三):分割槽的一生
假若分割槽是 OceanBase 的一等公民。一個表由一個或者若干個分割槽組成,分割槽是 OceanBase 邏輯上水平可擴充套件概念和物理上資料組織的基本單位。分割槽是自包含的:每個分割槽有自己獨立的選舉和 leader,獨立的事務日誌、資料儲存和索引。分割槽可大可小,一般大小在 G B量級,它可以被 RS 在多個節點之間排程以實現負載均衡。
每個分割槽有一個唯一標識 OBPartitionKey,由租戶 id、表 id、分割槽 id 組成。從儲存層來說,每個節點就是儲存和組織這些 key 對應的分割槽副本,每個節點上可以有數萬個副本。副本有多種型別,比如只讀副本與主副本之間不是透過 paxos 協議,而是非同步訊息同步事務日誌。
storage/ob_partition_service.h 是儲存層的總入口,它對外提供了儲存層的所有 RPC 服務,如建立刪除分割槽副本。實際上,它是每個節點上所有分割槽級介面的入口,包括事務控制介面、分割槽讀寫的介面等。
前面講過,建表和新增分割槽等 DDL 語句是由 RS 執行的,RS 在根據一定策略選定節點後,就會 RPC 呼叫這裡的 create_xxx。
從這個入口一層一層追下去,可以找到所有儲存結構。但儲存層內部有大量類似的介面,很容易混淆。每個分割槽都是一個“索引組織表”,索引結構是多層的 LSM-Tree。雖然是多層,但是有引數可以調整,儘量只有記憶體裡的 memtable(見storage/memtable)和磁碟上的 major sstable(見 storage/blocksstable)兩層。每次 major compaction 的時候,memtable, minor sstable 的資料與原來的 major sstable 合併,產生新版本的 major sstable。在合併期間,可能有多個版本的 major sstable 同時提供服務。一個分割槽副本的多層儲存結構合起來,就是類 OBPartitionStore。
分析到這裡,大家還以為“分割槽是 OB 的一等公民”嘛嗎?其實PG 才是。此 PG 非彼 PG。PG,Partition Group,表示共享同一個事務日誌流和 memtable 的“有緊密關係的”一組分割槽。外部一般不使用這個特性,一般一個 PG 裡面只有一個分割槽,這就是為什麼這裡的儲存結構和操作物件會有奇怪的pg字首和 OBPGKey了。
為了表達誠意,獻上我畫的儲存結構相關類圖。
一圖勝千言。
sql/engine/table 是 SQL 物理執行計劃中執行表掃描的運算元,它透過 ob_partition_service.h 的 table_scan 介面獲得一個迭代器(迭代結束要呼叫 revert_scan_iter),這就是儲存層提供的資料訪問入口。還有 DML(sql/engine/dml)使用的insert_rows, delete_rows, update_rows和lock_rows 等介面。
當分割槽或表被刪除的時候,OBPGPartition 及其所有包含的儲存結構將被刪除。但是並非立即釋放資源,要等所有引用失效且資源不被使用時執行清理。
以上便是分割槽的一生。 在後續的原始碼解讀第四篇我們將會為大家解析 OceanBase 資料庫事務的外部介面,敬請期待。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69909943/viewspace-2841462/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OceanBase 原始碼解讀(五):租戶的一生原始碼
- PostgreSQL 原始碼解讀(96)- 分割槽表#3(資料插入路由#3-獲取分割槽鍵值)SQL原始碼路由
- PostgreSQL 原始碼解讀(92)- 分割槽表#1(資料插入路由#1)SQL原始碼路由
- PostgreSQL 原始碼解讀(94)- 分割槽表#2(資料插入路由#2)SQL原始碼路由
- PostgreSQL 原始碼解讀(98)- 分割槽表#4(資料查詢路由#1-“擴充套件”分割槽表)SQL原始碼路由套件
- PostgreSQL 原始碼解讀(99)- 分割槽表#5(資料查詢路由#2-RelOptInfo數...SQL原始碼路由
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- OceanBase 原始碼解讀(八):事務日誌的提交和回放原始碼
- OceanBase 原始碼解讀(九):儲存層程式碼解讀之「巨集塊儲存格式」原始碼
- 讀 NebulaGraph原始碼 | 查詢語句 LOOKUP 的一生原始碼
- PostgreSQL 原始碼解讀(100)- 分割槽表#6(資料查詢路由#3-prune part...SQL原始碼路由
- 深入原始碼理解Spark RDD的資料分割槽原理原始碼Spark
- JDK 原始碼 Integer解讀之三(valueOf)JDK原始碼
- 【詳解】ThreadPoolExecutor原始碼閱讀(三)thread原始碼
- Promise原始碼漸進式解讀(三)Promise原始碼
- OceanBase 原始碼解讀(十二):宏塊的垃圾回收和壞塊檢查原始碼
- PostgreSQL 原始碼解讀(101)- 分割槽表#7(資料查詢路由#4-prune part...SQL原始碼路由
- OceanBase 儲存層程式碼解讀(三)巨集塊儲存格式
- 時間型分割槽欄位不走分割槽的解決
- OceanBase 原始碼解讀(七):一文讀懂資料庫索引實現原理原始碼資料庫索引
- 如何查詢分割槽表的分割槽及子分割槽
- 掛載可讀寫的NTFS分割槽
- Laravel 原始碼的解讀Laravel原始碼
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- MapReduce(三):分割槽、排序、合併排序
- oracle分割槽表學習(三)Oracle
- 分割槽表學習之三
- oracle分割槽及分割槽索引partition_partition index_維護(三)Oracle索引Index
- 開源資料庫OceanBase原始碼解讀(九):tableAPI和OB多模型資料庫原始碼API模型
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- PostgreSQL 原始碼解讀(3)- 如何閱讀原始碼SQL原始碼
- 解讀GaussDB(for MySQL)靈活多維的二級分割槽表策略MySql
- SpringBoot原始碼解讀系列三——引導註解Spring Boot原始碼
- 【三思筆記】 全面學習Oracle分割槽表及分割槽索引筆記Oracle索引
- oracle 分割槽表詳解Oracle
- MySQL分割槽(Partition)詳解MySql