從刻在石壁上的甲骨文,再到寫在紙上的漢字,每一次資訊載體的變更都是文化進步的重要標誌。在如今這個資訊數位化的時代,我們在享受著數位化便利的同時,資料也在我們看不見的地方飛速增長著,資料的重要性不言而喻。那應該如何將海量資料完整、有序、持久化地儲存下來呢?
程式設計師小夥伴看到這裡應該猜到了我們的今天的主角,沒錯就是「資料庫」。
程式設計師熟知的單體資料庫如 MySQL、Oracle 在二十世紀末誕生並大行其道,直到 2010 年左右行動網際網路爆發,席捲而來的海量資料,讓單體資料庫面臨了前所未有的挑戰,這也讓資料庫迎來了百花齊放的時代。
為了解決海量資料儲存的問題,程式設計師們做了諸多嘗試,比如堆機器設定、利用分庫分表配合中介軟體實現分散式架構等,卻發現治標不治本、換湯不換藥,只是延長了問題出現的週期,還引發了維護成本高、上手難度大等問題。因此,新型分散式資料庫應運而生,它基於分散式原理把資料處理和儲存分到多臺普通機器上處理,從根本上解決了單體資料庫儲存海量資料的瓶頸和效能問題,並優化了傳統分散式資料庫的資料一致性問題。
分散式資料庫雖然能解決資料量瓶頸的問題,但換資料庫是個類似動心臟的大手術,不僅風險極大而且「勞民傷財」。那有沒有一款開源分散式資料庫不僅可以處理海量資料,而且換起來比較輕鬆呢?
今天 HelloGitHub 就給大家介紹一款可以解決上述問題的開源分散式資料庫——OceanBase,它從出生那天起就是為了搞定資料庫成本、效能的相關痛點。
OceanBase 是一款從螞蟻集團走出來的完全自主研發、高度相容 Oracle 和 MySQL 的原生分散式資料庫。它於 2021 年開源,具有金融級高可用、水平擴充套件、分散式事務、省錢(儲存成本低)、易遷移等特性,具備機房和城市級別的高可用和容災的功能(RPO=0,RTO<8s),支援混合事務和分析(可處理線上資料和離線巨量資料分析),還可以單機部署使用(單機分散式一體化架構)。
GitHub 地址:https://github.com/oceanbase/oceanbase
資料庫作為最核心的基礎服務之一,必須要做到穩定、可靠,沒有人會把重要的資料交到一個初出茅廬的「毛頭小子」手裡。這點在 OceanBase 完全不用擔心,因為它已年滿「13 歲」,同時憑藉高效能、高可用、低成本、無限擴充套件和服務永遠線上的特點,連續 10 年穩定支撐「天貓雙 11 」,併成為金融、水利水電、運輸、通訊、政企等行業諸多企業核心系統的資料底座。
這份「履歷」看下來,是不是感覺 OceanBase 挺高大上、上手門檻一定很高對不對?不不不,OceanBase 社群提供了詳細的中文檔案、有問必答的板塊、從入門到進階的免費課程、獎勵豐厚的比賽等,不管你是資料庫小白還是大牛,都能給你安排地明明白白!
既然已經看到這裡了,相請不如偶遇,下面就和 HelloGitHub 一起從最簡單的安裝 OceanBase 開始,走近這款目標是「星辰大海」的開源分散式資料庫!
看了這麼多是不是都手癢了?那就一起來上手體驗下吧!(這部分很短、很快)
下載 all-in-one 一鍵安裝指令碼(需要聯網)並執行成功後,你就能立馬得到一個 OceanBase 資料庫範例。
# 下載
bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/oceanbase-all-in-one/installer.sh)"
# 執行
source ~/.oceanbase-all-in-one/bin/env.sh && obd demo
這裡介紹的方法為本地體驗使用,部署 OceanBase 叢集可執行 obd web
命令,然後開啟瀏覽器進入「安裝部署嚮導」完成部署。
[admin@test001 ~]$ obd web
start OBD WEB in 0.0.0.0:8680
please open http://172.xx.xxx.233:8680
下面介紹一下,如何通過 Docker 快速啟動 OceanBase。
# 1.部署一個 mini 模式範例
docker run -p 2881:2881 --name oceanbase-ce -e MINI_MODE=1 -d oceanbase/oceanbase-ce
# 2. 連線 OceanBase
docker exec -it oceanbase-ce ob-mysql sys # 連線 root 使用者 sys 租戶
login as root@sys
Command is: obclient -h127.1 -uroot@sys -A -Doceanbase -P2881
Welcome to the OceanBase. Commands end with ; or \g.
Your OceanBase connection id is 3221487727
Server version: OceanBase_CE 4.1.0.0 (r100000192023032010-0265dfc6d00ff4f0ff4ad2710504a18962abaef6) (Built Mar 20 2023 10:12:57)
Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
obclient [oceanbase]>
至此,我們已成功進入 OceanBase 命令列,可以寫 SQL 啦!但寫幾條 SQL 演示我感覺沒啥意思,下面我打算深入 OceanBase 底層介紹下它的核心技術。
OceanBase 採用 C++ 語言編寫,下面這段程式碼是 OceanBase 0.1(2010年)就定義的一個最基本的 C++ 列舉型別 ObObjtype,用來表述資料庫中儲存的數值型別。
如今 OceanBase 已支援五十餘種數值型別,而這段依然「活著」的早期程式碼見證並體現了 OceanBase 十多年來的架構發展。
2021 年 OceanBase 將 300 萬行核心程式碼開源,供程式設計師們學習和共建。篇幅有限,這裡僅簡單地介紹下 OceanBase 的儲存引擎和事務引擎兩部分的核心技術,這兩點也是程式設計師在面試時,聊到資料庫經常會被問到的面試題。希望讀完這部分後,可以幫助你可以對資料庫底層技術有一個整體的瞭解,觸類旁通對資料庫底層技術產生興趣。
目前,資料庫儲存引擎的兩大頂流資料結構是 B+ 樹(MySQL)和 LSM-Tree(HBase、RocksDB),OceanBase 的儲存引擎就是基於 LSM-Tree 構建的高壓縮引擎。
LSM-Tree(紀錄檔結構合併樹)是一種分層、有序、面向磁碟的資料結構。它的核心思想是將記憶體中的增量資料(MemTable),逐層向磁碟上的靜態資料 SSTable 進行轉儲與合併,初衷是為了將小粒度的隨機寫聚合成大粒度的順序追加寫,從而減少機械磁碟懸臂的頻繁機械運動,提升 I/O 效率。
SSTable
SSTable 代表內部有序的磁碟檔案。資料按照 key 排序,可以使用二分搜尋的方式快速得到指定 key 的資料。磁碟上的 SSTable 被劃分為多個層級(Level),層級數位越低表示資料被寫入的時間越近,層級數位越大表示資料越舊。
MemTable
MemTable 是純記憶體狀態的資料結構。為了便於後續進行順序讀取生成磁碟上的 SSTable,一般採用排序樹(紅黑樹/AVL 樹)、SkipList 等這類有順序的資料結構。
結論
OceanBase 選用 LSM-Tree 是看中了其批次寫入具有更好的寫操作吞吐量,相較於 B+ 樹 SSTable 沒有定長塊限制,適合做解壓/壓縮,讀取速度更快。從而實現了 OceanBase 的高效能、資料壓縮帶來的儲存低成本和 OLAP(線上分析處理)的能力。
事務就是資料庫中一系列資料操作的集合,集合可能有大有小,但無論集合中有多少操作,要麼一起操作成功,要麼失敗一起回滾。無論集合中有多少操作,對於使用者來說,就是一個操作。
事務的 ACID 屬性:
由於一個事務包含多個操作,可能出現事務進行到一半發生故障的情況,此時資料庫會處於不一致的狀態。資料庫要恢復到一致性狀態,要麼復原已經執行的操作,恢復到事務執行前的狀態,要麼重做未完成的操作,恢復到事務執行後的狀態。要知道哪些操作需要復原、哪些操作需要重做,一般會用到一種技術「紀錄檔」。
在資料庫設計中,將記錄復原操作的紀錄檔稱為 undo log
,將記錄重做操作的紀錄檔稱為 redo log
。
在分散式場景下,OceanBase 採用了兩階段提交、Paxos 協定等手段來保證事務正確執行。
上圖右邊是 OceanBase SQL 引擎執行過程,左邊是事務引擎執行過程。從上圖可以看到,為保證事務的一致性需要做很多事情,主要分為「事務執行」和「事務提交」兩部分,下面簡單介紹下 OceanBase 確保事務正確執行的三大核心技術。
1、redo 紀錄檔
對於單個機器來說,OceanBase 資料庫通過 redo 紀錄檔記錄了資料的修改,通過 WAL 機制在宕機重啟之後恢復資料。保證事務一旦提交成功,事務資料就不會丟失。對於分散式叢集來說,OceanBase 資料庫通過 Paxos 協定將資料同步到多個副本,只要多數派副本存活事務資料就不會丟失。
2、版本號管理
為了支援資料讀寫不互斥,OceanBase 資料庫儲存了多個版本的資料。多版本一致性通過讀版本和資料版本來保證,每個成功提交的事務都會為資料增加一個版本,讀請求只能讀到小於等於讀取版本號的已提交資料,從而保證並行讀寫的一致性和效能。
3、兩階段提交(事務提交)
分散式系統中,事務操作的表或者分割區可能分佈在不同機器上。OceanBase 資料庫採用兩階段提交協定保證事務的原子性,確保多個節點上的事務要麼都提交要麼都回滾。
結論
OceanBase 對事務的兩階段提交、版本號管理、redo 紀錄檔,以及弱一致性讀進行了大量優化,在保證事務 ACID 的基礎上,大幅提升了分散式事務的並行效能。
如果看到這裡,勾起了你對分散式資料庫底層技術的「饞蟲」,可以去看看《OceanBase 資料庫原始碼解析》這本書「解饞」。
可能很多開發者和我一樣都覺得分散式資料庫是「高不可攀」的存在,認為這個大傢伙安裝麻煩、設定要求高、需要多臺機器。
這裡就要表揚下 OceanBase 的「接地氣」了,它的單機分散式一體化架構,不僅能讓個人使用者在本地執行(可在 4C16G 的小型機執行),還能讓企業使用者實現「一次選擇終生受用」!
個人開發者可以輕鬆地在自己的筆記型電腦上把 OceanBase 跑起來!重點是,單機下的 OceanBase 效能和 MySQL 基本持平。
企業使用者可以實現「一次選擇終生受用」。在公司業務發展的初期,單機部署形態的資料庫完全可以滿足需求。因此,在業務初期資料量還很小的時候,提供一個儘可能低的啟動規格非常重要,而且 OceanBase 單機效能也不錯。而在業務高速增長期,OceanBase 良好的擴充套件性、彈性擴容和高效能,輕鬆應對不斷增加的使用者資料和效能需求,儘可能節省儲存和運維成本。
對於企業而言 OceanBase 的金融級高可用、彈性擴容、高效能、降低成本的特性,能夠切實解決業務上的痛點。
對於個人開發者來說,OceanBase 不僅開放了核心原始碼,而且 OceanBase 社群還提供了豐富的資料庫相關的中文資料和教學。這些都是學習資料庫非常好的材料。值得一提的是,OceanBase 有一套嚴格的程式碼准入流程,如果你的程式碼能合併進 300 萬行的開源專案,那絕對是一件值得自豪的事情!
GitHub 地址:https://github.com/oceanbase/oceanbase
以上就是本期的所有內容,希望今天 HelloGitHub 的推薦沒有讓你失望,如果覺得 OceanBase 還不錯的話就關注一下吧!
作者:削微寒
掃描左側的二維條碼可以聯絡到我
本作品採用署名-非商業性使用-禁止演繹 4.0 國際 進行許可。