Doris數(shù)倉(cāng)的四大特點(diǎn),一篇講明白
01、極簡(jiǎn)架構(gòu)
Doris從設(shè)計(jì)上來(lái)說(shuō),融合了Google Mesa的數(shù)據(jù)存儲(chǔ)模型、Apache的ORCFile存儲(chǔ)格式、Apache Impala查詢(xún)引擎和MySQL交互協(xié)議,是一個(gè)擁有先進(jìn)技術(shù)和先進(jìn)架構(gòu)的領(lǐng)先設(shè)計(jì)產(chǎn)品,如圖1所示。
▲圖1 Doris技術(shù)分解圖
在架構(gòu)方面,Doris只有兩類(lèi)進(jìn)程:一類(lèi)是FE,可以理解為Doris的管理節(jié)點(diǎn),主要負(fù)責(zé)用戶(hù)請(qǐng)求的接入、查詢(xún)計(jì)劃的解析、元數(shù)據(jù)的存儲(chǔ)和集群管理相關(guān)工作;另一類(lèi)是BE,主要負(fù)責(zé)數(shù)據(jù)存儲(chǔ)、查詢(xún)計(jì)劃的執(zhí)行。這兩類(lèi)進(jìn)程都是可以橫向擴(kuò)展的。除此之外,Doris不依賴(lài)任何第三方系統(tǒng)(如HDFS、Zookeeper等)。這種高度集成的架構(gòu)設(shè)計(jì)極大地降低了運(yùn)維成本。
FE節(jié)點(diǎn)包含Leader、Follower和Observer三種角色。默認(rèn)一個(gè)集群只能有一個(gè)Leader,可以有多個(gè)Follower和Observer。其中,Leader和Follower組成一個(gè)Paxos選擇組,如果Leader宕機(jī),剩下的Follower會(huì)自動(dòng)選出新的Leader,保證寫(xiě)入高可用。Observer同步Leader的數(shù)據(jù),但是不參加選舉。如果只部署一個(gè)FE,則FE默認(rèn)就是Leader。
FE節(jié)點(diǎn)主要包括存儲(chǔ)管理(Store Manager)模塊、狀態(tài)管理(State Store)模塊、協(xié)調(diào)(Coordinator)模塊、元數(shù)據(jù)(StoreMeta)模塊和元數(shù)據(jù)緩存(StoreMeta Cache)模塊。存儲(chǔ)管理模塊負(fù)責(zé)管理所有的元數(shù)據(jù)信息,包括數(shù)據(jù)庫(kù)、表信息、tablet信息、tablet的副本信息等。存儲(chǔ)管理模塊還負(fù)責(zé)管理用戶(hù)的權(quán)限信息(即用戶(hù)的認(rèn)證信息和授權(quán)信息)和數(shù)據(jù)的導(dǎo)入任務(wù)等。狀態(tài)管理模塊負(fù)責(zé)管理所有BE進(jìn)程的存活狀態(tài)信息、查詢(xún)負(fù)載信息等非持久化信息,并提供發(fā)布訂閱接口。協(xié)調(diào)模塊負(fù)責(zé)接收用戶(hù)發(fā)來(lái)的請(qǐng)求,然后進(jìn)行語(yǔ)句解析、生成執(zhí)行規(guī)劃,根據(jù)當(dāng)前集群的狀態(tài),對(duì)執(zhí)行規(guī)劃進(jìn)行調(diào)度。元數(shù)據(jù)模塊負(fù)責(zé)對(duì)元數(shù)據(jù)的讀寫(xiě),只有FE Leader擁有此權(quán)限。元數(shù)據(jù)緩存模塊負(fù)責(zé)同步元數(shù)據(jù),以供語(yǔ)句解析、生成執(zhí)行規(guī)劃,主要是Follower和Observer角色的權(quán)限。
BE節(jié)點(diǎn)可以無(wú)限擴(kuò)展,并且所有BE節(jié)點(diǎn)的角色都是對(duì)等的。在集群足夠大的情況下,部分BE下線(xiàn)不影響集群提供服務(wù)。BE節(jié)點(diǎn)主要由存儲(chǔ)引擎(Store Engine)和查詢(xún)執(zhí)行器(Query Executor)組成。存儲(chǔ)引擎負(fù)責(zé)管理節(jié)點(diǎn)本地的tablet數(shù)據(jù),發(fā)送或者接收數(shù)據(jù)形成副本,定期合并更新多個(gè)版本的數(shù)據(jù)減少存儲(chǔ)占用。存儲(chǔ)引擎還負(fù)責(zé)接收來(lái)自查詢(xún)執(zhí)行器的數(shù)據(jù)讀取需求和批量數(shù)據(jù)導(dǎo)入需求。一個(gè)查詢(xún)?cè)贛PP集群中執(zhí)行時(shí),會(huì)拆成一個(gè)樹(shù)狀的執(zhí)行樹(shù),這棵樹(shù)的執(zhí)行由Coordinator來(lái)協(xié)調(diào)執(zhí)行,樹(shù)的葉子節(jié)點(diǎn)也叫計(jì)劃片斷(PlanFragment),每一個(gè)PlanFragment分配給一個(gè)BE節(jié)點(diǎn)的查詢(xún)執(zhí)行器來(lái)執(zhí)行,這就是查詢(xún)執(zhí)行器模塊的作用。
02、使用簡(jiǎn)單
Doris不僅架構(gòu)簡(jiǎn)單,開(kāi)發(fā)和使用也非常簡(jiǎn)單。對(duì)一款OLAP數(shù)據(jù)庫(kù)來(lái)說(shuō),性能不是數(shù)據(jù)庫(kù)的全部,易用性才是決定是否持續(xù)使用的關(guān)鍵,Doris從系統(tǒng)設(shè)計(jì)之初就一直以用戶(hù)的易用性作為出發(fā)點(diǎn)。
從數(shù)據(jù)分析的全周期來(lái)看,一般可以簡(jiǎn)單歸納成四個(gè)方面,從數(shù)據(jù)建模→數(shù)據(jù)導(dǎo)入→用戶(hù)上手分析→持續(xù)使用以及維護(hù)升級(jí),Doris的易用性無(wú)處不在。
在數(shù)據(jù)建模方面,Doris支持Aggregate、Unique和Duplicate三種模型,可以滿(mǎn)足OLAP領(lǐng)域的各種應(yīng)用場(chǎng)景。同時(shí),Doris建表語(yǔ)句,相對(duì)于MySQL只增加了一些分布式系統(tǒng)所具有的特性,比如分布鍵、分桶數(shù)等。有過(guò)分布式數(shù)據(jù)庫(kù)使用經(jīng)驗(yàn)的用戶(hù)非常容易理解和上手操作。
在數(shù)據(jù)導(dǎo)入方面,Doris提供多種數(shù)據(jù)導(dǎo)入方案(如圖2所示),可以針對(duì)不同的數(shù)據(jù)源進(jìn)行選擇,同時(shí)在數(shù)據(jù)導(dǎo)入過(guò)程中提供原子性保證。不論是使用Broker Load進(jìn)行批量導(dǎo)入,還是使用INSERT語(yǔ)句進(jìn)行單條導(dǎo)入,都是一個(gè)完整的事務(wù)操作。導(dǎo)入事務(wù)可以保證一批次內(nèi)的數(shù)據(jù)原子生效,不會(huì)出現(xiàn)部分?jǐn)?shù)據(jù)寫(xiě)入的情況。
▲圖2 Doris數(shù)據(jù)導(dǎo)入支持
同時(shí),每一個(gè)導(dǎo)入作業(yè)都會(huì)生成一個(gè)Label,這個(gè)Label是在數(shù)據(jù)庫(kù)內(nèi)用于唯一區(qū)分一個(gè)導(dǎo)入任務(wù)。Label可以由用戶(hù)指定,部分導(dǎo)入功能也會(huì)由系統(tǒng)自動(dòng)生成。Label用于保證對(duì)應(yīng)的導(dǎo)入作業(yè)僅能成功導(dǎo)入一次,一個(gè)成功導(dǎo)入的Label再次使用時(shí),會(huì)被拒絕并報(bào)錯(cuò)Label already used。通過(guò)這個(gè)機(jī)制,數(shù)據(jù)消費(fèi)側(cè)可以實(shí)現(xiàn)At-Most-Once語(yǔ)義。如果結(jié)合上游系統(tǒng)的At-Least-Once語(yǔ)義,則可以實(shí)現(xiàn)端到端數(shù)據(jù)導(dǎo)入的Exactly-Once語(yǔ)義。數(shù)據(jù)導(dǎo)入流程如圖3所示。
▲圖3 Doris數(shù)據(jù)導(dǎo)入流程
在SQL開(kāi)發(fā)方面,Doris支持標(biāo)準(zhǔn)的SQL語(yǔ)言,在方言方面向MySQL兼容。不論是簡(jiǎn)單的單表聚合、排序過(guò)濾操作,還是復(fù)雜的多表關(guān)聯(lián)、子查詢(xún)、窗口函數(shù)等,Doris都可以通過(guò)SQL輕松完成,極大地降低了用戶(hù)的遷移和使用成本。Adhoc這類(lèi)高吞吐的即席查詢(xún)和庫(kù)內(nèi)ETL場(chǎng)景也是Doris的強(qiáng)項(xiàng)。Doris還能夠支持復(fù)雜SQL語(yǔ)法,包括Grouping Set等高級(jí)語(yǔ)法功能,同時(shí)還可以通過(guò)UDF或UDAF來(lái)自定義拓展功能。在TB級(jí)別數(shù)據(jù)上,Doris可以部分代替Hive等離線(xiàn)系統(tǒng)的功能,使得用戶(hù)在一套數(shù)據(jù)庫(kù)中滿(mǎn)足所有需求。
在工具方面,Doris在FE模塊中實(shí)現(xiàn)了兼容MySQL協(xié)議,方便用戶(hù)使用標(biāo)準(zhǔn)的MySQL客戶(hù)端或各種語(yǔ)言的類(lèi)庫(kù)進(jìn)行連接,對(duì)各種工具的支持都非常好。在數(shù)據(jù)庫(kù)開(kāi)發(fā)方面[3] [4] ,我們可以無(wú)縫使用DBeaver、DataGrip、Navicat等主流開(kāi)發(fā)工具;在編程應(yīng)用方面[5] [6] ,Doris完全支持MySQL的JDBC和ODBC接口,可以支持C、Python、Java、Shell等開(kāi)發(fā)語(yǔ)言;在BI應(yīng)用方面,Doris支持帆軟BI、觀(guān)遠(yuǎn)BI、永洪BI、Tableau等各種敏捷BI軟件;在ETL調(diào)度方面,Doris支持Kettle、DolphinScheduler等主流軟件。
在集群可靠性方面,Doris元數(shù)據(jù)使用內(nèi)存存儲(chǔ)+檢查點(diǎn)+鏡像日志文件的模式,使用BTBJE(類(lèi)似于Raft )協(xié)議實(shí)現(xiàn)元數(shù)據(jù)的高可用性和高可靠性。Doris內(nèi)部自行管理數(shù)據(jù)的多副本和自動(dòng)修復(fù),保證數(shù)據(jù)的高可用、高可靠性。在部分服務(wù)器宕機(jī)情況下,集群依然可以正常運(yùn)行,數(shù)據(jù)也不會(huì)丟失。Doris部署無(wú)外部依賴(lài),只需要部署B(yǎng)E和FE模塊即可搭建一個(gè)集群。Doris支持在線(xiàn)更改表模式(加減列、創(chuàng)建Rollup ),不會(huì)影響當(dāng)前服務(wù),不會(huì)阻塞讀、寫(xiě)等操作,因?yàn)檫@種操作是異步執(zhí)行的。
在集群擴(kuò)縮容方面,Doris基于自身的分布式管理框架,可以自動(dòng)管理數(shù)據(jù)副本的分布、修復(fù)和均衡。比如對(duì)于副本損壞的情況,Doris會(huì)自動(dòng)感知并進(jìn)行修復(fù)。而對(duì)于節(jié)點(diǎn)擴(kuò)縮容,僅需一條SQL命令即可完成,Doris會(huì)自動(dòng)進(jìn)行數(shù)據(jù)分片均衡,整個(gè)過(guò)程完全不影響系統(tǒng)服務(wù),無(wú)須運(yùn)維人員進(jìn)行任何額外的操作。
在集群升級(jí)方面,Doris的升級(jí)方式卻極其簡(jiǎn)單,只需要替換二進(jìn)制程序,滾動(dòng)重啟集群即可。在設(shè)計(jì)上,Doris完全向前兼容,所以也可以通過(guò)灰度升級(jí)的方式進(jìn)行新版本的驗(yàn)證和測(cè)試。而Doris本身的一些失敗重試和故障路由功能也極大地降低了升級(jí)過(guò)程中發(fā)生的錯(cuò)誤對(duì)業(yè)務(wù)的影響。
03、功能豐富
Doris提供了非常豐富的功能來(lái)幫助業(yè)務(wù)適應(yīng)不同的應(yīng)用場(chǎng)景。下面重點(diǎn)介紹一些Doris的特色功能。
首先是分區(qū)分桶裁剪功能。Doris支持兩個(gè)層次的數(shù)據(jù)劃分:第一層是Partition,支持Range和List的劃分方式。第二層是Bucket分桶,將數(shù)據(jù)通過(guò)Hash進(jìn)行水平劃分,數(shù)據(jù)分片Tablet在集群中均勻打散。Doris數(shù)據(jù)分布示例如圖4所示。
▲圖4 Doris數(shù)據(jù)分布示例
利用分桶裁剪功能,Doris可以將查詢(xún)固定到極少數(shù)分片上,從而顯著降低單個(gè)查詢(xún)對(duì)系統(tǒng)資源的消耗,提升集群整體的并發(fā)查詢(xún)能力。在高并發(fā)查詢(xún)場(chǎng)景,Doris單節(jié)點(diǎn)可以支撐上千QPS的查詢(xún)請(qǐng)求。
其次是合理的緩存功能。Doris還支持SQL級(jí)別和Partition級(jí)別的查詢(xún)緩存。其中SQL級(jí)別的緩存以SQL語(yǔ)句的Hash值作為Key,直接緩存SQL結(jié)果,非常適合更新頻率不高,但是查詢(xún)非常頻繁的場(chǎng)景。而Partition級(jí)別的緩存會(huì)智能地將SQL結(jié)果中不同分區(qū)的結(jié)果數(shù)據(jù)緩存起來(lái),之后的查詢(xún),可以利用已緩存分區(qū)的數(shù)據(jù)加上新分區(qū)實(shí)時(shí)查詢(xún)的數(shù)據(jù)得到最終的結(jié)果,從而降低重復(fù)數(shù)據(jù)的實(shí)時(shí)查詢(xún)需求,減少對(duì)系統(tǒng)資源的消耗。
再次,Doris支持Bitmap數(shù)據(jù)類(lèi)型。這一數(shù)據(jù)類(lèi)型利用位圖來(lái)存儲(chǔ)存儲(chǔ)整型數(shù)據(jù),并且可以通過(guò)位圖進(jìn)行一些集合類(lèi)操作。Bitmap可以應(yīng)用于高基數(shù)精確去重場(chǎng)景。傳統(tǒng)的實(shí)時(shí)計(jì)算去重?cái)?shù)據(jù)的算法,需要在內(nèi)存中構(gòu)建Hash表來(lái)進(jìn)行數(shù)據(jù)去重,在基數(shù)非常高的情況下,會(huì)占用大量的內(nèi)存。而使用Bitmap,可以將數(shù)值類(lèi)型轉(zhuǎn)換成位圖上的0和1,從而極大地降低內(nèi)存開(kāi)銷(xiāo),并且對(duì)于去重計(jì)算,只需要將多個(gè)Bitmap求交集后計(jì)算1的個(gè)數(shù)即可,從而達(dá)到在有限的內(nèi)存開(kāi)銷(xiāo)情況下,進(jìn)行快速的高基數(shù)精確去重計(jì)算。
在用戶(hù)畫(huà)像場(chǎng)景中,使用Bitmap來(lái)存儲(chǔ)用戶(hù)ID,可以通過(guò)位圖的集合運(yùn)算快速獲取不同標(biāo)簽組合的人群包。同時(shí),Doris也內(nèi)置了很多Bitmap相關(guān)的函數(shù),用于計(jì)算漏斗、留存等。比如通過(guò)intersect_count()函數(shù)就可以方便地計(jì)算用戶(hù)的留存情況。
最后是物化視圖。物化視圖也是Doris的核心特點(diǎn)之一。物化視圖是將預(yù)先計(jì)算(根據(jù)定義好的SELECT語(yǔ)句)好的數(shù)據(jù)集,存儲(chǔ)在一個(gè)對(duì)用戶(hù)透明且有真實(shí)數(shù)據(jù)的視圖表格中。物化視圖主要是為了滿(mǎn)足用戶(hù)既能對(duì)原始明細(xì)數(shù)據(jù)的任意維度分析,也能快速對(duì)固定維度進(jìn)行分析查詢(xún),在統(tǒng)一視角下對(duì)明細(xì)、聚合數(shù)據(jù)進(jìn)行分析的需求。
在Doris中,用戶(hù)可以使用明細(xì)數(shù)據(jù)模型存儲(chǔ)明細(xì)數(shù)據(jù),之后在明細(xì)數(shù)據(jù)上,選擇任意維度和指標(biāo)創(chuàng)建聚合物化視圖,如SUM、MIN、MAX、COUNT等。Doris會(huì)保證明細(xì)表和物化視圖中數(shù)據(jù)的完全一致。如果導(dǎo)入或刪除物理表數(shù)據(jù), 物化視圖會(huì)自動(dòng)更新,保證原始表和物化視圖表的數(shù)據(jù)一致性。同時(shí),物化視圖對(duì)用戶(hù)查詢(xún)是透明的,Doris會(huì)自動(dòng)根據(jù)查詢(xún)語(yǔ)句中的模式,匹配到最合適的物化視圖進(jìn)行查詢(xún)。通過(guò)物化視圖功能,用戶(hù)可以在一張表上統(tǒng)一明細(xì)和聚合模型,并且加速某些固定模式的查詢(xún)響應(yīng)。
Doris還支持基于主鍵的數(shù)據(jù)更新。通過(guò)Unique數(shù)據(jù)模型,用戶(hù)可以對(duì)數(shù)據(jù)基于主鍵進(jìn)行更新。在實(shí)現(xiàn)層面,Doris采用Merge-on-Read的方式提供更新后的數(shù)據(jù),此外,用戶(hù)還可以使用REPLACE_IF_NOT_NULL這種聚合方式,實(shí)現(xiàn)部分列更新的需求。針對(duì)Unique數(shù)據(jù)模型,Doris還支持友好的Update操作。
基于Unique模型,Doris還通過(guò)Marked Delete和Sequence Column等功能,可以實(shí)現(xiàn)對(duì)上游交易數(shù)據(jù)庫(kù)更新數(shù)據(jù)的同步操作,并且不僅能夠保證事務(wù)的原子性,還可以保證數(shù)據(jù)同步的順序性。
04、開(kāi)源開(kāi)放
Doris還有一個(gè)特別重要的特點(diǎn)就是完全開(kāi)源開(kāi)放。Apache Doris作為Apache基金會(huì)的項(xiàng)目,遵守的就是Apache License 2.0。Apache License 2.0作為最主流的開(kāi)源協(xié)議,被OSI認(rèn)定為“受歡迎且被廣泛使用或具有強(qiáng)大社區(qū)的許可證”(The following OSI-approved licenses are popular, widely used, or have strong communities)。
有關(guān) Apache License 2.0的具體內(nèi)容,可以在 Apache 官網(wǎng)查閱。簡(jiǎn)單來(lái)說(shuō),分發(fā)完全自由、允許項(xiàng)目代碼被修改、允許作為開(kāi)源或商業(yè)化軟件再次發(fā)布 ,一旦授權(quán)永久有效,在修改代碼或有源代碼衍生的代碼中需要帶有原來(lái)代碼的協(xié)議、專(zhuān)利聲明等。這是對(duì)于任何商業(yè)化公司和開(kāi)源用戶(hù)都極其友好的協(xié)議。
關(guān)于作者:王春波,資深大數(shù)據(jù)架構(gòu)師,現(xiàn)就職于一家互聯(lián)網(wǎng)公司,任高級(jí)數(shù)倉(cāng)工程師,負(fù)責(zé)電商數(shù)倉(cāng)項(xiàng)目;在銀行業(yè)、零售行業(yè)深耕多年,參與和負(fù)責(zé)過(guò)多家銀行、零售數(shù)據(jù)分析實(shí)施項(xiàng)目;“數(shù)據(jù)中臺(tái)研習(xí)社”號(hào)主,《高效使用Greenplum:入門(mén)、進(jìn)階與數(shù)據(jù)中臺(tái)》作者。