我是如何低效的看TiKV代碼的(序)

為什么要看TiKV

空間和時(shí)間-----魚和熊掌

我們一致在為空間和時(shí)間的平衡而在做妥協(xié)。在時(shí)間昂貴的場(chǎng)景,就使用空間來(lái)?yè)Q時(shí)間,在空間昂貴的時(shí)候,就用時(shí)間來(lái)?yè)Q空間。
當(dāng)我們開始分布式、大數(shù)據(jù)、高并發(fā)的場(chǎng)景時(shí)候,數(shù)據(jù)量大到一定的程度,時(shí)間開始變的昂貴。而追溯所有的問題根源,似乎都是IO的問題。
在一個(gè)業(yè)務(wù)剛剛起步的時(shí)候,一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)加一個(gè)Web應(yīng)用似乎就可以解決問題。但是當(dāng)用戶開始增多,數(shù)據(jù)量變大的時(shí)候,
似乎所有人都在考慮使用分庫(kù)分表的策略。

當(dāng)然,這里我還是保持一點(diǎn)點(diǎn)的懷疑態(tài)度,為什么要分庫(kù)分表?單機(jī)性能到底受限于什么,這個(gè)我還是沒有弄明白。
無(wú)論是說(shuō)數(shù)據(jù)表大的話,索引表會(huì)很大,會(huì)占用很多內(nèi)存,同時(shí)索引在缺頁(yè)的情況下頻繁的做LRU頁(yè)替換,性能有很大的損失;
還是數(shù)據(jù)庫(kù)的單表過(guò)大會(huì)引起單點(diǎn)問題。。。
理性的分析一下,數(shù)據(jù)庫(kù)的索引應(yīng)該不會(huì)占用太多的內(nèi)存導(dǎo)致內(nèi)存一直在切換、同時(shí)現(xiàn)在的數(shù)據(jù)庫(kù)都在使用SSD,尋道等問題已經(jīng)消失;
還有人說(shuō)MySQL在百萬(wàn)級(jí)別的數(shù)量的時(shí)候性能還行,千萬(wàn)的時(shí)候性能衰減嚴(yán)重,但立刻有人說(shuō)現(xiàn)在跑這大幾千萬(wàn)的單表應(yīng)用也沒有關(guān)系。。
諸多理由似乎都沒有解釋清楚為什么在現(xiàn)在一定要使用分庫(kù)分表策略來(lái)拆解大應(yīng)用。

我能想到的是在偏離線的數(shù)據(jù)分析場(chǎng)景下,對(duì)group by, order, count 以及一些子查詢有更多的需求,在這種場(chǎng)景下,
IO的問題就被凸顯出來(lái)了。IO的極限很容易理解。

拿空間換取點(diǎn)時(shí)間!!

這種情況下樸素的想法也是做歸并嘛,拆解問題嘛,當(dāng)然就是數(shù)據(jù)備份好幾份,每個(gè)上面處理一個(gè)子任務(wù),然后在合并起來(lái)唄。
這里優(yōu)化的空間可就大了(水深),當(dāng)然可以不備份多份數(shù)據(jù),而是根據(jù)一定的規(guī)則將數(shù)據(jù)分散的保存在不同的機(jī)器上。
子任務(wù)處理完成之后合并結(jié)果。

復(fù)雜度守恒定律

復(fù)雜度不會(huì)減少,只會(huì)轉(zhuǎn)移。

在我們面對(duì)有大量的數(shù)據(jù)需要做處理的時(shí)候,基本是兩個(gè)套路:

  1. 分庫(kù)分表,數(shù)據(jù)在什么地方業(yè)務(wù)自己來(lái)做處理
  2. 全部采用分布式的方案來(lái)解決。比如Google的全家桶, BigTable、Spanner、F1

SQL的查詢語(yǔ)言在設(shè)計(jì)初衷其實(shí)是為了屏蔽數(shù)據(jù)存儲(chǔ)信息,用戶只管去倉(cāng)庫(kù)中找數(shù)據(jù)就可以了。當(dāng)我們開始注意如何建立索引,如何優(yōu)化SQL
的時(shí)候,這個(gè)事情本身就跟初衷背道而馳。現(xiàn)在還需要關(guān)心分庫(kù)分表,手動(dòng)的寫兩階段事務(wù),心智負(fù)擔(dān)的確非常重。

那么分布式的數(shù)據(jù)庫(kù),特別是一個(gè)全特性支持SQL的分布式數(shù)據(jù)庫(kù)是一個(gè)什么樣子呢,引起了我的好奇心。
TiDB/TiKV 恰好是一個(gè)工業(yè)級(jí)別的開源產(chǎn)品,Talk is cheap , show me the code.

在分布式數(shù)據(jù)庫(kù)中一個(gè)Insert 語(yǔ)句會(huì)怎么執(zhí)行呢?

帶著這個(gè)問題,我們來(lái)一起看看TiDB是如何做到

準(zhǔn)備工作

Windows 用戶要不就用個(gè)虛擬機(jī)?(微笑)

TiDB 依賴的幾個(gè)工程

https://github.com/pingcap/tidb
https://github.com/pingcap/tikv
https://github.com/pingcap/pd
https://github.com/pingcap/kvproto
https://github.com/pingcap/raft-rs
https://github.com/pingcap/rust-rocksdb

安裝golang && rust

  1. 可以使用Linux 的包管理工具下載,或者去官網(wǎng)下載相應(yīng)的發(fā)行包
  2. 使用make編譯tikv
  3. 推薦使用emacs(spacemacs) + playground插件,在遇到語(yǔ)言層不理解的地方,用playground寫一點(diǎn)小程序,看看結(jié)果

PS: 當(dāng)然也可以使用IntelliJ全家桶,已經(jīng)發(fā)布了golang, rust的版本,或者使用VS code.

公欲善其事必先利其器。準(zhǔn)備好趁手的工具,就開始看代碼啦~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容