轉(zhuǎn)轉(zhuǎn)One-Service數(shù)據(jù)服務(wù)體系建設(shè)
本次分享主題為轉(zhuǎn)轉(zhuǎn) One-Service 數(shù)據(jù)服務(wù)體系建設(shè),主要介紹轉(zhuǎn)轉(zhuǎn)在建設(shè)數(shù)據(jù)服務(wù)體系過程中的三個(gè)階段,其中將詳細(xì)介紹 One-Service 統(tǒng)一查詢服務(wù)建設(shè)思路。
主要內(nèi)容包括以下幾大部分:
- 轉(zhuǎn)轉(zhuǎn)數(shù)據(jù)服務(wù)發(fā)展歷程
- One-Service 查詢服務(wù)建設(shè)
- 未來規(guī)劃
一、轉(zhuǎn)轉(zhuǎn)數(shù)據(jù)服務(wù)發(fā)展歷程
圖片
在第一階段,隨著業(yè)務(wù)增長與人力資源的緊張,為了滿足各個(gè)業(yè)務(wù)線的數(shù)據(jù)需求,快速的使用統(tǒng)計(jì)數(shù)據(jù)做數(shù)據(jù)分析,本階段產(chǎn)生的數(shù)據(jù)結(jié)果大多以Excel或者數(shù)據(jù)統(tǒng)計(jì)到庫的方式提供數(shù)據(jù),對(duì)外提供分析或者對(duì)接應(yīng)用。此階段目標(biāo)是快速產(chǎn)出數(shù)據(jù)結(jié)果,為業(yè)務(wù)決策提供數(shù)據(jù)支撐。
第二階段隨著業(yè)務(wù)的發(fā)展,分析數(shù)據(jù)的需求不斷的增多,分析的要求也更多樣化。針對(duì)不同主題下的數(shù)據(jù),我們開發(fā)了各個(gè)主題的應(yīng)用報(bào)表、多維分析報(bào)表,用來支持業(yè)務(wù)多樣化的分析的訴求。雖然在一定程度上解決了業(yè)務(wù)使用數(shù)據(jù)的痛點(diǎn),但是在數(shù)據(jù)查詢服務(wù)上各做各的,不同的主題對(duì)應(yīng)不同的查詢服務(wù)后端,形成了來一個(gè)主題開發(fā)一個(gè)主題的查詢服務(wù)的煙囪式開發(fā)模式。
第三階段是統(tǒng)一查詢服務(wù)One-Service,為了解決階段二暴露的問題,避免重復(fù)開發(fā)降低開發(fā)工作量,打造支持各類數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)查詢服務(wù),提供統(tǒng)一、穩(wěn)定、便捷、安全、可控的數(shù)據(jù)查詢出口,我們針對(duì)不同的主題數(shù)據(jù)形成的數(shù)據(jù)集,設(shè)計(jì)和實(shí)現(xiàn)了一套統(tǒng)一的數(shù)據(jù)服務(wù),可以完成所有主題數(shù)據(jù)服務(wù)的查詢,并提供支持不同的協(xié)議以在不同的使用場景中使用。
接下來,將詳細(xì)介紹統(tǒng)一查詢服務(wù)實(shí)現(xiàn)的具體細(xì)節(jié)。
二、One-Service 查詢服務(wù)建設(shè)
2.1 背景
在日常的數(shù)據(jù)開發(fā)過程中,我們會(huì)把數(shù)據(jù)結(jié)果存儲(chǔ)在各類數(shù)據(jù)庫中或者導(dǎo)入到OLAP查詢引擎中供上層應(yīng)用使用。對(duì)于不同的數(shù)據(jù)庫和OLAP引擎上層應(yīng)用都要自行構(gòu)建查詢服務(wù)處理各自的數(shù)據(jù)邏輯,存在大量重復(fù)的開發(fā)工作,因此為了提升數(shù)據(jù)使用效率、減少重復(fù)性開發(fā)工作、降低開發(fā)成本,我們?cè)诟黝惔鎯?chǔ)引擎的基礎(chǔ)上需要開發(fā)一套統(tǒng)一的數(shù)據(jù)查詢服務(wù)。
2.2 系統(tǒng)目標(biāo)
圖片
目標(biāo):打造支持各類數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)查詢服務(wù),提供統(tǒng)一、穩(wěn)定、便捷、安全、可擴(kuò)展的數(shù)據(jù)查詢出口。
需要支持常用的OLTP與OLAP數(shù)據(jù)存儲(chǔ)引擎,比如MySQL、Kylin、Druid、Clickhouse、StarRocks等,所有數(shù)據(jù)出口由同一套查詢服務(wù)支持,并且需要保證服務(wù)的可控、穩(wěn)定、安全,對(duì)接BI需求、數(shù)據(jù)服務(wù)、數(shù)據(jù)應(yīng)用工具開發(fā)等上層各類數(shù)據(jù)應(yīng)用場景。
2.3 整體架構(gòu)
圖片
針對(duì)之前闡述的系統(tǒng)背景要求與目標(biāo),我們?cè)O(shè)計(jì)了一套統(tǒng)一查詢服務(wù)One-Service,打通了基礎(chǔ)數(shù)據(jù)平臺(tái)中的元信息,通過配置管理數(shù)據(jù)源、數(shù)據(jù)集的方式來應(yīng)對(duì)不同的多樣性數(shù)據(jù)需求。并且接入了權(quán)限管理平臺(tái),支持對(duì)數(shù)據(jù)集進(jìn)行權(quán)限管理與配置。在服務(wù)本身設(shè)計(jì)了一些服模塊功能模塊,權(quán)限控制模塊、查詢歷史記錄、監(jiān)控告警模塊等功能來輔助完成相應(yīng)的系統(tǒng)要求。
- 基礎(chǔ)數(shù)據(jù)平臺(tái):根據(jù)基礎(chǔ)數(shù)據(jù)平臺(tái)維護(hù)的各類表與指標(biāo)的元信息,通過配置生成不同業(yè)務(wù)的數(shù)據(jù)集;
- 管理后臺(tái):包括數(shù)據(jù)源管理、數(shù)據(jù)集管理、數(shù)據(jù)權(quán)限管理。數(shù)據(jù)集管理是把不同的數(shù)據(jù)源的數(shù)據(jù)抽象成一個(gè)數(shù)據(jù)集合,根據(jù)存儲(chǔ)引擎的不同采用對(duì)應(yīng)的組合與配置方式,比如支持SQL的存儲(chǔ)引擎,可以通過SQL來生成對(duì)應(yīng)不同業(yè)務(wù)的各類數(shù)據(jù)集,并且可以通過子查詢來形成不同的數(shù)據(jù)集來多樣化支持不同場景與需求,同時(shí)各類字段格式轉(zhuǎn)換、特殊過濾條件處理都可以放到數(shù)據(jù)集中進(jìn)行配置處理;
- 權(quán)限管理中臺(tái):通過話權(quán)限管理平臺(tái),用來對(duì)用的數(shù)據(jù)集權(quán)限進(jìn)行管理,查詢平臺(tái)權(quán)限管理粒度為數(shù)據(jù)集;
- 查詢服務(wù):包括查詢接口服務(wù)、后臺(tái)管理服務(wù)、存儲(chǔ)引擎查詢器,以及其他輔助功能。針對(duì)不同的存儲(chǔ)引擎會(huì)有與之對(duì)應(yīng)的查詢器進(jìn)行數(shù)據(jù)查詢支持。
2.4 查詢引擎設(shè)計(jì)
圖片
在查詢引擎方面,因?yàn)槲覀円С植煌牟樵円孢M(jìn)行查詢,所以我們抽象出了一些抽象類,其中有通用統(tǒng)一的Map類型數(shù)據(jù)源參數(shù)、數(shù)據(jù)集參數(shù)、通用的接口調(diào)用方法等,通過繼承查詢器抽象類的方式實(shí)現(xiàn)各類存儲(chǔ)引擎的查詢器,可以方便的對(duì)查詢器進(jìn)行管理、擴(kuò)展與功能開發(fā)。同時(shí)針對(duì)不同的查詢引擎可以做定制化的查詢控制與優(yōu)化。查詢器抽象類抽象方法大致如下:
- getSchemas 獲取庫信息
- getTables 獲取表信息
- getDatasetDetail 查詢數(shù)據(jù)集配置
- queryDimVals 查詢維度信息
- queryAggData 查詢數(shù)據(jù)
- viewAggDataQuery 查詢生成查詢sql或者執(zhí)行計(jì)劃信息
- getAggregateDataDownload 同步下載數(shù)據(jù)
- getDataDownloadAsync 異步下載數(shù)據(jù)接口
統(tǒng)一查詢參數(shù)cfg設(shè)計(jì)與查詢信息封裝:上層應(yīng)用通過數(shù)據(jù)集元信息,根據(jù)查詢場景生成組裝Json格式的查詢參數(shù),包括維度、過濾、聚合、指標(biāo)查詢信息。后端收到對(duì)應(yīng)數(shù)據(jù)集與查詢信息組裝對(duì)應(yīng)查詢邏輯,然后調(diào)用查詢接口對(duì)數(shù)據(jù)進(jìn)行查詢與結(jié)果返回。參數(shù)示例如下:
{
"rows": [
{
"columnName": "date",
"filterType": "eq",
"values": []
},
{
"columnName": "channelname",
"filterType": "eq",
"values": []
}
],
"filters": [
{
"columnName": "date",
"filterType": "=",
"values": [
"2023-05-10-00"
]
}
],
"values": [
{
"column": "active_count",
"aggType": "sum"
}
],
"pageSize": 10,
"pageNum": 1
}
常用查詢參數(shù)簡要說明:
- rows字段為group by的維度
- filters為過濾條件,支持各類過濾條件定義表達(dá)
- values為查詢指標(biāo) aggType支持:count、sum、avg、max、min、distinct、raw原始值
- orders為排序?qū)傩?,columnName為列名,orderType為排序升序降序值為 ASC、DESC
- pageSize 頁面行數(shù)
- pageNum 頁碼
前端或者后端開發(fā),通過數(shù)據(jù)開發(fā)配置的數(shù)據(jù)集信息,可以快速的生成自己的場景查詢的cfg配置,然后把請(qǐng)求發(fā)送到統(tǒng)一查詢服務(wù)上,服務(wù)會(huì)根據(jù)數(shù)據(jù)集配置的數(shù)據(jù)源信息,獲取到對(duì)應(yīng)數(shù)據(jù)存儲(chǔ)引擎的查詢器,然后把對(duì)應(yīng)的查詢配置參數(shù)通過邏輯轉(zhuǎn)換成對(duì)應(yīng)引擎的查詢邏輯,完成數(shù)據(jù)查詢并組裝會(huì)返回結(jié)果。
至此我們基本完成了One-Service核心功能的設(shè)計(jì),當(dāng)有新的查詢引擎需要支持的時(shí)候,我們通過繼承對(duì)應(yīng)的抽象類,完成相應(yīng)的方法即可以對(duì)該查詢引擎的數(shù)據(jù)進(jìn)行查詢,開發(fā)工作量相對(duì)比較小,可以快速支持新引擎,截止目前我們已經(jīng)完成了大多數(shù)引擎的查詢支持。對(duì)于具體的復(fù)雜的應(yīng)用場景,我們可以通過數(shù)據(jù)開發(fā)的結(jié)果表,配置生成不同的數(shù)據(jù)集來做二次邏輯加工,來支持多樣的數(shù)據(jù)需求。同時(shí)我們開發(fā)了https、微服務(wù)兩個(gè)數(shù)據(jù)查詢服務(wù)版本方便于前端、后端開發(fā)人員對(duì)接數(shù)據(jù)需求。
2.5 數(shù)據(jù)安全
圖片
數(shù)據(jù)安全管控對(duì)于保護(hù)數(shù)據(jù)資產(chǎn)、維護(hù)數(shù)據(jù)完整性和合規(guī)性至關(guān)重要。通過數(shù)據(jù)安全管控,企業(yè)可以降低數(shù)據(jù)泄露、濫用和損壞的風(fēng)險(xiǎn),確保數(shù)據(jù)安全。在數(shù)據(jù)安全方面,目前控制到數(shù)據(jù)集粒度。整體上通過兩種方式來管理:
- 一個(gè)種是對(duì)接了權(quán)限認(rèn)證的系統(tǒng),用戶登錄之后通過配置的用戶角色與數(shù)據(jù)集對(duì)應(yīng)關(guān)系來管理用戶對(duì)應(yīng)的數(shù)據(jù)集權(quán)限,在用戶進(jìn)行數(shù)據(jù)查詢請(qǐng)求時(shí)后端服務(wù)會(huì)校驗(yàn)用戶權(quán)限,對(duì)沒有對(duì)應(yīng)數(shù)據(jù)集權(quán)限的查詢請(qǐng)求進(jìn)行攔截;
- 另一種沒有用戶認(rèn)證的情況,采用授權(quán)碼的方式來控制用戶數(shù)據(jù)集的訪問權(quán)限,這種情況一般多用在內(nèi)部的后端服務(wù)調(diào)用上,保證后端在使用查詢服務(wù)的情況下依然有權(quán)限管控,不能看到權(quán)限以外的數(shù)據(jù)集信息。
同時(shí)在系統(tǒng)中,有對(duì)應(yīng)請(qǐng)求的查詢記錄信息和監(jiān)控告警模塊,對(duì)于異常查詢、鑒權(quán)異常、慢查詢等進(jìn)行相應(yīng)的監(jiān)控,可以通過告警或者限流的方式篩選出異常查詢情況并做出相應(yīng)的處理,來保證系統(tǒng)的穩(wěn)定與數(shù)據(jù)的安全。
2.6 智能查詢
圖片
在服務(wù)投入使用的過程中,我們發(fā)現(xiàn)很多請(qǐng)求其實(shí)請(qǐng)求的結(jié)果數(shù)據(jù)量級(jí)很小邏輯很輕,這種請(qǐng)求如果都發(fā)送到OLAP的引擎中進(jìn)行查詢,在早高峰資源占用緊張的情況下也會(huì)受到影響,影響用戶查詢體驗(yàn)。而且各種數(shù)據(jù)庫或者OLAP引擎都有著各自適用的場景,目前針對(duì)大數(shù)據(jù)并沒有一個(gè)完美引擎,因此在這套查詢體系里為了最大化用戶體驗(yàn),提升查詢效率,設(shè)計(jì)根據(jù)數(shù)據(jù)集優(yōu)先級(jí),以及查詢條件自動(dòng)選擇最適合的查詢引擎來進(jìn)行數(shù)據(jù)查詢與加載。
- 底層寬表:比如我們?cè)贖ive當(dāng)中有訂單主題的寬表,我們會(huì)按照業(yè)務(wù)分析場景,把寬表拆成最常用分析維度數(shù)據(jù)集,較常用維度數(shù)據(jù)集,全量數(shù)據(jù)集等數(shù)據(jù)集;
- 數(shù)據(jù)子集:根據(jù)寬表與分析場景的情況,我們會(huì)配置定義出各類數(shù)據(jù)分析子集,分析場景下的全量數(shù)據(jù)集會(huì)存儲(chǔ)在ClickHouse當(dāng)中進(jìn)行最后命中查詢,不同維度的子集與存儲(chǔ)引擎可以多對(duì)一進(jìn)行任意優(yōu)先配置與組合;
- 優(yōu)先級(jí):根據(jù)分析場景與數(shù)據(jù)量級(jí)大小,把最常用的數(shù)據(jù)集按照引擎特性分別存儲(chǔ)在不同的數(shù)據(jù)庫或者OLAP引擎當(dāng)中,根據(jù)查詢性能、數(shù)據(jù)量級(jí)的不同常規(guī)優(yōu)先級(jí) MySQL(高)-> Kylin(中) -> ClickHouse(低);
- 引擎選擇器:當(dāng)我們查詢某一個(gè)數(shù)據(jù)集的時(shí)候,會(huì)去判斷該數(shù)據(jù)集所屬數(shù)據(jù)集組,在改組下有各種維度不同存儲(chǔ)引擎下的數(shù)據(jù)集,再根據(jù)查詢條件按照配置好的優(yōu)先級(jí)順序,進(jìn)行匹配查詢。追求最好的查詢效率。
這是一種常用的處理方式,用存儲(chǔ)空間換取查詢效率與用戶體驗(yàn)的方案,這個(gè)方案中在不同的引擎里會(huì)冗余不同維度的子數(shù)據(jù)集數(shù)據(jù),具體的都要視查詢場景與數(shù)據(jù)集特點(diǎn)進(jìn)行拆分優(yōu)化,充分利用每個(gè)引擎的特點(diǎn)與優(yōu)勢,來提供更快更穩(wěn)定的查詢體驗(yàn)。
2.7.平臺(tái)建設(shè)
圖片
在系統(tǒng)核心功能完成之后,在易用性上我們基于該服務(wù)建設(shè)了管理功能與自助分析平臺(tái)。整體如上圖所示,我們可以查看自己有權(quán)限的數(shù)據(jù)集,并對(duì)數(shù)據(jù)集的數(shù)據(jù)進(jìn)行自助分析,選擇維度過濾,確定查詢的指標(biāo)與分組的維度進(jìn)行自助的數(shù)據(jù)查詢與分析。同時(shí)展示了對(duì)應(yīng)的查詢參數(shù)cfg參數(shù)與最終生成的查詢SQL,方面前后端開發(fā)人員快速上手使用該查詢服務(wù),提升開發(fā)效率。
至此通過該系統(tǒng)基本上解決了數(shù)據(jù)查詢服務(wù)統(tǒng)一的問題,在統(tǒng)一的指標(biāo)管理、數(shù)據(jù)集管理的體系下,保證了數(shù)據(jù)出口邏輯的一致性。并且該系統(tǒng)可以支持橫向擴(kuò)展來適應(yīng)更多的查詢請(qǐng)求。完成支持各類數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)查詢服務(wù),提供統(tǒng)一、穩(wěn)定、便捷、安全、可擴(kuò)展的數(shù)據(jù)查詢出口統(tǒng)一查詢服務(wù)One-Service系統(tǒng)。
三、未來規(guī)劃
圖片
- 權(quán)限管理細(xì)化:主要是要以更細(xì)的粒度管控?cái)?shù)據(jù)權(quán)限,把數(shù)據(jù)權(quán)限控制到指標(biāo)字段級(jí)別,進(jìn)一步保證數(shù)據(jù)使用的安全。并且在異常請(qǐng)求訪問攔截上增強(qiáng)識(shí)別能力,通過多種手段及時(shí)干預(yù)防止發(fā)生數(shù)據(jù)泄露等情況。
- 多引擎支持:目前已經(jīng)支持了大部分的OLAP的存儲(chǔ)分析引擎,后續(xù)考慮到應(yīng)用場景的多樣性,準(zhǔn)備接入Redis、ElasticSearch等存儲(chǔ)引擎,擴(kuò)展服務(wù)使用場景。
- 線上服務(wù)化:目前各個(gè)查詢之間沒有做資源隔離,對(duì)高QPS高穩(wěn)定性要求的場景不能夠很好的支持,如果同時(shí)有一些大查詢?cè)谔幚恚敲磩荼貢?huì)對(duì)其他查詢有一定的影響,所以為了滿足上面的場景需要對(duì)查詢資源進(jìn)行隔離或者劃分服務(wù)等級(jí),來區(qū)分使用場景區(qū)別對(duì)待,使統(tǒng)一查詢服務(wù)能夠直接對(duì)線上提供有保障的查詢服務(wù)。因?yàn)橐獙?duì)接線上的查詢服務(wù),所以對(duì)系統(tǒng)穩(wěn)定查詢穩(wěn)定有了更高的要求,要對(duì)各個(gè)查詢性能進(jìn)行監(jiān)控與有針對(duì)性的優(yōu)化,從而保障服務(wù)的穩(wěn)定。
- 易用性:在目前的使用過程中由于前后端都需要根據(jù)使用場景生成cfg查詢參數(shù),雖然提供了一些圖形化工具來幫助快速生成,但是也有一定的溝通和理解成本,為了提升開發(fā)效率,打算支持預(yù)制查詢參數(shù)組合,讓前后端在使用的時(shí)候可以簡單的通過設(shè)置屬性值的方式來完成傳參,整體上更易于理解,不用關(guān)心cfg參數(shù)具體的格式和各種拼接規(guī)則,采用常規(guī)的方式能夠更直接更簡單的使用查詢服務(wù),提升易用性。同時(shí)完善自助分析的功能,增加更多的展示形式,優(yōu)化操作邏輯,讓使用數(shù)據(jù)集進(jìn)行自助分析取數(shù)變的更簡單更智能,提升用戶體驗(yàn)與數(shù)據(jù)分析效率。
關(guān)于作者
張業(yè)成,轉(zhuǎn)轉(zhuǎn)數(shù)據(jù)智能部高級(jí)數(shù)據(jù)開發(fā)工程師,專注于數(shù)據(jù)開發(fā)與數(shù)據(jù)應(yīng)用平臺(tái)建設(shè)。