TiDB 社區(qū) | 黃東旭:可插拔性 × 調(diào)度能力 × 云上幾乎無(wú)限的資源 = ?丨PingCAP DevCon 2021

這次我分享的主題和 2019 年還是一樣的——《The Future of Database》,如果你是 PingCAP 的老朋友,參加過(guò)之前幾次 DevCon 就會(huì)知道,這是我的一個(gè)保留節(jié)目。如果要說(shuō)我哪里有一些與眾不同的氣質(zhì),我覺(jué)得除了發(fā)型之外,還有一個(gè)是對(duì)技術(shù)的信仰和執(zhí)著。這個(gè)保留節(jié)目我們還是聊聊技術(shù)。
過(guò)去兩年, TiDB 在技術(shù)上發(fā)生的最大變化是什么?可能有很多同學(xué)覺(jué)得性能變得越來(lái)越好,功能變得越來(lái)越多,生態(tài)功能越來(lái)越大,其實(shí)不是。


TiDB 這兩年最重要的一件事情,是研發(fā)流程以一個(gè)全新的發(fā)版模型去做軟件工程,我們稱它為“火車發(fā)版”模型。這個(gè)模型的特點(diǎn),是我們會(huì)把很多大的 feature 以小的迭代進(jìn)行逐步增量發(fā)布,意味著更易于管理發(fā)布周期。
很多人可能會(huì)說(shuō)“關(guān)我什么事?”,這件事情非常重要的意義在于,TiDB 從一個(gè)純粹社區(qū)的開(kāi)源軟件開(kāi)始慢慢變成面向企業(yè)級(jí)的數(shù)據(jù)庫(kù)產(chǎn)品。說(shuō)得再接地氣一點(diǎn),用戶真實(shí)場(chǎng)景里面需要的 feature 最快兩個(gè)月就能合并到 TiDB 的主干,并交付給用戶。

兩年前,我的演講題目也是《The Future of Database》,上圖是兩年前演講的截圖。向量化,當(dāng)時(shí)這是一個(gè)挑戰(zhàn),現(xiàn)在已經(jīng)完成了;TiFlash ,當(dāng)時(shí)只是在草圖上設(shè)計(jì)的一個(gè)架構(gòu),在 5.0 引入 MPP 后讓它變成了一個(gè)真正的 Real-time HTAP 的數(shù)據(jù)庫(kù);IPC /異步提交,5.0 的性能和穩(wěn)定性都得到了穩(wěn)步提升;TiDB DBaaS,現(xiàn)在 TiDB Cloud 已經(jīng)是服務(wù)千家萬(wàn)戶,服務(wù)全球各個(gè)地方的真實(shí)產(chǎn)品;本地事務(wù)異地多活,兩年時(shí)間也做完了。
兩年前的五大構(gòu)想,今天都變成了現(xiàn)實(shí)。

從 2019 年到現(xiàn)在的兩年時(shí)間中,在這些 feature 背后我們經(jīng)歷了什么?是兩年時(shí)間超過(guò)三萬(wàn)個(gè) PR 的合并。人總是有成長(zhǎng)的,兩年前的我和現(xiàn)在的我區(qū)別是什么?發(fā)型沒(méi)有變,T 恤也是一樣的,變化的是 TiDB 合并了三萬(wàn)多個(gè) PR?;仡^看我兩年前的 PPT,我在思考一個(gè)問(wèn)題,TiDB 的競(jìng)爭(zhēng)力或核心優(yōu)勢(shì)是什么?很多數(shù)據(jù)庫(kù)都說(shuō)自己的核心優(yōu)勢(shì)是性能好、功能多。那么,TiDB 的優(yōu)勢(shì)是什么?

兩年前我的 PPT 里面有一頁(yè)叫 Everything is Pluggable,我覺(jué)得特別有味道,TiDB 的真正優(yōu)勢(shì)在于技術(shù)開(kāi)放性。架構(gòu)開(kāi)放就意味著能夠產(chǎn)生更多的連接,更多連接意味著更快的迭代速度、更多的可能性。
為什么 TiDB 的系統(tǒng)核心優(yōu)勢(shì)是開(kāi)放性?大家可以花幾秒鐘時(shí)間去思考一下,這一個(gè)思考的角度,讓我這兩年慢慢開(kāi)始變成一個(gè)哲學(xué)家。這個(gè)角度是:?jiǎn)螜C(jī)數(shù)據(jù)庫(kù)和分布式數(shù)據(jù)庫(kù)最本質(zhì)的區(qū)別是什么?做分布式數(shù)據(jù)庫(kù)的工程師的這些痛苦和幸福的根源在哪里?我們真正的敵人是什么?我們要解決什么樣的問(wèn)題?我們?cè)趺唇鉀Q這些問(wèn)題?

作為一個(gè)系統(tǒng)的設(shè)計(jì)者,在思考系統(tǒng)的時(shí)候,我覺(jué)得我們真正的敵人是復(fù)雜性。TiDB 這么一個(gè)幾百萬(wàn)行代碼的軟件,跑在 3 臺(tái)機(jī)器上,跑在 30 臺(tái)、300 臺(tái)、3 萬(wàn)臺(tái)的服務(wù)器上還是這一套代碼。大家想象一下, 3 臺(tái)機(jī)器的復(fù)雜性和 3 萬(wàn)臺(tái)機(jī)器的復(fù)雜性是一樣的嗎?
我們生活中見(jiàn)過(guò)最復(fù)雜的系統(tǒng)是什么?就是活生生的生命,生命是最復(fù)雜的系統(tǒng)。包括每個(gè)人每天在和這個(gè)世界發(fā)生各種各樣的交互,我們沒(méi)有辦法預(yù)料明天。我們?nèi)タ瓷@么一個(gè)復(fù)雜的系統(tǒng),我們往里看人的生命最開(kāi)始就是一個(gè)受精卵,細(xì)胞不停分裂,很簡(jiǎn)單。再往下看 DNA,排列組合,所以我覺(jué)得從生命和自身的角度看,才能真正找到解決對(duì)抗復(fù)雜性的辦法,這就簡(jiǎn)單了。

這里有肖邦老師的一句話,真正難的事情是把系統(tǒng)做簡(jiǎn)單,簡(jiǎn)單意味著美。TiDB 在這方面的設(shè)計(jì)理念和很多的常規(guī)做法還是有點(diǎn)不一樣的,剛才我提到一句話,我們幸福和痛苦的根源在哪?剛才也提到我們是一個(gè)不一樣的公司,技術(shù)上往深去思考我們到底和其他的數(shù)據(jù)庫(kù)區(qū)別是什么?最根源的區(qū)別我覺(jué)得在于核心的設(shè)計(jì)理念,當(dāng)理解了 TiDB 核心設(shè)計(jì)理念再去看 TiDB 的技術(shù)架構(gòu)設(shè)計(jì),有很多具體技術(shù)問(wèn)題大家自然就能夠想通了,也能想到為什么我們會(huì)這么做。
左邊這是一個(gè)慣常思維,1) 我要做一個(gè)數(shù)據(jù)庫(kù),2) 做一個(gè)分布式數(shù)據(jù)庫(kù)會(huì)怎么做,3) 我試著把這些數(shù)據(jù)庫(kù)上面的表給做分片,分區(qū)表,不同的分區(qū)放在不同的服務(wù)器上就是分布式了。
我們過(guò)去從來(lái)沒(méi)有做過(guò)數(shù)據(jù)庫(kù),但是我們有一個(gè)瘋狂的想法,這個(gè)想法就是我們要做一個(gè)分布式數(shù)據(jù)庫(kù),我們開(kāi)始是去定義數(shù)據(jù)最小的流轉(zhuǎn)單元,像剛才看到的那張動(dòng)圖里面的細(xì)胞一樣,我們?nèi)ザx這些細(xì)胞的分裂、合并、移動(dòng),復(fù)制,繁殖。把這些規(guī)則用最極簡(jiǎn),正交,自洽的規(guī)則賦予這些細(xì)胞生命,讓這些細(xì)胞長(zhǎng)成一個(gè)數(shù)據(jù)庫(kù),是 TiDB 最核心的理念。單機(jī)數(shù)據(jù)庫(kù)和分布式數(shù)據(jù)庫(kù)本質(zhì)區(qū)別在什么,分布式數(shù)據(jù)庫(kù)在一臺(tái)臺(tái)機(jī)器上是可以生長(zhǎng)的。

左邊這張圖解釋了一下,常規(guī)是這樣去設(shè)計(jì),幾乎所有的數(shù)據(jù)庫(kù)都是從上往下設(shè)計(jì)的,TiDB 是一個(gè) bottom-up 的設(shè)計(jì),先定義底層細(xì)胞,在讓它長(zhǎng)成一個(gè)數(shù)據(jù)庫(kù)的樣子。

下一個(gè)問(wèn)題,讓大家思考幾秒鐘,給大家鋪墊一下,左邊的名詞,兩地三中心,異地多活,跨地域數(shù)據(jù)分布能力,本地事務(wù),動(dòng)態(tài)熱點(diǎn)打散,實(shí)時(shí)在線撈數(shù),只讀表。這些功能的共同點(diǎn)是什么?
問(wèn):如果我要去實(shí)現(xiàn)這些功能該怎么去實(shí)現(xiàn)?這些功能背后的共同點(diǎn)是什么?有沒(méi)有一個(gè)關(guān)鍵的點(diǎn),解決了這個(gè)點(diǎn)所有能力都能馬上擁有,有沒(méi)有這樣的東西?



我們?cè)俜棚w一下,原來(lái) Learner 這個(gè)技術(shù)的第一次引用我們想給它找一個(gè)應(yīng)用場(chǎng)景,這個(gè)應(yīng)用場(chǎng)景就是 TiFlash,本來(lái)只是我們腦中一個(gè)小實(shí)驗(yàn),我能不能在這個(gè)細(xì)胞上讓它多復(fù)制一小塊,讓它干點(diǎn)別的事情? 當(dāng)時(shí),我們覺(jué)得 AP 能力不太強(qiáng),需要底層數(shù)據(jù)存儲(chǔ)列存的數(shù)據(jù)結(jié)構(gòu),我們把這個(gè)架構(gòu)在副本上讓它支持列存,于是 TiDB 就有了 HTAP 的能力,在這個(gè)基礎(chǔ)上不到兩年時(shí)間一個(gè)小團(tuán)隊(duì)把整個(gè) Real-Time HTAP 這個(gè)系統(tǒng)就做出來(lái)了。

為什么這么快做出來(lái)?TiFlash 是可調(diào)度性的理念絕佳的一個(gè)例子,而且我腦子里還有很多很奇怪的想法,Real-Time HTAP,TiFlash 只是開(kāi)始。
最細(xì)粒度的調(diào)度能力,可調(diào)度上的調(diào)度能力,我們?cè)龠M(jìn)一步往上看,有一些朋友熟悉 Foreign Data Wrapper(FDW),現(xiàn)在 TiDB 還不支持 Foreign Data Wrapper。這個(gè)功能比較好理解的一個(gè)說(shuō)法,讓 TiDB 把其他的數(shù)據(jù)源當(dāng)作它內(nèi)部一張表來(lái)進(jìn)行查詢,比如說(shuō)當(dāng)這個(gè)功能支持了以后,我可以把 Redis 作為 TiDB 中的一張外表,把 MySQL 數(shù)據(jù)作為一張外表,可以一起關(guān)聯(lián)分析 HBase 這些數(shù)據(jù)。

但是,F(xiàn)DW 意義僅僅停留在"聯(lián)邦查詢"嗎?我在思考這個(gè) feature 是為什么?因?yàn)槲以诳催@個(gè) feature 的時(shí)候聯(lián)想到關(guān)于數(shù)據(jù)庫(kù)的本質(zhì),數(shù)據(jù)庫(kù)這種軟件的本質(zhì)是什么?當(dāng)你拋開(kāi)所有的數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)的能力,拋開(kāi)所有功能,數(shù)據(jù)庫(kù)里面到底存了什么東西?數(shù)據(jù)庫(kù)把所有剛才我說(shuō)的概念都剝離開(kāi),它只干兩件事情,一是存儲(chǔ)真實(shí)的數(shù)據(jù),另外一部分是叫做索引,數(shù)據(jù)庫(kù)無(wú)非就是數(shù)據(jù)和索引,怎么在這兩種概念中輾轉(zhuǎn)騰挪。按照剛才的思路把整個(gè)數(shù)據(jù)庫(kù)當(dāng)成數(shù)據(jù)和索引的容器,索引這個(gè)概念其實(shí)就是一種特殊映射的表關(guān)系,索引也是一張表,你要索引的內(nèi)容對(duì)應(yīng)到數(shù)據(jù)上的映射關(guān)系。


那我們就跟著這個(gè)思路重新思考 FDW。右邊是我的靈魂畫風(fēng),有點(diǎn)難以看懂,今天整個(gè)數(shù)據(jù)庫(kù)行業(yè)的趨勢(shì),其中一個(gè)趨勢(shì)是各種各樣的細(xì)分領(lǐng)域的數(shù)據(jù)庫(kù)誕生,圖數(shù)據(jù)庫(kù),向量搜索數(shù)據(jù)庫(kù),全文檢索數(shù)據(jù)庫(kù),TiDB 能不能把這些數(shù)據(jù)庫(kù)的能力變成它的索引能力?比如說(shuō)我有一張表這里面存儲(chǔ)著用戶的關(guān)系,用戶的信息,大家知道在一個(gè)關(guān)系上的搜索、查詢用圖的模型更好,如果是用傳統(tǒng)的比如說(shuō)我用索引的數(shù)據(jù)結(jié)構(gòu)查詢得很慢,用圖模型可以極大加速這個(gè)性能。如果從這個(gè)角度去思考,TiDB 的索引能夠接入其他的這些數(shù)據(jù)庫(kù),讓其他的數(shù)據(jù)庫(kù)作為 TiDB 的索引,同時(shí)以一個(gè)統(tǒng)一的接口給用戶提供服務(wù),是不是打開(kāi)了新世紀(jì)大門的感覺(jué)?

今天大會(huì)的主題是開(kāi)放×連接×預(yù)見(jiàn)。
我覺(jué)得特別有意思就是這個(gè)“×”號(hào),我也不知道這些東西加進(jìn)去以后能對(duì) TiDB 的生態(tài)帶來(lái)多大的可能性,任何人試圖去預(yù)估它的價(jià)值都是傲慢的,我們能做的就是把這些基礎(chǔ)給開(kāi)發(fā)者打好,這是索引的部分。
我們?cè)侔涯抗馔驴?,?shù)據(jù)庫(kù)的本質(zhì)一個(gè)是數(shù)據(jù),一個(gè)是索引,現(xiàn)在我們看數(shù)據(jù),關(guān)于數(shù)據(jù)大家第一個(gè)聯(lián)想就是存儲(chǔ)引擎,數(shù)據(jù)的存儲(chǔ)是最關(guān)鍵的一個(gè)話題。熟悉 TiDB 整體系統(tǒng)架構(gòu)的同學(xué)肯定對(duì)左邊這張靈魂畫風(fēng)的圖不會(huì)陌生,剛才我提到 TiDB 在內(nèi)部其實(shí)是把數(shù)據(jù)已經(jīng)拆分成了無(wú)數(shù)個(gè)小小的細(xì)胞,每個(gè)細(xì)胞是一個(gè)復(fù)制組,分裂,合并,移動(dòng)。但是在物理層面上存儲(chǔ)我們現(xiàn)在是使用基于 Database 的 Real-time HTAP。TiKV 底層用的是 Rocks DB ,TiFlash 用的存儲(chǔ)引擎我們命名叫 Delta tree,兩種引擎。
還能不能有更多?

在存儲(chǔ)上去體現(xiàn)開(kāi)放性和可調(diào)度性的能力,有一個(gè)基礎(chǔ)的前提就是對(duì)存儲(chǔ)引擎進(jìn)行抽象,熟悉 TiDB 的代碼的同學(xué)如果去看它的代碼倉(cāng)庫(kù),發(fā)現(xiàn)有一個(gè)很有意思的文件夾叫 Engine API,這件事情特別有意思,我直接把代碼放上了,意思就是我們?cè)噲D去對(duì)存儲(chǔ)本身的能力進(jìn)行抽象,這個(gè)抽象是一個(gè)基礎(chǔ)。

這個(gè)抽象的意義在哪?我們?yōu)槭裁醋鲞@件事情?我對(duì)未來(lái)的一個(gè)判斷,為什么一般來(lái)說(shuō)數(shù)據(jù)庫(kù)技術(shù)負(fù)責(zé)人總會(huì)談到性能、功能,為什么今天我們來(lái)討論哲學(xué)?因?yàn)槲矣X(jué)得從更長(zhǎng)的一個(gè)維度來(lái)看,當(dāng)你的軟件在保持高速迭代能力的時(shí)候,它是一個(gè)動(dòng)態(tài)的進(jìn)化過(guò)程,進(jìn)化的終局是什么?
先來(lái)看性能,在 TiDB 發(fā)展過(guò)程中,每一個(gè)版本都保持著 100% 性能提升的速度往前走,可以保持到 6.0,7.0 每次都是百分之百增長(zhǎng),未來(lái)優(yōu)化是無(wú)止境的。我個(gè)人認(rèn)為,不會(huì)說(shuō)發(fā)明了一種新的硬件和算法解決了全世界所有應(yīng)用場(chǎng)景的性能問(wèn)題,粒度會(huì)變得越來(lái)越細(xì),有一些優(yōu)化用于某些具體場(chǎng)景,比如用來(lái)存用戶的關(guān)聯(lián)和關(guān)系就是圖的模型最好。但是有一點(diǎn),我覺(jué)得用戶不用去關(guān)心他在使用什么樣的數(shù)據(jù)庫(kù)的結(jié)構(gòu),哪一塊數(shù)據(jù)在使用哪一種數(shù)據(jù)結(jié)構(gòu),這些都不重要。
右邊的圖透露了 TiDB 在做的巨大的一個(gè)事情,信息量非常大,我們做的事情,剛才 Engine API 的抽象讓我們能做一件事情,熟悉 TiDB 的朋友都知道,我們?cè)谝慌_(tái)存儲(chǔ)節(jié)點(diǎn)上是共享一個(gè)存儲(chǔ)引擎,現(xiàn)在我們慢慢對(duì)每一塊數(shù)據(jù)分片,每一個(gè)細(xì)胞讓它能夠自己擁有自己的存儲(chǔ)引擎,這個(gè)事情在我們實(shí)驗(yàn)室里已經(jīng)做完了,效果非常棒,當(dāng)時(shí)都震驚了。
下一步發(fā)展,當(dāng)我把數(shù)據(jù)的細(xì)胞存儲(chǔ)拆分了以后,下一步到底是不是 Delta tree 這件事情不重要了,比如我有一部分?jǐn)?shù)據(jù)在業(yè)務(wù)場(chǎng)景里面一年只訪問(wèn)一次,但是不能丟,我又不希望用 SSD 來(lái)存,我能不能用云上 S3 的存儲(chǔ),甚至在一張表里面的一個(gè)數(shù)據(jù)特別熱,對(duì)一致性要求沒(méi)有那么高,是不是能在內(nèi)存中對(duì)這一塊數(shù)據(jù)的形態(tài)做一個(gè)變換。而且更有意思的是,這些所有的變換都是動(dòng)態(tài)的,對(duì)業(yè)務(wù)都是透明的,回想剛才我說(shuō)的可調(diào)度性和細(xì)胞這幾個(gè)概念。

我剛才說(shuō)所有這些技術(shù)都是為了一件事情,都需要構(gòu)建在一個(gè)基礎(chǔ)上,剛才我說(shuō)了分布式系統(tǒng)的終局,分布式系統(tǒng)可調(diào)度是它的核心優(yōu)勢(shì),這個(gè)基礎(chǔ)我相信各位大概能夠猜出是什么,我需要有一個(gè)近乎無(wú)限的彈性資源池,就是云。關(guān)于云的重要性我覺(jué)得現(xiàn)在整個(gè)行業(yè)還在低估,現(xiàn)在天天說(shuō)云,但是我覺(jué)得云其實(shí)是構(gòu)建未來(lái)新一代軟件的最重要的一個(gè)基石。
我覺(jué)得對(duì)于云有一個(gè)很好的說(shuō)法,我作為一個(gè)軟件工程師看待云就像什么?我用了無(wú)限的資源,就像一堆積木我怎么去拼,手上有多少錢能拼成什么樣子。右邊這張圖是 Flink 的架構(gòu),F(xiàn)link 是一個(gè)很有意思的產(chǎn)品,它上市有各種各樣的新聞,但是我最早注意到它是在 2016 年,它發(fā)表第一篇論文的時(shí)候,我看那篇論文,是我這幾年最喜歡的論文之一,那篇論文更大意義在于它開(kāi)創(chuàng)了一種新的軟件設(shè)計(jì)的思路,開(kāi)創(chuàng)了新的物種,基于云的服務(wù)去構(gòu)建的基礎(chǔ)軟件,它是第一個(gè),但絕對(duì)不是最后一個(gè),TiDB 在這個(gè)領(lǐng)域是走在最前面的軟件之一。



所以,大膽預(yù)測(cè)一下,剛才那個(gè)公式“可插拔性 × 調(diào)度能力 × 云上幾乎無(wú)限的資源 = ?”,數(shù)據(jù)庫(kù)作為一個(gè)獨(dú)立的軟件形態(tài)我認(rèn)為會(huì)被顛覆,同時(shí)意味著整個(gè)數(shù)據(jù)庫(kù)的“數(shù)據(jù)服務(wù)平臺(tái)化”會(huì)崛起,我們下一代很多在場(chǎng)的各位為人父母,下一代的小朋友可能到他們寫程序的年紀(jì),可能不知道什么是 CPU,什么是內(nèi)存,什么是磁盤,什么是操作系統(tǒng),可能看到的就是一個(gè)個(gè)云服務(wù),比如要用數(shù)據(jù)庫(kù)的時(shí)候好象有一個(gè) TiDB 的東西,我把信用卡綁上去之后就可以直接用一個(gè) SQL 的接口里操作就完了,不需要知道什么叫索引, 什么叫 Delta tree。
我們回頭看一下今天我們大會(huì)三個(gè)關(guān)鍵字,開(kāi)放,連接,預(yù)見(jiàn),只有開(kāi)放的架構(gòu)才能有更多連接,更多的連接才能讓我們有更好未來(lái),這是今天我關(guān)于 TiDB 的技術(shù)和設(shè)計(jì)理念的分享。

