OceanBase架構設計

本文主要參考《大規模分布式存儲系統》

基本結構

客戶端:發起請求。

RootServer:管理集群中的所有服務器,子表數據分布及副本管理,一般為一主一備,數據強同步。

UpdateServer:存儲增量變更數據,一般為一主一備,客戶端的寫入數據只更UpdateServer。

MergeServer:接收并解析SQL請求,進行詞法分析和查詢優化之后把請求轉發給ChunkServer查詢,并合并查詢后的結果。客戶端直接訪問MergeServer。

ChunkServer:存儲基線數據,一般存儲兩到三份。

上述組件可以構成一個OB集群,另外還可以在此基礎上部署多個集群,集群之間的數據同步通過主集群的UpdateServer向備集群同步來實現。

組件實現

RootServer

RootServer負責管理集群中所有的MergeServer,ChunkServer和UpdateServer,功能主要包括以下三點:

集群管理

RootServer通過心跳與其他組件連接。

保證一個集群內同一時刻只有一個UpdateServer提供服務,通過租約機制選擇唯一的主UpdateServer。

數據分布
中心表RootTable

使用主鍵對表格數據排序,按順序分布(和Hbase一樣)。把所有數據劃分為大致相等的數據范圍(Tablet),每個子表默認256MB。采用根表一級索引結構,即只有根表和子表兩層。

由于中心表RootTable的修改很少,直接使用有序數組實現,增加子表時通過CopyOnWrite的方式創建一個新的數據,對新的數據寫入和重新排序,然后吧指針指向新的RootTable。

子表分裂和合并

分裂:每臺ChunkServer采用同樣的分裂規則,根據子表的數據行數和子表大小設定分裂規則。

合并:先選擇若干連續范圍的子表,把它們遷移到相同的ChunkServer機器上,然后執行合并。只要有一個副本合并成功,就認為合并成功。

副本管理

每個子表一般包含3個副本,RootServer定期執行負載均衡,轉移子表到負載低的節點。

RootServer的主備之間數據強一致同步。

UpdateServer

集群中只有UpdateServer接收寫操作,更新時首先寫入內存,當內存表的數據量超過閾值時轉儲到磁盤。和Hbase一樣,為了保證可靠性,寫入數據前先寫入操作日志并同步到備UpdateServer。

由于只有一臺UpdateServer提供寫服務,很容易實現跨行跨表事務。

UpdateServer中的增量數據結構為一顆內存中的B+樹(Hbase為跳躍表),每個葉子結點對應一行數據,key為行主鍵,value為行操作鏈表的指針,每行按照時間順序構成一個行操作鏈表(更新、刪除)。

UpdateServer的主備節點各保存增量數據的一個副本,以此保證高可用。同步機制跟MySQL的主備同步一致基本一樣,主UpdateServer往備機推送操作日志,備UpdateServer接受線程接收日志并寫入全局日志緩沖區。

ChunkServer

ChunkServer是集群中實際存儲數據的節點,數據結構為B+樹。每個表格按主鍵組成一顆B+樹,每個葉子結點包含表格中某個主鍵范圍內的數據。每個葉子結點稱為一個子表(Tablet),包含一個或多個SSTable,每個SSTable由多個塊組成,支持布隆過濾器過濾。葉子結點是負載平衡和任務調度的基本單元。

ChunkServer中保存基線數據的2-3個副本,以此保證高可用

ChunkServer的功能主要包括以下:

存儲多個子表

每個子表由1個SSTable組成,每個SSTable由多個塊組成,每個塊大小為4KB-64KB之間(和HBase一樣)。

支持兩種緩存:塊緩存和行緩存。

SSTable分為兩種格式:稀疏格式和稠密格式。稀疏格式的每一行只存儲包含實際值的列(列存儲),稠密格式每一行需要存儲所有列,但不需要存儲列名(行存儲)。

列存儲的好處有兩個:

  1. 在SQL語句只讀取部分列時,避免把完整行加載到內存中。
  2. 同一列數據在物理上存放到一起,提高壓縮率。
提供讀取服務

MergeServer把請求發到子表所在的ChunkServer讀取基線數據,然后請求UpdateServer獲取增量數據并融合。

定期合并

把UpdateServer轉儲來的增量表和本地的基線數據執行多路合并,生成新的SSTable。

數據分發

凍結UpdateServer當前活躍的內存表,生成凍結內存表并緩存到ChunkServer中。

MergeServer

負責解析用戶的SQL請求、轉發到ChunkServer執行、合并結果并返回。

MergeServer中緩存子表信息以減少對RootServer的讀取。MergeServer本身是無狀態的,理論上在宕機后不會對使用者產生影響。

SQL執行

讀取

select c1, sum(c2)
from t1
where c3=10
group by c1
having sum(c2) >= 10
order by c1
limit 0, 20

執行順序依次為:

TableScan(table = t1, col = {c1, c2, c3}, filter = {c3 = 10}):讀取數據。

HashGroupBy(groupby = {c1}, aggr = {sum)(c2)}):分組并計算每個分組內c2的總和。

Filter(cond = {sum(c2) >= 10}):過濾。

Sort(col={c1}):排序。

Project(col = {c1, sum(c2}):返回指定列。

Limit(offset = 0, count = 20):返回限定行數。

select t1.c1, sum(t2.c3)
from t1, t2
where t1.c2 = t2.c2and t1.c3=10
group by t1.c1
having sum(t2.c3) >= 10
order by t1.c1
limit 0, 20

執行順序依次為:

TableScan(table = t1, col = {c1, c2, c3}, filter = {c3 = 10}) 和 TableScan(table = t2, col = {c1, c2, c3}, filter = {c3 = 10}) 分別讀取數據。

Sort(col={t1.c2) 和 Sort(col={t2.c2) 分別排序。

MergeJoin(cond = {t1.c2 = t2.c2}) 合并兩張表的結果。

… 后面和單表一樣。

寫入

REPLACE:直接寫入UpdateServer。

INSERT:讀取ChunkServer中的基線數據并發送到UpdateServer,如果行已存在則返回錯誤,不存在則執行插入操作。

UPDATE:如果行已存在則執行更新,否則什么也不做。

DELETE:如果行已存在則執行刪除,否則什么也不做。

多版本并發控制

寫操作的兩個步驟:

預提交:鎖住待更新行,把操作追加到該行的未提交行操作鏈表中,然后往提交任務隊列加入一個提交任務。

提交:線程從提交任務隊列中獲取提交任務,然后把任務的操作日志寫入到日志緩沖區中(緩沖區滿時寫入磁盤)。操作日志寫成功后,把未提交行操作鏈表追加到已提交行操作鏈表,釋放鎖。

默認情況的隔離級別為讀已提交。

單行只寫事務預提交時對單行加寫鎖;多行只寫事務預提交時對所有行加寫鎖;讀寫事務中的讀操作是讀取某個版本的快照。

允許用戶顯式鎖住某一行(select xxx for update),發生死鎖時超過指定時間自動回滾。

一些設計

  1. 驚群效應:N個線程同時讀取一行已失效的緩存,第一個線程在讀取時往緩存中加入fake標記,其他線程發現fake標記時先等待。
  2. LightyQueue:使用多個隊列分散讀寫請求。
  3. 雙緩存機制:分配當前和預讀兩個緩沖區,使用當前緩沖區讀取完成并返回上層計算之后,預讀緩沖區切換成當前緩沖區并異步讀取數據,原來的當前緩存區計算完之后清空內存并切換成預讀。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92958.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Element-plus]動態設置組件的語言

nuxt element-plus國際化vue element-plus國際化<template><div class"container"> <!-- <LangSwitcher />--><button click"toggle(zh-cn)">中文</button><button click"toggle(en)">English<…

【VS Code - Qt】如何基于Docker Linux配置Windows10下的VS Code,開發調試ARM 版的Qt應用程序?

如何在Windows 10上配置VS Code以開發和調試ARM版Qt應用程序。這需要設置一個基于Docker的Linux環境。首先&#xff0c;讓我們了解一下你的具體需求和環境&#xff1a;你有一個Qt項目&#xff08;看起來是醫學設備相關的設置程序&#xff09;目標平臺是ARM架構你希望在Windows …

linux常見故障系列文章 1-linux進程掛掉原因總結和排查思路

問題一 &#xff1a;運行時常見的進程崩潰原因 內存不足&#xff09; **0. 內存不足 內存不足&#xff08;OOM Killer&#xff09; 排查 OOM&#xff1a;free -h → dmesg → ps aux --sort-%mem 預防 OOM&#xff1a;限制關鍵進程內存、調整 OOM Killer 策略、增加 swap 長期優…

Spring Cloud Gateway 路由與過濾器實戰:轉發請求并添加自定義請求頭(最新版本)

前言 網關是什么?如果把你的系統比作一棟高端寫字樓,網關就是那位神通廣大的前臺小姐姐,笑容可掬地攔住不速之客,把貴賓引到豪華會議室,還會在你胸口貼上一枚醒目的“貴賓”標簽。它既懂禮數,又有原則,能過濾無效請求、轉發正確目標,還能在途中動點“小手腳”,比如加…

達夢數據庫慢SQL日志收集和分析

達夢數據庫慢SQL日志收集和分析 開啟SQL日志記錄 使用DMLOG工具分析SQLLOG DMLOG安裝配置 DMLOG分析日志 系統視圖V$LONG_EXEC_SQLS記錄了最近1000條執行時間超1s的sql。如果sql語句超長可能會被截斷,只能從sqllog里找完整的sql文本。 SELECT * FROM V$LONG_EXEC_SQLS ORDER …

一篇文章,帶你玩轉SparkCore

Spark Core 概念 前言 批處理&#xff08;有界數據&#xff09; ? 對靜態的、有限的數據集進行一次性處理&#xff0c;數據通常按固定周期&#xff08;如每小時、每天&#xff09;收集后統一計算。 特點&#xff1a; 高吞吐量&#xff0c;適合大規模數據。高延遲&#xff08;數…

VRRP技術

VRRP的概念及應用場景 VRRP&#xff08;虛擬路由冗余協議&#xff09;概念 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虛擬路由冗余協議&#xff09;是一種路由容錯協議&#xff0c;用于在多個路由器之間提供網關冗余&#xff0c;確保當主路由器故障時&a…

表驅動法-靈活編程范式

表驅動法&#xff1a;從理論到實踐的靈活編程范式 一、為什么需要表驅動法&#xff1f; 在處理多分支邏輯&#xff08;如消息解析、命令分發&#xff09;時&#xff0c;傳統的 if-else 或 switch-case 存在明顯局限&#xff1a; 當分支數量龐大&#xff08;如成百上千條命令&am…

零基礎-動手學深度學習-10.2. 注意力匯聚:Nadaraya-Watson 核回歸

上節介紹了框架下的注意力機制的主要成分 圖10.1.3&#xff1a; 查詢&#xff08;自主提示&#xff09;和鍵&#xff08;非自主提示&#xff09;之間的交互形成了注意力匯聚&#xff1b; 注意力匯聚有選擇地聚合了值&#xff08;感官輸入&#xff09;以生成最終的輸出。 本節將…

nginx高新能web服務器

一、Nginx 概述和安裝 Nginx是免費的、開源的、高性能的HTTP和反向代理服務器、郵件代理服務器、以及TCP/UDP代理服務器。 Nginx 功能介紹 靜態的web資源服務器html&#xff0c;圖片&#xff0c;js&#xff0c;css&#xff0c;txt等靜態資源 http/https協議的反向代理 結合F…

Unity大型場景性能優化全攻略:PC與安卓端深度實踐 - 場景管理、渲染優化、資源調度 C#

本文將深入探討Unity在大型場景中的性能優化策略&#xff0c;涵蓋場景管理、渲染優化、資源調度等核心內容&#xff0c;并提供針對PC和安卓平臺的優化方案及實戰案例。 提示&#xff1a;內容純個人編寫&#xff0c;歡迎評論點贊。 文章目錄1. 大型場景性能挑戰1.1 性能瓶頸定位…

Java集合框架、Collection體系的單列集合

Java集合框架、Collection1. 認識Java集合框架及結構1.1 集合框架整體結構1.2 集合框架的核心作用2. Collection的兩大常用集合體系及各個系列集合的特點2.1 List系列集合&#xff08;有序、可重復&#xff09;2.2 Set系列集合&#xff08;無序、不可重復&#xff09;3. Collec…

HTML <picture> 元素:讓圖片根據設備 “智能切換” 的響應式方案

在響應式設計中&#xff0c;圖片適配是一個繞不開的難題&#xff1a;同一張高清圖片在大屏設備上清晰美觀&#xff0c;但在小屏手機上可能加載緩慢&#xff1b;而適合手機的小圖在桌面端又會模糊失真。傳統的解決方案往往需要用JavaScript判斷設備尺寸并動態替換圖片源&#xf…

Spring Boot 監控與日志管理實戰

在 Spring Boot 應用開發中&#xff0c;指標監控和日志管理是保障應用穩定運行的核心環節。指標監控能實時掌握應用健康狀態、性能瓶頸&#xff0c;日志管理則用于問題排查和安全審計。本文基于 Spring Boot 提供的 Actuator 監控工具、Spring Boot Admin 可視化平臺&#xff0…

【排序算法】②希爾排序

系列文章目錄 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希爾排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接選擇排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

Linux Shell為文件添加BOM并自動轉換為unix格式

1.添加并查看BOM添加bomvim -c "set bomb|set fileencodingutf-8|wq" ./gradlew查看bomhead -c 3 ./gradlew | hexdump -C2.安裝dos2unix并轉換為unix格式安裝sudo apt install dos2unix轉換dos2unix ./gradlew

華清遠見25072班C語言學習day5

重點內容&#xff1a;數組&#xff1a;為什么有數組&#xff1f;為了便于存儲多個數據特點&#xff1a;連續存儲多個同種數據類型元素(連續指內存地址連續)數組名&#xff1a;數組中首元素的地址&#xff0c;是一個地址常量。一維整形數組&#xff1a;定義&#xff1a;數據類型…

安全守護,溫情陪伴 — 智慧養老產品上新

- 養老智慧看護終端接入螢石開放平臺 - 在2025 ECDC螢石云開發者大會&#xff0c;螢石產品經理已經介紹了基于螢石云服務AI能力適老化設備的養老智能能力開放。 而今天&#xff0c;養老智慧看護終端再升級&#xff0c;集成跌倒檢測、物理隱私遮蔽、火柴人遮蔽、AI語音智能體…

鴻蒙flutter項目接入極光推送

推送的自分類權益 需要審核15個工作日&#xff0c;實際約3個工作日 項目使用極光推送flutter代碼&#xff0c;代碼端已經配置的東西&#xff08;需要配置flutter端和對應各自平臺原生端&#xff09;&#xff0c;我的工程是多target&#xff0c;所以和單target有一點不同。 一、…

2025牛客多校第八場 根號-2進制 個人題解

J.根號-2進制 #數學 #FFT 思路 賽后發現身邊的同學都是通過借位來解決進位問題的&#xff0c;在此提供一種全程不出現減法的順推做法 首先A,BA,BA,B可以理解為兩個多項式&#xff1a;A0A1?2A2(?2)2…A_{0}A_{1}\sqrt{ -2 }A_{2}(\sqrt{ -2 })^2\dotsA0?A1??2?A2?(?…