數(shù)據(jù)庫作為基礎(chǔ)軟件中的重要一環(huán)有著很深的技術(shù)含量,在這樣的大背景下國(guó)產(chǎn)數(shù)據(jù)庫廠商開始發(fā)力,這其中分布式數(shù)據(jù)庫如雨后春筍般出現(xiàn),良性的競(jìng)爭(zhēng)環(huán)境使它們都得到了長(zhǎng)足的發(fā)展,其中不乏優(yōu)秀的產(chǎn)品,本文主要挑選目前幾個(gè)相對(duì)成熟數(shù)據(jù)庫進(jìn)行架構(gòu)特點(diǎn)介紹。
作者:張小海來源:51CTO
【51CTO.com原創(chuàng)稿件】
行業(yè)背景
隨著全球經(jīng)濟(jì)下行壓力增大,中美貿(mào)易摩擦愈演愈烈,美國(guó)一系列的經(jīng)濟(jì)制裁和技術(shù)封鎖使得我們有種被扼住咽喉的感覺,數(shù)據(jù)庫作為基礎(chǔ)軟件中的重要一環(huán)有著很深的技術(shù)含量,在這樣的大背景下國(guó)產(chǎn)數(shù)據(jù)庫廠商開始發(fā)力,這其中分布式數(shù)據(jù)庫如雨后春筍般出現(xiàn),良性的競(jìng)爭(zhēng)環(huán)境使它們都得到了長(zhǎng)足的發(fā)展,其中不乏優(yōu)秀的產(chǎn)品,本文主要挑選目前幾個(gè)相對(duì)成熟數(shù)據(jù)庫進(jìn)行架構(gòu)特點(diǎn)介紹。
分布式數(shù)據(jù)庫總體架構(gòu)
分布式數(shù)據(jù)庫總體設(shè)計(jì)有兩個(gè)思路和方向,一個(gè)是基于共享存儲(chǔ)的架構(gòu)(share everything),另一個(gè)是基于數(shù)據(jù)分片的架構(gòu)(share nothing)。
共享存儲(chǔ)的架構(gòu)特點(diǎn)是底層存儲(chǔ)共用一份數(shù)據(jù)池子,上層數(shù)據(jù)庫server層可以彈性擴(kuò)展,典型的案例像DB2 pureScale,Oracle RAC,阿里云PolarDB等,這種架構(gòu)的好處是天然適合做云數(shù)據(jù)庫,比如阿里云,上層的SQL引擎可以是MySQL也可以是PG,而且可以無限擴(kuò)展,底層的存儲(chǔ)其實(shí)是一起的,用戶申請(qǐng)只是申請(qǐng)幾個(gè)上層的MySQL或者PG server同時(shí)在底層存儲(chǔ)開辟一塊空間給用戶,這樣的話可以做到資源的彈性伸縮。這種架構(gòu)的數(shù)據(jù)庫嚴(yán)格意義上不能稱之為分布式數(shù)據(jù)庫。
數(shù)據(jù)分片架構(gòu)的特點(diǎn)是底層數(shù)據(jù)通過一定的規(guī)則比如hash或者range讓數(shù)據(jù)打散分別分布到不同的數(shù)據(jù)節(jié)點(diǎn)上,計(jì)算時(shí)底層多個(gè)節(jié)點(diǎn)共同參與計(jì)算,可以算是一種mpp并行計(jì)算的架構(gòu),同時(shí)數(shù)據(jù)節(jié)點(diǎn)可以擴(kuò)展,上層由協(xié)調(diào)節(jié)點(diǎn)進(jìn)行SQL解析和轉(zhuǎn)發(fā),這是目前典型的分布式數(shù)據(jù)庫架構(gòu),也是本文討論的重點(diǎn)。
目前分布式數(shù)據(jù)庫的總體架構(gòu)設(shè)計(jì)基本都和下圖相差不大,每種產(chǎn)品在不同組件的實(shí)現(xiàn)上存在差異,但大體架構(gòu)上類似。
從圖中可以看到分布式數(shù)據(jù)庫三大組件:協(xié)調(diào)節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、全局事務(wù)管理器。協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)SQL解析轉(zhuǎn)發(fā),充當(dāng)?shù)氖穷愃苝roxy的角色,數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)計(jì)算和數(shù)據(jù)存儲(chǔ),全局事務(wù)管理器負(fù)責(zé)全局事務(wù)讀一致性的保證。
下面分別介紹一下目前主流的分布式數(shù)據(jù)庫的架構(gòu)以及設(shè)計(jì)差異。
1.TiDB
TiDB是目前在互聯(lián)網(wǎng)界風(fēng)靡的一款分布式數(shù)據(jù)庫,由PingCAP公司研發(fā),由三大組件構(gòu)成,底層TiKV Server是Github開源組件,是一個(gè)分布式的kv存儲(chǔ)引擎,做數(shù)據(jù)存儲(chǔ),對(duì)應(yīng)數(shù)據(jù)節(jié)點(diǎn);上層TiDB Server由PingCAP公司研發(fā),用作SQL解析和轉(zhuǎn)發(fā),對(duì)應(yīng)協(xié)調(diào)節(jié)點(diǎn);PD Server復(fù)制全局時(shí)間戳分配,對(duì)應(yīng)全局事務(wù)管理器。下面列舉了它的架構(gòu)特點(diǎn):
①輕量化,深受互聯(lián)網(wǎng)公司喜愛,適合與容器進(jìn)行集成,當(dāng)前PingCAP公司也在做TiDB operator,將TiDB容器化。
②部署簡(jiǎn)便,基于Ansible Playbook實(shí)現(xiàn)自動(dòng)化部署。
③實(shí)現(xiàn)了基于Region級(jí)別的raft復(fù)制,將數(shù)據(jù)表拆分成一個(gè)個(gè)的Region,Region一主兩備基于raft協(xié)議做復(fù)制,同時(shí)Region還會(huì)根據(jù)負(fù)載情況進(jìn)行合并和分裂,由PD Server進(jìn)行負(fù)載均衡調(diào)度。
④使用隱藏列作為分布列,分布列不占用真實(shí)列,這樣在進(jìn)行數(shù)據(jù)修改時(shí)數(shù)據(jù)不需要進(jìn)行重分布,大致原理是使用表名和主鍵前面加上前綴信息作為隱藏列,再使用該列進(jìn)行hash分布。
⑤TiDB Server總體兼容MySQL語法,這個(gè)兼容并不是將MySQL Server直接拿過來使用,因?yàn)門iKV底層是kv的存儲(chǔ)模型,所以TiDB在執(zhí)行sql的時(shí)候需要做sql到kv的映射。
⑥TiKV可以看成一個(gè)大的數(shù)據(jù)池子,在物理機(jī)層面不存在哪個(gè)機(jī)器是主,哪個(gè)是備,所有機(jī)器都是主節(jié)點(diǎn),熱點(diǎn)數(shù)據(jù)會(huì)自動(dòng)進(jìn)行動(dòng)態(tài)負(fù)載均衡,數(shù)據(jù)是動(dòng)態(tài)移動(dòng)的。
⑦總體借鑒了google spanner f1和bigtable的論文,PD Server實(shí)現(xiàn)了邏輯上的時(shí)間戳,谷歌論文也提出了原子鐘的概念,從物理上保證事務(wù)號(hào)全局有序。
2.OceanBase
OceanBase是螞蟻金服自研的分布式數(shù)據(jù)庫,號(hào)稱代碼從第一行完全自研。最近ob也屢屢刷新新聞?lì)^條,刷榜TPCC官網(wǎng)測(cè)試結(jié)果,刷新天貓交易額和tps記錄,不過金融行業(yè)比如銀行的應(yīng)用案例并不多,也許是銀行和支付寶可能天然有鴻溝吧。ob架構(gòu)比較特殊,下面介紹一下它的架構(gòu)特點(diǎn):
①最底層是ob server,每個(gè)ob server集成了總控服務(wù)、sql引擎、存儲(chǔ)引擎和數(shù)據(jù)分區(qū)。
②上層是ob proxy,實(shí)現(xiàn)sql的路由,這個(gè)不止是應(yīng)用到observer的路由,也有observer之間的路由。
③數(shù)據(jù)拆成一個(gè)個(gè)分區(qū),每個(gè)分區(qū)做paxos復(fù)制,保證強(qiáng)一致,主分區(qū)宕機(jī)不可用會(huì)自動(dòng)切換到備分區(qū)。
④checkpoint時(shí)間改變,將checkpoint周期拉長(zhǎng)為1天,所有交易都落在內(nèi)存,然后每天夜里去刷一次盤,redo日志實(shí)時(shí)記錄,這樣避免了隨機(jī)寫的性能損耗,只有順序?qū)?,更像?nèi)存數(shù)據(jù)庫,性能更好,這樣也帶來一些問題,比如宕機(jī)后恢復(fù)時(shí)間變長(zhǎng),還有查詢剛剛做的修改需要先查基礎(chǔ)數(shù)據(jù),再去應(yīng)用redo條目,得到最新數(shù)據(jù)。
⑤兩階段提交并不使用ob proxy節(jié)點(diǎn)充當(dāng)協(xié)調(diào)者,而是將ob proxy路由到的第一個(gè)主數(shù)據(jù)分區(qū)作為協(xié)調(diào)者,同時(shí)兩階段提交的prepare和commit等信息會(huì)進(jìn)行持久化,如果寫協(xié)調(diào)節(jié)點(diǎn)宕機(jī),那么備分區(qū)會(huì)啟用,同時(shí)讀取持久化信息,這個(gè)設(shè)計(jì)和一般的分布式數(shù)據(jù)庫不太一樣。
⑥集群維護(hù)一個(gè)partition cache,分區(qū)的分布信息會(huì)通過ob proxy在不同ob server間傳遞。
⑦ob最早的時(shí)候曾經(jīng)開源過一段時(shí)間,隨后基于它也誕生了cbase、obase這些產(chǎn)品。
3.GaussDB
華為GaussDB分為三個(gè)產(chǎn)品線,Gauss100前身是華為自研的內(nèi)存數(shù)據(jù)庫gmdb,目前已經(jīng)開源,Gauss200是基于pgxc架構(gòu)研發(fā)的OLAP分析型數(shù)據(jù)庫,Gauss300是在200的基礎(chǔ)上繼續(xù)研發(fā)的HTAP數(shù)據(jù)庫,這里主要介紹Gauss300數(shù)據(jù)庫,Gauss300就是上圖中典型的架構(gòu):
①協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)sql解析、轉(zhuǎn)發(fā)的同時(shí)也充當(dāng)了兩階段提交的協(xié)調(diào)者的角色,協(xié)調(diào)節(jié)點(diǎn)上面存儲(chǔ)有部分元數(shù)據(jù)信息,元數(shù)據(jù)需要在多個(gè)協(xié)調(diào)節(jié)點(diǎn)之間進(jìn)行同步,如果協(xié)調(diào)節(jié)點(diǎn)宕機(jī),會(huì)影響ddl相關(guān)操作,還可能造成兩階段提交的殘留信息,需要有兩階段殘留清理機(jī)制。
②數(shù)據(jù)節(jié)點(diǎn)通過quorum-based流復(fù)制實(shí)現(xiàn)高可用,主備數(shù)據(jù)節(jié)點(diǎn)是實(shí)例級(jí)別的,一個(gè)主節(jié)點(diǎn)就是一個(gè)主PG實(shí)例,一臺(tái)機(jī)器可以有多個(gè)主數(shù)據(jù)節(jié)點(diǎn)。
③GTM復(fù)制分配全局事務(wù)id,GTM一主多備,GTM主備之間要同步gxid信息,而且是強(qiáng)同步,那么帶來一個(gè)問題,備GTM節(jié)點(diǎn)宕機(jī)會(huì)造成主GTM不可用,造成全局可用性問題,這塊華為將GTM的高可用轉(zhuǎn)移到etcd中,將GTM生成的xid寫入到etcd中,etcd自身就是一個(gè)高可用強(qiáng)一致的集群,這樣就保證了GTM的高可用,主GTM宕機(jī)那么備GTM會(huì)接替,然后繼續(xù)從etcd集群中讀寫事務(wù)號(hào)。
④GTM的事務(wù)號(hào)是批量分配的,如果在高并發(fā)的情況下,gxid如果一條一條分配則會(huì)有性能瓶頸,華為將事務(wù)號(hào)改為一次分配幾萬甚至幾十萬,避免了GTM事務(wù)號(hào)分配的瓶頸。
⑤事務(wù)id由32位改為64位。PG的事務(wù)號(hào)是32位的,最大到42億,所以事務(wù)號(hào)在PG中是很珍貴的資源,用完了就會(huì)循環(huán)使用,循環(huán)使用會(huì)帶來很多嚴(yán)重問題,華為將事務(wù)號(hào)由32位改為了64位,這樣事務(wù)號(hào)根本不可能用盡,那么一次分配幾十萬也不足為奇了。
⑥為了提升性能,華為也正在研發(fā)gtm-lite功能,該功能可以實(shí)現(xiàn)本地事務(wù)不走GTM,因?yàn)樯a(chǎn)環(huán)境大部分是本地事務(wù),因而能大大提升性能。
⑦Gauss300是基于pgxc架構(gòu)演進(jìn)而來的,類似基于pgxc的還有亞信AntDB、騰訊TBase。
4.SequoiaDB
SequoiaDB是巨杉自主研發(fā)的分布式數(shù)據(jù)庫,最初的應(yīng)用場(chǎng)景主要是歷史數(shù)據(jù)歸檔和非結(jié)構(gòu)化數(shù)據(jù)存檔,但是近期來巨杉也在積極開發(fā)oltp功能,包括研發(fā)GTM,支持MySQL協(xié)議等。下面介紹一下它的架構(gòu)特點(diǎn):
①包括協(xié)調(diào)節(jié)點(diǎn)、編目節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、PG節(jié)點(diǎn)等。協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)sql轉(zhuǎn)發(fā),編目節(jié)點(diǎn)存儲(chǔ)元數(shù)據(jù),數(shù)據(jù)節(jié)點(diǎn)存儲(chǔ)真實(shí)數(shù)據(jù),PG節(jié)點(diǎn)做sql引擎。
②巨杉數(shù)據(jù)庫底層存儲(chǔ)是NoSQL的,數(shù)據(jù)都是JSON格式進(jìn)行存儲(chǔ),優(yōu)點(diǎn)類似MongoDB。
③PG節(jié)點(diǎn)是將PG Server拿過來做sql存儲(chǔ)引擎,支持sql語法,在PG上創(chuàng)建外表,同時(shí)創(chuàng)建外部服務(wù)器,存取巨杉中的數(shù)據(jù),近期也支持了MySQL,將巨杉作為可插拔的存儲(chǔ)引擎嵌入到MySQL中。
④目前巨杉用作交易類場(chǎng)景其實(shí)不多,現(xiàn)在最大的一個(gè)應(yīng)用案例是某大行一百多物理節(jié)點(diǎn)的巨杉集群,用作數(shù)據(jù)歸檔和影像管理。
⑤巨杉底層是多模存儲(chǔ)引擎,既支持結(jié)構(gòu)化數(shù)據(jù),也支持非結(jié)構(gòu)化數(shù)據(jù),實(shí)現(xiàn)了統(tǒng)一管理。
當(dāng)然還有很多分布式數(shù)據(jù)庫,像達(dá)夢(mèng)、人大金倉、南大通用、萬里開源、中興等企業(yè)都有分布式數(shù)據(jù)庫產(chǎn)品,這里不再一一介紹了。
作者介紹:
張小海,就職于某大型商業(yè)銀行,目前主要負(fù)責(zé)數(shù)據(jù)庫管理及新技術(shù)研究,PostgreSQL技術(shù)推廣者,個(gè)人公眾號(hào):數(shù)據(jù)庫架構(gòu)之美。
1.《分布式架構(gòu) 全面講解分布式數(shù)據(jù)庫架構(gòu)設(shè)計(jì)特點(diǎn)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《分布式架構(gòu) 全面講解分布式數(shù)據(jù)庫架構(gòu)設(shè)計(jì)特點(diǎn)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/keji/346823.html