掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者 | 沈劍

成都創(chuàng)新互聯(lián)專注于中大型企業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè)和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶上千余家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注品牌網(wǎng)站設(shè)計(jì)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!
在做業(yè)務(wù)架構(gòu)的過程中,你是否遇到過類似的痛點(diǎn)?
(1)數(shù)據(jù)量太大,容量復(fù)雜性上移到業(yè)務(wù)層;
(2)并發(fā)量太大,性能復(fù)雜性上移到業(yè)務(wù)層;
(3)前臺(tái)與后臺(tái)存儲(chǔ)異構(gòu),滿足不同查詢需求;
(4)線上與線下存儲(chǔ)異構(gòu),滿足大數(shù)據(jù)需求;
(5)存儲(chǔ)系統(tǒng)遷移成本高,不敢輕易做重構(gòu);
(6)...
職業(yè)生涯十五年,基本都在使用MySQL做線上業(yè)務(wù)的存儲(chǔ)。最近這幾年,遇到的問題慢慢多起來,嚴(yán)重影響了研發(fā)效率。TiDB近年甚火,于是最近做了一些調(diào)研,與大家分享。
如一貫風(fēng)格,更多的聊:TiDB究竟解決什么問題,以及為什么這么設(shè)計(jì),體現(xiàn)什么架構(gòu)思想。
上面這幅MySQL體系結(jié)構(gòu)圖,相信很多人都見過:
畫外音:太復(fù)雜了,字都看不清了。
對(duì)MySQL體系結(jié)構(gòu)做了一個(gè)簡(jiǎn)化:
如上圖所示:
畫外音:對(duì)不起,忍一下我畫的丑圖。
核心的服務(wù)端,又主要分為兩層:
計(jì)算層和存儲(chǔ)層,既然都在一個(gè)MySQL進(jìn)程里,所有的CPU資源,內(nèi)存資源都是共享的,勢(shì)必存在資源爭(zhēng)搶的耦合。
除了天生的不足,在數(shù)據(jù)量大,并發(fā)量大的典型互聯(lián)網(wǎng)業(yè)務(wù)場(chǎng)景里,對(duì)于MySQL的使用,還有哪些痛點(diǎn)呢?
我們都知道,當(dāng)讀寫量增加的時(shí)候,通常會(huì)對(duì)MySQL做主從分組集群:
如上圖所示:主從同步,讀寫分離,通過線性增加從庫來線性擴(kuò)展系統(tǒng)的讀性能。
畫外音:大部分業(yè)務(wù),讀容易成為主要矛盾。
我們也知道,當(dāng)存儲(chǔ)容量增加的時(shí)候,通常會(huì)對(duì)MySQL做水平切分集群:
如上圖所示:用一個(gè)鍵值進(jìn)行數(shù)據(jù)分片,以實(shí)現(xiàn)更大的存儲(chǔ)容量。
所以,實(shí)際上線上的MySQL集群是這樣的:
而分片和分組,都是調(diào)用方微服務(wù)需要關(guān)注的,這就引出了下一個(gè)痛點(diǎn):
另外,除了在線應(yīng)用,絕大部分互聯(lián)網(wǎng)公司都有各類大數(shù)據(jù)處理的需求:
為了滿足這類需求,又需要將MySQL中的數(shù)據(jù)同步到各類大數(shù)據(jù)體系的集群中:
用一系列大數(shù)據(jù)的技術(shù)體系,去解決各類大數(shù)據(jù)處理的需求。
這就引出了另一個(gè)痛點(diǎn):
當(dāng)然,很多技術(shù)管理者也會(huì)調(diào)研各類替代產(chǎn)品,以解決上述1-3的問題,例如NoSQL的代表之一MongoDB,無奈【4】升級(jí)遷移需要大量的系統(tǒng)改造,綜合評(píng)估之后,往往不得不放棄遷移方案,繼續(xù)忍受MySQL帶來的各種問題。
歷史的痛點(diǎn),往往是創(chuàng)新的機(jī)會(huì)。
TiDB,它來了!
TiDB是如何設(shè)計(jì),以解決:
(1) 計(jì)算與存儲(chǔ)耦合;
(2) 存儲(chǔ)底層的復(fù)雜性轉(zhuǎn)移;
(3) 大數(shù)據(jù)體系復(fù)雜性轉(zhuǎn)移;
(4) 系統(tǒng)遷移成本高;
等問題的呢?
首先,TiDB在誕生之初,就確定了:
的設(shè)計(jì)大方向。
如上圖所示:
如此一來,難題 (1) 和 (4) 就得到了解決。
對(duì)于計(jì)算層,實(shí)現(xiàn)連接池,語法分析,語義分析,查詢優(yōu)化等模塊,做到無狀態(tài),并通過集群的方式擴(kuò)展,這就是TiDB體系結(jié)構(gòu)中的“計(jì)算引擎tidb-server”集群。對(duì)于調(diào)用方,接入層TiDB集群就是入口,其背后的復(fù)雜性對(duì)上游不可見。上圖中,簡(jiǎn)記為【接入層(計(jì)算層)】。
畫外音:微服務(wù)架構(gòu)中,站點(diǎn)應(yīng)用和微服務(wù)層也必須無狀態(tài)化,以實(shí)現(xiàn)輕易的集群擴(kuò)展,也是一個(gè)道理。
對(duì)于存儲(chǔ)層,實(shí)現(xiàn)一致性算法,分布式事務(wù),MVCC并發(fā)控制,算子下推等模塊,實(shí)現(xiàn)原子KV存儲(chǔ),也能通過集群的方式自動(dòng)擴(kuò)展,這就是TiDB體系結(jié)構(gòu)中的“存儲(chǔ)引擎TiKV-server” 集群。上圖中,簡(jiǎn)記為【存儲(chǔ)層】。
畫外音:這與GFS中的chunk-server很像,有了它,不再需要手動(dòng)水平切分?jǐn)U容了。
除此之外,需要一個(gè)擁有全局視野,實(shí)現(xiàn)元數(shù)據(jù)存儲(chǔ),ID分配(key-id,事務(wù)ID),時(shí)間戳生成,心跳檢測(cè),集群信息收集等模塊的master,這就是TiDB體系結(jié)構(gòu)中的“PD-server”集群。上圖中,簡(jiǎn)記為【管理層】。
畫外音:這與GFS中的master-server很像。
如此一來,難題 (2) 存儲(chǔ)底層讀寫容量與存儲(chǔ)容量的復(fù)雜性轉(zhuǎn)移問題,也得到了解決。
大數(shù)據(jù)體系的復(fù)雜性,TiDB也將其屏蔽在了內(nèi)部:
畫外音:TiKV和TiFlash分別獨(dú)立存儲(chǔ),且進(jìn)行異步數(shù)據(jù)同步,彼此解耦。
如此一來,難題 (3) 大數(shù)據(jù)數(shù)據(jù)同步,數(shù)據(jù)一致性,大數(shù)據(jù)集群的復(fù)雜性的問題,也得到了解決。
TiDB的架構(gòu),無處不體現(xiàn)著這樣的設(shè)計(jì)原則:使用者簡(jiǎn)單易用,復(fù)雜麻煩的地方,都屏蔽到TiDB的內(nèi)部。
回到開篇,如果你也正經(jīng)歷著類似的痛點(diǎn)?
不妨,試一試TiDB。
從MySQL到TiDB的遷移過程也非常平滑:
(1) 第一步,保持服務(wù)讀寫原有MySQL集群;
(2) 第二步,將原有MySQL集群中的數(shù)據(jù),同步到TiDB;
畫外音:TiDB的工具集很全,本文沒有擴(kuò)展介紹。
(3) 第三步,服務(wù)流量切換至TiDB;
畫外音:由于保持MySQL協(xié)議,業(yè)務(wù)代碼幾乎不用修改,這是TiDB能夠成功很重要的一個(gè)原因。
今天聊了聊TiDB體系結(jié)構(gòu)的宏觀設(shè)計(jì)原則,希望大家有收獲。如果對(duì)TiDB的內(nèi)核感興趣,未來可以和大家聊聊它的實(shí)現(xiàn)細(xì)節(jié)。
畫外音:大家感興趣嗎?
源碼:https://github.com/pingcap/tidb

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流