開源 2 年、打磨 13 年、300 萬行代碼的開源項目

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

程序員小夥伴看到這裏應該猜到了我們的今天的主角,沒錯就是「數據庫」。

一、分佈式數據庫

程序員熟知的單體數據庫如 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 還不錯的話就關注一下吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章