為了讓你搞定數(shù)據(jù)庫選型,這些工程師重寫了 26 萬行代碼(數(shù)據(jù)庫代碼抄寫)
無論多么有主見的架構(gòu)師,在做數(shù)據(jù)庫選型的時(shí)候,也可能會(huì)犯難。
傳統(tǒng) SOL、NoSQL 還是 NewSQL?架構(gòu)風(fēng)格是以 久經(jīng)考驗(yàn)的關(guān)系型數(shù)據(jù)庫為主,還是偏向所謂原生的分布式架構(gòu)?如果提及具體產(chǎn)品,那選擇就更多了,TiDB、OceanBase、PolarDB、TDSQL、GaussDB、MongoDB…… 現(xiàn)在還有許多服務(wù)于新場(chǎng)景的產(chǎn)品,比如處理時(shí)序數(shù)據(jù)的 TDengine,處理圖數(shù)據(jù)的 Nebula Graph……以及最老派又最完善的 Oracle。
如果從業(yè)務(wù)場(chǎng)景或即將面臨的遷移成本來看,問題會(huì)更加復(fù)雜。牽扯到底層數(shù)據(jù)的選型和架構(gòu)設(shè)計(jì),有時(shí)更像一錘子買賣,一旦定了某種方案,再想替換代價(jià)可不是一般的大。
差不多在 10 年前,這事兒還沒有那么棘手。Oracle、IBM Db2,二選一而已。但今時(shí)不同往日,這是一個(gè)數(shù)據(jù)量急速膨脹、業(yè)務(wù)高度復(fù)雜的時(shí)代,真正讓人焦慮的不是單純的選型問題,而是將“降本提效”推向極致的數(shù)字化轉(zhuǎn)型問題。
那么,除了咬牙硬選一個(gè)數(shù)據(jù)庫,或者基于現(xiàn)有數(shù)據(jù)庫的基礎(chǔ)上自研一套存儲(chǔ)方案,真的沒有其他路可走了嗎?其實(shí)也有,只不過在分布式數(shù)據(jù)庫熱度越來越高的當(dāng)下,顯得有些“透明”,那就是中間件 多商業(yè)數(shù)據(jù)庫的解決方案。
看到這個(gè)答案,你可能會(huì)有些失望。中間件方案出現(xiàn)的時(shí)間,尚在分布式數(shù)據(jù)庫成熟之前。因此在業(yè)內(nèi)很多架構(gòu)師看來,這種方案在技術(shù)上不夠超前,只能算是某種“過渡策略”,本質(zhì)上是 NewSQL 數(shù)據(jù)庫成熟前的無奈之舉。
但來自金融等行業(yè)的諸多落地實(shí)踐證明,事實(shí)可能并非如此。
我們?yōu)榇颂貏e采訪了 全球頂級(jí)開源項(xiàng)目、數(shù)據(jù)庫中間件產(chǎn)品 Apache ShardingSphere 的作者,以及背后商業(yè)公司 SphereEx 的 CEO 張亮,他一直對(duì)分布式架構(gòu)設(shè)計(jì)保持關(guān)注,曾是京東科技架構(gòu)專家、當(dāng)當(dāng)架構(gòu)部總監(jiān)。關(guān)于整個(gè)數(shù)據(jù)庫行業(yè)的選型和架構(gòu)設(shè)計(jì)問題,張亮有著特別的思考。
可插拔架構(gòu),或許是答案
“需求是多元化的,一部分用戶適合分布式數(shù)據(jù)庫,一部分用戶適合用數(shù)據(jù)庫中間件,甚至還有一部分適合兩種都用,沒有太絕對(duì)的答案”,張亮說。
這是個(gè)無錯(cuò)的答案,但也可以得出一個(gè)推論:如果場(chǎng)景是多元化的,數(shù)據(jù)庫是多元化的,那么架構(gòu)師應(yīng)該盡量規(guī)避擴(kuò)展性、兼容性不好的數(shù)據(jù)庫解決方案。
無獨(dú)有偶,Oracle ACE、數(shù)據(jù)庫專家韓鋒也在其個(gè)人公眾號(hào)里發(fā)表過類似的觀點(diǎn):“(關(guān)于數(shù)據(jù)庫選型)為了規(guī)避路線選擇、廠商綁定的風(fēng)險(xiǎn),比較現(xiàn)實(shí)的方法是選擇一款兼容通用性協(xié)議的產(chǎn)品,并且在應(yīng)用中僅使用標(biāo)準(zhǔn)數(shù)據(jù)庫的用法?!?/span>
二者結(jié)合起來,我們能抽離出一些關(guān)鍵詞:中立、兼容、標(biāo)準(zhǔn),對(duì)于很多在選型問題上難以抉擇的架構(gòu)師來說,這讓中間件路線看起來更加實(shí)際。
與數(shù)據(jù)庫行業(yè)不同,以 ShardingSphere 為代表的中間件層由于不涉及存儲(chǔ)引擎,如今已將目光從單純的水平擴(kuò)展問題轉(zhuǎn)向業(yè)務(wù)支持和靈活性問題,也因此得以實(shí)現(xiàn)對(duì)異構(gòu)數(shù)據(jù)庫的統(tǒng)一管理。
靈活性、兼容性,是數(shù)據(jù)庫中間件產(chǎn)品的核心,也是解決“數(shù)據(jù)庫選型”問題的關(guān)鍵。據(jù)張亮透露,近兩年的主要研發(fā)重點(diǎn)一直是可插拔架構(gòu),以將靈活性和兼容性推向極致。好消息是,ShardingSphere 的可插拔架構(gòu)預(yù)計(jì)將在未來一段時(shí)間內(nèi)正式上線。
所謂的可插拔架構(gòu),是指在架構(gòu)層面,將整個(gè)系統(tǒng)分為基座和插件兩部分,插件部分互相隔離、互不影響,基座可以自由接入多個(gè)插件。可插拔架構(gòu)多見于相對(duì)輕量級(jí)的前端領(lǐng)域,屬于微前端體系的一部分,但在基礎(chǔ)軟件部分則相當(dāng)少見。
張亮認(rèn)為,可插拔架構(gòu)形式是未來數(shù)據(jù)庫中間件的主要趨勢(shì)之一,一則產(chǎn)品需要高度的靈活性,二則還有大量的能力需要被構(gòu)建,比如數(shù)據(jù)安全、異構(gòu)數(shù)據(jù)網(wǎng)關(guān)等功能,可插拔架構(gòu)自然成為了產(chǎn)品核心。
話雖如此,但可插拔架構(gòu)的設(shè)計(jì)難度卻很大,讓人望而生畏。這種設(shè)計(jì)難度,大致分可為兩部分來談:
第一,可插拔架構(gòu)是對(duì) OCP(Open-Closed Principle)原則的一次徹底執(zhí)行,力圖僅通過增加新模塊來滿足新需求,舊有模塊完全保持 0 修改。這意味著,可插拔架構(gòu)要清晰地定義出,什么是基座,什么是插件。它對(duì)上層、下層都無感知,一切面向接口。用張亮的話說,就是:“完全面向一個(gè)抽象的、虛無的東西,不涉及任何的業(yè)務(wù)細(xì)節(jié)”。
比如,ShardingSphere 轉(zhuǎn)向可插拔架構(gòu)后,其核心流程里已經(jīng)沒有分片功能了,分片會(huì)作為可插拔能力的一部分接入到服務(wù)中。對(duì)于數(shù)據(jù)庫中間件來說,幾乎屬于產(chǎn)品重定義。與許多人對(duì)數(shù)據(jù)庫中間件的固有認(rèn)知相悖,因?yàn)樵谠S多人的理解中,數(shù)據(jù)庫中間件不就是為了分庫分表而存在的嗎?
但實(shí)際情況是,單體數(shù)據(jù)庫的覆蓋場(chǎng)景依然很多,分庫分表并不是 0 級(jí)功能。這是在架構(gòu)層面,必須具備的關(guān)鍵洞察。
第二,與微服務(wù)相似,只要涉及服務(wù)拆分,就會(huì)涉及顆粒度問題。對(duì)于可插拔架構(gòu)來說,需要插件化的不一定只是產(chǎn)品功能,比如兩階段強(qiáng)一致事務(wù)和柔性事務(wù),也是能夠?qū)崿F(xiàn)可插拔的。
基于這些拆分問題,ShardingSphere 把可插拔架構(gòu)分為三層,分別是內(nèi)核層、功能層、生態(tài)層,分別面向數(shù)據(jù)庫內(nèi)核、企業(yè)功能、數(shù)據(jù)庫生態(tài)進(jìn)行可插拔設(shè)計(jì)。其中,查詢優(yōu)化器、分布式事務(wù)引擎、調(diào)度引擎等是內(nèi)核層的可插拔模塊;數(shù)據(jù)分片、讀寫分離、數(shù)據(jù)庫高可用、數(shù)據(jù)加密、影子庫都是功能層的可插拔模塊;數(shù)據(jù)庫協(xié)議、SQL 方言等則是生態(tài)層的可插拔模塊。
要實(shí)現(xiàn)可插拔架構(gòu),除了設(shè)計(jì)難度和顆粒度拆分,其工作量也令人嘆為觀止。ShardingSphere 有 190 多個(gè)模塊,近 43 萬行代碼,核心 Java 代碼 29 萬行,張亮回憶道:“為了做可插拔架構(gòu),老代碼留了不到 1/10。”這意味著,有近 26 萬行的核心代碼被重寫了。
可插拔架構(gòu)是 ShardingSphere 追求靈活性最重要的標(biāo)志之一,但它對(duì)靈活性的追求又不僅限于可插拔架構(gòu)。
比如,ShardingSphere 還額外提供了兩種部署形態(tài),分別為 JDBC 和 Proxy。JDBC 是 Java 訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)接口,Proxy 是中間件最常見的服務(wù)形式,且兩者經(jīng)常能夠在同一環(huán)境下進(jìn)行混用,以滿足多用戶下多類型訪問的需求。
這樣多種類型的服務(wù)接口,一方面服務(wù)了不同類型的開發(fā)人員,另一方面也實(shí)現(xiàn)了性能層面的可定制化,工程師可以結(jié)合場(chǎng)景調(diào)整數(shù)據(jù)庫分片的鍵值,實(shí)現(xiàn)不同場(chǎng)景下,性能的最大化提升;反之,“全包式”數(shù)據(jù)庫方案,則往往需要放棄部分靈活性,以相對(duì)中庸的方案來換取無感知、低侵入的使用體驗(yàn),體現(xiàn)了與數(shù)據(jù)庫中間件方案的差異性。
真正的開源項(xiàng)目,是社區(qū)說了算
如果我們要做技術(shù)選型,需要注意的另外一點(diǎn)是,備選產(chǎn)品的維護(hù)主體是誰,備選產(chǎn)品的基因是什么,是開源,還是閉源?這與搞清楚產(chǎn)品的技術(shù)方案、技術(shù)理念同樣重要。
當(dāng)下,無論開源的熱度如何,大部分分布式中間件、分布式存儲(chǔ)、數(shù)據(jù)庫都是閉源的,這是不爭(zhēng)的事實(shí)。
看到的是,大量的開源創(chuàng)業(yè)公司正在出現(xiàn),資本也在快速進(jìn)入,比如 SphereEx、歐若數(shù)網(wǎng)、Neo4j,以及大家熟知的 PingCAP。同時(shí)也有許多數(shù)據(jù)庫宣布開放源代碼,比如 OceanBase、Tendis、openGauss。
為什么在數(shù)據(jù)存儲(chǔ)領(lǐng)域,開源這么引人關(guān)注?
一個(gè)可能的答案是,開源在技術(shù)層面的想象空間更大,對(duì)開發(fā)者更友好。就像 ShardingSphere 的可插拔架構(gòu),架構(gòu)設(shè)計(jì)完成只是第一步,后續(xù)還有海量的不同模塊的開發(fā)工作。對(duì)于創(chuàng)業(yè)公司來說,如果不借助社區(qū)的力量,美好的可插拔架構(gòu)也可能成為公司的研發(fā)黑洞。
產(chǎn)品的中立性,也是導(dǎo)致開源項(xiàng)目集中迎來爆發(fā)的另一個(gè)要素。尤其是在數(shù)據(jù)存儲(chǔ)領(lǐng)域,最美好的答案可能是無依賴、跨多云,最差的答案才是被單一產(chǎn)品強(qiáng)綁定。
當(dāng)然,開源再好,也抵不過現(xiàn)實(shí)的骨感。開源兩年,Star 幾百,花錢不少,效果為零,這恐怕是眾多開源項(xiàng)目的常態(tài)。社區(qū)的健康程度,往往直接定義了開源項(xiàng)目的生死,這導(dǎo)致即便架構(gòu)師想做選型,也沒有太多的好選擇。
在張亮看來,一個(gè)開源項(xiàng)目能不能成功,大致可以分為三個(gè)維度來考察:
第一,能否耐的住寂寞,團(tuán)隊(duì)是真的相信開源,還是拿開源當(dāng)做商業(yè)上的捷徑。一個(gè)最簡(jiǎn)單的考核指標(biāo)便是運(yùn)營時(shí)間,“開源項(xiàng)目一定要度過‘靜默期’才會(huì)迎來爆發(fā),只做了半年、一年,是沒法預(yù)估項(xiàng)目未來的”,張亮說。
第二,一些必備的運(yùn)營技巧。張亮一方面把 ShardingSphere 捐獻(xiàn)給 Apache 基金會(huì),另一方面也帶著項(xiàng)目參與了許多活動(dòng),比如谷歌舉辦的黑客馬拉松、編程夏令營,除國內(nèi)用戶以外,也吸引了大批的海外開發(fā)者、學(xué)生參與到社區(qū)建設(shè)中來。
第三,觀念的轉(zhuǎn)變,也是最關(guān)鍵的部分。從小處著眼,是從“自己開發(fā)”到“社區(qū)開發(fā)”;從大處著眼,就是在真正意義上擁抱開源,而不只是嘴上說說。
“ShardingSphere 的項(xiàng)目發(fā)展是受社區(qū)的引導(dǎo)。比如說,社區(qū)認(rèn)為 ShardingSphere 該做基于影子庫的壓測(cè)和可觀察性,ShardingSphere 就真的做了。這些都不是項(xiàng)目自上而下的設(shè)計(jì),只要需求爆發(fā),且在項(xiàng)目的 Scope 內(nèi),就可以實(shí)現(xiàn)。但如果一個(gè)公司在運(yùn)營開源項(xiàng)目時(shí),遇見所謂的偏離主線設(shè)計(jì)的社區(qū)訴求,就拒掉它,那么大概率也會(huì)影響這個(gè)項(xiàng)目的成長,因?yàn)樗凰阏嬲鐓^(qū)的開源項(xiàng)目?!?/span>
未來的發(fā)展方向
目前相關(guān)的中間件產(chǎn)品,還是把核心聚焦在水平分片、彈性遷移和 MySQL 實(shí)例管理上。
但某種程度上,ShardingSphere 可能代表了未來數(shù)據(jù)庫中間件發(fā)展的核心方向之一,即 0 級(jí)功能是可插拔,1 級(jí)功能才是數(shù)據(jù)分片。開源和可插拔架構(gòu)結(jié)合在一起,等于打開了數(shù)據(jù)庫中間件在技術(shù)和產(chǎn)品維度的想象空間。張亮透露,SQL 審計(jì)、基于數(shù)據(jù)的權(quán)限引擎、多租戶、TTL(Time To Live)都會(huì)被提上開發(fā)日程。
除此之外,ShardingSphere 還有一個(gè)正在開發(fā)中的構(gòu)想,叫做 Database Mesh,力爭(zhēng)實(shí)現(xiàn)數(shù)據(jù)庫上云的原生體驗(yàn),但還需要一定的開發(fā)周期。
Database Mesh 會(huì)在數(shù)據(jù)庫集群之上,封裝一層代理,做智能的負(fù)載均衡。傳統(tǒng)的負(fù)載層無法識(shí)別 SQL 特征,只能用輪詢或權(quán)重的方式透?jìng)?。?Database Mesh 會(huì)根據(jù)不同的 SQL,匹配計(jì)算實(shí)例的標(biāo)簽,更加智能選擇要訪問的數(shù)據(jù)庫計(jì)算或存儲(chǔ)節(jié)點(diǎn)。
對(duì)于架構(gòu)師而言,最重要的是打開技術(shù)選型的眼界與想象力。分布式數(shù)據(jù)庫對(duì)業(yè)務(wù)的侵入性更低,但中間件方案規(guī)避了對(duì)廠商的依賴問題,究竟如何選擇,要以實(shí)際場(chǎng)景為判斷依據(jù)。但這并不妨礙我們給出階段性的推論:
很可能,在未來的 5 – 10 年間,數(shù)據(jù)庫中間件都是底層架構(gòu)最重要的解決方案之一,值得每一個(gè)架構(gòu)師認(rèn)真調(diào)研。