聊聊分布式數(shù)據(jù)庫TDSQL的技術(shù)架構(gòu)
大家好,我是飛哥!
咱們很多讀者都是在互聯(lián)網(wǎng)公司工作,大部分同學(xué)會(huì)有一種認(rèn)知偏差,總以為互聯(lián)網(wǎng)的業(yè)務(wù)對技術(shù)的要求是最高的。但其實(shí)不然。
比如在對延時(shí)的要求上,高頻量化交易就比互聯(lián)網(wǎng)的延遲要求要高得多。在數(shù)據(jù)庫上,銀行、證券、電信在這些行業(yè)中對數(shù)據(jù)庫的要求也比互聯(lián)網(wǎng)高得多。拿銀行舉例,銀行的系統(tǒng)里是連一分錢都不能錯(cuò)的,而且即使是十幾年前的交易記錄也必須能夠查出來,對安全性的要求就更不用說了。
在過去很長的一段時(shí)間里,這些行業(yè)選擇數(shù)據(jù)庫基本上就是 Oracle 和 IBM 的天下,各家企業(yè)在選型時(shí)基本就是 Oracle 和 DB2 之間二選一。但前幾天看到 IDC 發(fā)布了《中國分布式關(guān)系型數(shù)據(jù)庫 2023 年廠商評估》的報(bào)告,很高興看到國內(nèi)數(shù)據(jù)庫已經(jīng)發(fā)展的非常的好了,老東家騰訊云的 TDSQL 也躋身進(jìn)了領(lǐng)導(dǎo)者位置,并在國內(nèi)市場上取得了第一的成績。
IDC 是全球最頂級的市場研究和咨詢機(jī)構(gòu)。它通過大量的數(shù)據(jù)進(jìn)行市場分析,對科技行業(yè)里的各種技術(shù)各家廠商進(jìn)行分析。為企業(yè)提供專業(yè)的咨詢服務(wù)。這家公司的分析報(bào)告是非常權(quán)威的,在市場中認(rèn)可度非常的高。
圖片
那么什么是分布式數(shù)據(jù)庫,其分布式、強(qiáng)一致性、高可用以及無損升級等特性又是如何實(shí)現(xiàn)的呢。今天我們在這篇文中使用 TDSQL 技術(shù)架構(gòu)來進(jìn)行學(xué)習(xí)和理解。
傳統(tǒng)的 Oracle 和 DB2 都屬于傳統(tǒng)的單體數(shù)據(jù)庫架構(gòu)。由于數(shù)據(jù)的進(jìn)一步的大規(guī)模的增長,這種傳統(tǒng)架構(gòu)出現(xiàn)了不少的弊端。一個(gè)弊端就是擴(kuò)展性問題。單機(jī)的性能再強(qiáng)存儲(chǔ)再大都不可能承受這些行業(yè)里的大規(guī)模的存儲(chǔ)和計(jì)算需求。
雖然可以通過分庫分表的方式來一定程度提供擴(kuò)展性,但這種擴(kuò)展性對應(yīng)用不透明。應(yīng)用需要知道底層的集群、庫、表的實(shí)現(xiàn)細(xì)節(jié),代碼寫起來很臟,后期也不好維護(hù)。另一個(gè)弊端是存儲(chǔ)和計(jì)算沒有分離,總有一個(gè)資源是浪費(fèi)的。
另外還有個(gè)更重要的原因是漂亮國脾氣很不穩(wěn)定,動(dòng)不動(dòng)就封鎖咱一下,搞得國內(nèi)各行各業(yè)都擔(dān)驚受怕。在銀行、證券、電信這種支柱型的行業(yè)里,數(shù)據(jù)是容不得出一點(diǎn)差錯(cuò)的。所以近年來,這些行業(yè)都在積極地在國內(nèi)尋找平替產(chǎn)品。
所以數(shù)據(jù)庫行業(yè)需要一些國內(nèi)的產(chǎn)品出來解決以上問題。
在騰訊早在 2002 年的時(shí)候,也主要是使用 Mysql 來存儲(chǔ)騰訊的計(jì)費(fèi)等數(shù)據(jù),但后來由于業(yè)務(wù)的快速發(fā)展,用戶量越來越大,增值業(yè)務(wù)收入規(guī)模也越來越大,對可用性的要求水漲船高,就開始自研分布式數(shù)據(jù)庫,大約到了 2012 年的時(shí)候 TDSQL 就形成了雛形,在公司內(nèi)部提供金融級的高一致性、可靠性的服務(wù)。
在 2014 年的時(shí)候,騰訊系微眾銀行成立。在做存儲(chǔ)技術(shù)選型的時(shí)候,經(jīng)過反復(fù)的測試驗(yàn)證,發(fā)現(xiàn) TDSQL 已經(jīng)滿足了銀行對一致性、可用性的需求。開始采用 TDSQL 作為核心業(yè)務(wù)的底層存儲(chǔ)。
后面公有云蓬勃開始發(fā)展的時(shí)候,TDSQL 自然就作為騰訊分布式關(guān)系型數(shù)據(jù)庫被推向了很多銀行、金融機(jī)構(gòu)。截止到 2023 年,在 4000 多家國內(nèi)的各種金融、公共服務(wù)、電信、證券等行業(yè)得到了應(yīng)用,服務(wù)了30家金融機(jī)構(gòu)完成核心系統(tǒng)的替換,中國十大銀行中七家都應(yīng)用了 TDSQL。
TDSQL 是一個(gè)對應(yīng)用層透明的分布式數(shù)據(jù)庫。應(yīng)用可以像使用單機(jī)數(shù)據(jù)庫一樣簡單地使用,不必像分庫分表那樣關(guān)心底層的劃分策略。數(shù)據(jù)庫自己內(nèi)部封裝事務(wù)、分片、災(zāi)備、擴(kuò)展性等功能。
圖片
從這個(gè)架構(gòu)圖中可見,用戶請求只需要和負(fù)載均衡通信即可,完全不用關(guān)心數(shù)據(jù)庫底層的實(shí)現(xiàn)。
而在架構(gòu)內(nèi)部主要是三部分組成,一是管理節(jié)點(diǎn)、二是計(jì)算節(jié)點(diǎn)、三是存儲(chǔ)節(jié)點(diǎn)。沒錯(cuò),現(xiàn)代的分布式存儲(chǔ)都是計(jì)算和存儲(chǔ)相分離的。這樣可以做到可以單獨(dú)進(jìn)行擴(kuò)展。
當(dāng)有用戶請求到來時(shí),負(fù)載均衡組件會(huì)把請求發(fā)送給 SQL 引擎。從用戶視角來看,它看到的是一張整體上的表。
SQL 引擎會(huì)對用戶輸入的 sql 語句進(jìn)行詞法、語法解析,還需要處理分布式場景下的全局自增字段等邏輯。然后根據(jù) MetaCluster 中存儲(chǔ)的元信息決定將請求發(fā)往后面的哪些數(shù)據(jù)節(jié)點(diǎn)。這里要注意的是,用戶訪問的表實(shí)際上是可能被分布在后臺(tái)的多個(gè) SET 內(nèi)的,用戶對此并不知情。所以 SQL 引擎會(huì)向多個(gè)數(shù)據(jù)節(jié)點(diǎn)發(fā)起請求,各個(gè)節(jié)點(diǎn)返回后,SQL 引擎進(jìn)行聚合后返回給用戶。
這是分布式數(shù)據(jù)庫的首要目標(biāo),對用戶屏蔽分布式,只在邏輯上提供整張的表訪問,簡化用戶使用數(shù)據(jù)庫的方式。
由于 SQL 引擎只負(fù)責(zé)計(jì)算,不負(fù)責(zé)存儲(chǔ),本身是無狀態(tài)的。該節(jié)點(diǎn)只需要重點(diǎn)關(guān)注 CPU 和 內(nèi)存相關(guān)的性能優(yōu)化即可。在硬件上,也可以選擇計(jì)算型的硬件。
SET 是分布式數(shù)據(jù)庫實(shí)例。一個(gè) SET 內(nèi)部包含了 Master、Slave 節(jié)點(diǎn)。每個(gè) SET 中存儲(chǔ)哪些數(shù)據(jù)是由 shardkey 來進(jìn)行分散的。在數(shù)據(jù)接入的時(shí)候,TDSQL 采用 raft 協(xié)議的強(qiáng)同步復(fù)制,Master 接收到業(yè)務(wù)請求后,等待其中一個(gè) Slave 應(yīng)答成功后才會(huì)返回成功,否則不返回。通過這種方式實(shí)現(xiàn)強(qiáng)一致性。
在每個(gè)節(jié)點(diǎn)內(nèi)部,都包含一個(gè) Agent 和具體的 Mysql 實(shí)例。這種架構(gòu)有點(diǎn)類似于微服務(wù)中 Mesh 架構(gòu) 中用 Sidecar 把微服務(wù)框架功能獨(dú)立出來一樣。Agent 和存儲(chǔ)解耦,好處是 Agent 可以監(jiān)控并上報(bào) Mysql 的狀態(tài),而且系統(tǒng)升級的時(shí)候,也可以單獨(dú)升級和重啟 Agent,而不用重啟 Mysql 進(jìn)程,可以做到無損升級。
如果 Master 節(jié)點(diǎn)發(fā)生故障,它的 Agent 會(huì)上報(bào)它的異常給 MetaServer。接著 Master 會(huì)降級成為 Slave。再從剩下的 Slave 中選舉一個(gè)出來作為 Master。后面的請求就會(huì)發(fā)送給新的 Master。整個(gè)容災(zāi)切換機(jī)制都無需人為干預(yù),通過這種方式實(shí)現(xiàn)高可用。
圖片
以上就是 TDSQL 的強(qiáng)一致性、無損升級、高可用在架構(gòu)上實(shí)現(xiàn)的原理。
另外還有一個(gè)我覺得在 TDSQL 中比較值得學(xué)習(xí)的一個(gè)點(diǎn)是它的扁鵲智能化 DBA 平臺(tái)。我們大家在做自己的系統(tǒng)時(shí)也可以借鑒這個(gè)思路實(shí)現(xiàn)自己系統(tǒng)的高效運(yùn)維。
當(dāng)集群規(guī)模大了之后,必然會(huì)出現(xiàn)各種各樣的問題。比如網(wǎng)絡(luò)異常發(fā)生、SSD 衰老,如果這些問題全部依賴人工去排查和處理,效率太低了。而且未來分布式系統(tǒng)的規(guī)模會(huì)越來越大,所以人工維護(hù)必然需要被代替。以下是 TDSQL 的扁鵲平臺(tái)架構(gòu)。
圖片
DBA 靠這個(gè)平臺(tái)可以發(fā)現(xiàn)各種集群中運(yùn)行的問題。比如差 SQL、擴(kuò)容異常、鎖分析等等各種日常運(yùn)維工作。更高效率的運(yùn)維也是實(shí)現(xiàn)高可用的另一個(gè)關(guān)鍵要素。
最后,再次恭喜 TDSQL 登錄中國分布式關(guān)系型數(shù)據(jù)庫“領(lǐng)導(dǎo)者”類別,這份來自業(yè)界的高度評價(jià)十分難得。相信國產(chǎn)數(shù)據(jù)庫未來一定會(huì)越來越強(qiáng)!