一、OceanBase、TiDB這類NewSQL的定位
oceanbase tidb spanner是share nothing的架構(gòu),單個(gè)分區(qū)有paxos保證可用性的前提下,還有近乎線性的擴(kuò)展能力,而代價(jià)是復(fù)雜查詢和DML,不一定都能生成下推執(zhí)行的plan,要么無(wú)法執(zhí)行要么執(zhí)行很慢。再有就是分布式事務(wù)一致性的代價(jià),分布式快照讀代價(jià)較大。
mysql GR更像share data的rac和pureScale,容量和計(jì)算的擴(kuò)展能力有限,它們的出現(xiàn)更多的意義是對(duì)傳統(tǒng)的單機(jī)mysql oracle db2在可用性上的補(bǔ)充。使用起來(lái)與傳統(tǒng)單機(jī)實(shí)例沒(méi)有差別。
首先要明確的是,沒(méi)有完美的系統(tǒng),任何一個(gè)系統(tǒng)的出現(xiàn)都是為了解決當(dāng)時(shí)最主要的問(wèn)題,但是會(huì)產(chǎn)生一些其他的小問(wèn)題,跟藥一樣,能治病,但是一般都會(huì)有副作用。
那么完美的數(shù)據(jù)庫(kù)系統(tǒng)什么樣呢,我現(xiàn)在能想到以下幾點(diǎn):
1.易用與靈活性:數(shù)據(jù)庫(kù)可以理解自然語(yǔ)言,我跟它說(shuō)我要存儲(chǔ)什么樣的數(shù)據(jù),就存進(jìn)去了,要查詢什么樣的數(shù)據(jù),就給我取出來(lái)了,不需要我告訴它怎么存,怎么取
2.擴(kuò)展性:可以存儲(chǔ)無(wú)限多的數(shù)據(jù),不需要擔(dān)心容量的問(wèn)題
3.高性能:性能非常強(qiáng)大,不管想存或取什么數(shù)據(jù),瞬間就完成了
4.高可用:數(shù)據(jù)存儲(chǔ)之后,永遠(yuǎn)也不會(huì)丟,系統(tǒng)永遠(yuǎn)也不會(huì)掛掉,1年365天,1天24小時(shí)隨叫隨到
5.并發(fā)與隔離性:數(shù)據(jù)庫(kù)不僅可以滿足我一個(gè)人,也可以滿足所有人的同時(shí)讀寫(xiě),并且我們之間互不干擾
關(guān)系數(shù)據(jù)庫(kù)之前的存儲(chǔ)系統(tǒng)基本上一個(gè)條件也不滿足
傳統(tǒng)單機(jī)關(guān)系數(shù)據(jù)庫(kù)一定程度上解決了問(wèn)題1、3、5,用戶不需要知道數(shù)據(jù)是怎么存儲(chǔ)的,行存儲(chǔ)還是列存儲(chǔ)或者其他的結(jié)構(gòu)信息,查詢的時(shí)候用SQL就可以了,不需要根據(jù)數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)編寫(xiě)特定的程序,大大簡(jiǎn)化了應(yīng)用開(kāi)發(fā),性能也還可以。之所以說(shuō)是一定程度上,是因?yàn)椴](méi)有完美的解決。SQL雖然很簡(jiǎn)單,但要比自然語(yǔ)言復(fù)雜得多,更改表的schema也不是特別方便;性能的話對(duì)于復(fù)雜查詢,優(yōu)化器無(wú)能為力,可能會(huì)給出性能非常差的查詢計(jì)劃;并發(fā)與隔離性可以做到,但是要犧牲性能
Mysql Group Replication幫助傳統(tǒng)單機(jī)關(guān)系數(shù)據(jù)庫(kù)解決了問(wèn)題4
如果數(shù)據(jù)量不大,這樣用著也不錯(cuò)了。但是互聯(lián)網(wǎng)導(dǎo)致了數(shù)據(jù)量的爆炸式增長(zhǎng),單機(jī)存儲(chǔ)不下這么多數(shù)據(jù)了。所以才會(huì)出現(xiàn)了Bigtable等NoSQL分布式數(shù)據(jù)庫(kù),解決當(dāng)時(shí)最主要的數(shù)據(jù)量暴增問(wèn)題。這些系統(tǒng)一定程度上解決了問(wèn)題2、3、4。它想不想解決其他問(wèn)題呢?肯定想,但是要解決這些問(wèn)題,系統(tǒng)會(huì)變得更加復(fù)雜,需要更長(zhǎng)的時(shí)間,但是系統(tǒng)需要快速上線啊,那么就先把最主要的問(wèn)題解決了就好。隔離性就由業(yè)務(wù)部門自己去解決吧,這也導(dǎo)致了后來(lái)業(yè)務(wù)部門很多的抱怨。所以我覺(jué)得NoSQL在開(kāi)發(fā)的時(shí)候是有很多妥協(xié)的,屬于救火的產(chǎn)品,不可能成為未來(lái)的方向。
目前看來(lái)OceanBase、TiDB、Spanner/F1這些系統(tǒng)是能夠解決上述問(wèn)題非常多的系統(tǒng)。
1.支持SQL
2.數(shù)據(jù)被拆分成一個(gè)個(gè)range,分散在不同的服務(wù)器中,通過(guò)增加服務(wù)器就可以一定程度上的線性擴(kuò)容
4.多副本,并且通過(guò)paxos或raft保證多副本之間的一致性
5.通過(guò)2PC,MVCC支持不同隔離級(jí)別的事物
但是相比高端服務(wù)器上的單機(jī)數(shù)據(jù)庫(kù),性能會(huì)有些問(wèn)題
查詢的延遲(latency)會(huì)比較高,網(wǎng)絡(luò)是一個(gè)問(wèn)題,比如分布式j(luò)oin就要用到網(wǎng)絡(luò),有人做過(guò)實(shí)驗(yàn),在不改變現(xiàn)有查詢引擎的情況下,單條查詢隨著服務(wù)器數(shù)量增多,性能不增反降,把網(wǎng)絡(luò)換成InfiniBand效果也不好,后來(lái)重新設(shè)計(jì)了查詢引擎,性能做到了遞增。可以參考High-Speed Query Processing over High-Speed Networks(
http://www.vldb.org/pvldb/vol9/p228-roediger.pdf
)
所以需要改變很多傳統(tǒng)的做法,針對(duì)新硬件進(jìn)行新的設(shè)計(jì)、優(yōu)化,是可以大幅度提高性能的。
未來(lái)不敢說(shuō),單機(jī)數(shù)據(jù)庫(kù)在很多場(chǎng)景下還是會(huì)有廣泛應(yīng)用的,NewSQL最起碼接下來(lái)的幾年里都還有很大的發(fā)展?jié)摿Γ鳱oSQL,分布式中間件等方案基本上就是明日黃花了。
延伸閱讀:
二、數(shù)據(jù)庫(kù)的查詢功能實(shí)現(xiàn)原理
數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的最主要功能之一。我們都希望查詢數(shù)據(jù)的速度能盡可能的快,因此數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)者會(huì)從查詢算法的角度進(jìn)行優(yōu)化。最基本的查詢算法當(dāng)然是順序查找(linear search),這種復(fù)雜度為O(n)的算法在數(shù)據(jù)量很大時(shí)顯然是糟糕的,好在計(jì)算機(jī)科學(xué)的發(fā)展提供了很多更優(yōu)異的查找算法,例如二分查找(binary search)、二叉樹(shù)查找(binary tree search)等。如果稍微分析一下會(huì)發(fā)現(xiàn),每種查找算法都只能應(yīng)用于特定的數(shù)據(jù)結(jié)構(gòu)之上,例如二分查找要求被檢索數(shù)據(jù)有序,而二叉樹(shù)查找只能應(yīng)用于二叉查找樹(shù)上,但是數(shù)據(jù)本身的組織結(jié)構(gòu)不可能完全滿足各種數(shù)據(jù)結(jié)構(gòu)(例如,理論上不可能同時(shí)將兩列都按順序進(jìn)行組織),所以,在數(shù)據(jù)之外,數(shù)據(jù)庫(kù)系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級(jí)查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。