開源 2 年、打磨 13 年、300 萬行程式碼的開源專案

削微寒發表於2023-11-01

從刻在獸骨上的甲骨文,再到寫在紙上的漢字,每一次資訊載體的變更都是文化進步的重要標誌。在如今這個資訊數字化的時代,我們在享受著數字化便利的同時,資料也在我們看不見的地方飛速增長著,資料的重要性不言而喻。那應該如何將海量資料完整、有序、持久化地儲存下來呢?

程式設計師小夥伴看到這裡應該猜到了我們的今天的主角,沒錯就是「資料庫」。

一、分散式資料庫

程式設計師熟知的單體資料庫如 MySQL、Oracle 在二十世紀末誕生並大行其道,直到 2010 年左右移動網際網路爆發,席捲而來的海量資料,讓單體資料庫面臨了前所未有的挑戰,這也讓資料庫迎來了百花齊放的時代。

為了解決海量資料儲存的問題,程式設計師們做了諸多嘗試,比如堆機器配置、利用分庫分表配合中介軟體實現分散式架構等,卻發現治標不治本、換湯不換藥,只是延長了問題出現的週期,還引發了維護成本高、上手難度大等問題。因此,新型分散式資料庫應運而生,它基於分散式原理把資料處理和儲存分到多臺普通機器上處理,從根本上解決了單體資料庫儲存海量資料的瓶頸和效能問題,並最佳化了傳統分散式資料庫的資料一致性問題。

分散式資料庫雖然能解決資料量瓶頸的問題,但換資料庫是個類似動心臟的大手術,不僅風險極大而且“勞民傷財”。那有沒有一款開源分散式資料庫不僅可以處理海量資料,而且換起來比較輕鬆呢?

二、OceanBase

今天 HelloGitHub 就給大家介紹一款可以解決上述問題的開源分散式資料庫——OceanBase,它從出生那天起就是為了搞定資料庫成本、效能的相關痛點。

OceanBase 是一款從螞蟻集團走出來的完全自主研發、高度相容 Oracle 和 MySQL 的原生分散式資料庫。它於 2021 年開源,具有金融級高可用、水平擴充套件、分散式事務、省錢(儲存成本低)、易遷移等特性,具備機房和城市級別的高可用和容災的功能(RPO=0,RTO<8s),支援混合事務和分析(可處理線上資料和離線大資料分析),還可以單機部署使用(單機分散式一體化架構)。

GitHub 地址:https://github.com/oceanbase/oceanbase

資料庫作為最核心的基礎服務之一,必須要做到穩定、可靠,沒有人會把重要的資料交到一個初出茅廬的“毛頭小子”手裡。這點在 OceanBase 完全不用擔心,因為它已年滿“13 歲”,同時憑藉高效能、高可用、低成本、無限擴充套件和服務永遠線上的特點,連續 10 年穩定支撐「天貓雙 11 」,併成為金融、水利水電、運輸、通訊、政企等行業諸多企業核心系統的資料底座。

這份“履歷”看下來,是不是感覺 OceanBase 挺高大上、上手門檻一定很高對不對?不不不,OceanBase 社群提供了詳細的中文文件、有問必答的板塊、從入門到進階的免費課程、獎勵豐厚的比賽等,不管你是資料庫小白還是大牛,都能給你安排地明明白白

既然已經看到這裡了,相請不如偶遇,下面就和 HelloGitHub 一起從最簡單的安裝 OceanBase 開始,走近這款目標是“星辰大海”的開源分散式資料庫

三、快速上手

看了這麼多是不是都手癢了?那就一起來上手體驗下吧!(這部分很短、很快)

3.1 一鍵安裝

下載 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

3.2 Docker 啟動

下面介紹一下,如何透過 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 的儲存引擎和事務引擎兩部分的核心技術,這兩點也是程式設計師在面試時,聊到資料庫經常會被問到的面試題。希望讀完這部分後,可以幫助你可以對資料庫底層技術有一個整體的瞭解,觸類旁通對資料庫底層技術產生興趣。

4.1 儲存引擎

目前,資料庫儲存引擎的兩大頂流資料結構是 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(線上分析處理)的能力。

4.2 事務引擎

事務就是資料庫中一系列資料操作的集合,集合可能有大有小,但無論集合中有多少操作,要麼一起操作成功,要麼失敗一起回滾。無論集合中有多少操作,對於使用者來說,就是一個操作。

4.2.1 背景知識

事務的 ACID 屬性:

  • 原子性(Atomicity):事務是最小的執行單位,不允許分割。事務的原子性確保動作要麼全部完成,要麼完全不起作用。
  • 一致性(Consistency):確保從一個正確的狀態轉換到另外一個正確的狀態,這就是一致性。要麼事務成功,進入一個新的狀態,要麼事務回滾,回到過去穩定的狀態。
  • 隔離性(Isolation):併發訪問資料庫時,一個使用者的事務不被其他事務所干擾,各併發事務之間是獨立的。
  • 永續性 (Durability):一個事務被提交之後,對資料庫中資料的改變是持久的,即使資料庫發生故障,比如斷電當機,也不應該對其有任何影響。

由於一個事務包含多個操作,可能出現事務進行到一半發生故障的情況,此時資料庫會處於不一致的狀態。資料庫要恢復到一致性狀態,要麼撤銷已經執行的操作,恢復到事務執行前的狀態,要麼重做未完成的操作,恢復到事務執行後的狀態。要知道哪些操作需要撤銷、哪些操作需要重做,一般會用到一種技術「日誌」

在資料庫設計中,將記錄撤銷操作的日誌稱為 undo log,將記錄重做操作的日誌稱為 redo log

4.2.2 分散式事務

在分散式場景下,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 的金融級高可用、彈性擴容、高效能、降低成本的特性,能夠切實解決業務上的痛點。

  • 水平擴充套件:支援業務快速的擴容縮容,同時透過準記憶體處理架構實現高效能。支援叢集節點超過數千個,單叢集最大資料量超過 3PB,最大單錶行數達萬億級。
  • 高效能:TPC-C 記錄(7.07 億 tmpC)和 TPC-H 記錄(1526 萬 QphH @30000GB)。
  • 高可用:支援同城/異地容災,可實現多地多活,滿足金融行業 6 級容災標準(RPO=0,RTO<8s),資料零丟失。
  • 實時分析:基於“同一份資料,同一個引擎”,同時支援線上實時交易及實時分析兩種場景,“一份資料”的多個副本可以儲存成多種形態,從根本上保持資料一致性。
  • MySQL 強相容:高度相容 MySQL,提供自動遷移工具,支援遷移評估和反向同步以保障資料遷移安全。
  • 低成本:基於 LSM-Tree 的高壓縮引擎,儲存成本相比 MySQL 降低 60%-90%;原生支援多租戶架構,一個 OceanBase 叢集可以建立多個 MySQL 例項,可為多個獨立業務提供服務,且租戶間資料隔離,降低部署和運維成本。

對於個人開發者來說,OceanBase 不僅開放了核心原始碼,而且 OceanBase 社群還提供了豐富的資料庫相關的中文資料和教程。這些都是學習資料庫非常好的材料。值得一提的是,OceanBase 有一套嚴格的程式碼准入流程,如果你的程式碼能合併進 300 萬行的開源專案,那絕對是一件值得自豪的事情

GitHub 地址:https://github.com/oceanbase/oceanbase

以上就是本期的所有內容,希望今天 HelloGitHub 的推薦沒有讓你失望,如果覺得 OceanBase 還不錯的話就關注一下吧!

相關文章