重慶格洛博電子商務(wù)有限公司是一家專注于跨境貿(mào)易B2C電子商務(wù)公司。格洛博早期主營(yíng)互聯(lián)網(wǎng)行業(yè)海外流量服務(wù)及流量變現(xiàn),2018年初開(kāi)始主力運(yùn)營(yíng)綜合類商城網(wǎng)站,以客戶需求為導(dǎo)向,以誠(chéng)信之道為根本,以優(yōu)質(zhì)服務(wù)為使命,以物惠全球?yàn)樵妇?,為全球用戶提供多元化的互?dòng)式購(gòu)物體驗(yàn),全方位打造B2C跨境電子商務(wù)綜合體。
格洛博數(shù)據(jù)技術(shù)團(tuán)隊(duì)基于DorisDB建立一個(gè)實(shí)時(shí)分析系統(tǒng)。生產(chǎn)環(huán)境引入DorisDB后,查詢速度得到明顯提升,較DorisDB上線前提升至少10倍以上。
業(yè)務(wù)痛點(diǎn)及技術(shù)挑戰(zhàn)
格洛博作為一家自研電商平臺(tái)的電子商務(wù)公司,自主研發(fā)了廣告效果分析系統(tǒng)、訂單管理系統(tǒng)、供應(yīng)商管理系統(tǒng)、采購(gòu)管理系統(tǒng)、倉(cāng)儲(chǔ)管理系統(tǒng)、物流管理系統(tǒng)等,多個(gè)系統(tǒng)各類明細(xì)數(shù)據(jù)篩選條件較多,實(shí)時(shí)數(shù)據(jù)自定義多維度分析報(bào)表較多,包括廣告數(shù)據(jù)分析、銷售訂單分析、供應(yīng)商分析、采購(gòu)訂單分析、庫(kù)存分析、物流分析等等。
目前公司業(yè)務(wù)需求在技術(shù)實(shí)施過(guò)程中,由于業(yè)務(wù)增長(zhǎng)較快,團(tuán)隊(duì)研發(fā)能力無(wú)法快速跟上,大量業(yè)務(wù)依托于MySQL實(shí)現(xiàn),主要存在技術(shù)難點(diǎn)如下:
1.數(shù)據(jù)量大:業(yè)務(wù)明細(xì)數(shù)據(jù)較多,總體達(dá)10億數(shù)據(jù)以上;
2.多表join:各類多維度分析報(bào)表較多,涉及多個(gè)大表join;
3.實(shí)時(shí)分析:業(yè)務(wù)依據(jù)廣告效果投放,實(shí)時(shí)分析訂單變化,及時(shí)調(diào)整廣告預(yù)算;
4.實(shí)時(shí)監(jiān)控:動(dòng)態(tài)監(jiān)控下單流程行為,實(shí)時(shí)分析系統(tǒng)異常;
5.日志數(shù)據(jù):日志類與業(yè)務(wù)類數(shù)據(jù)同時(shí)存在于一體,沒(méi)有區(qū)分冷熱數(shù)據(jù),導(dǎo)致MySQL性能下降。
基于以上技術(shù)難點(diǎn),我們期望尋找到可替代MySQL的數(shù)據(jù)庫(kù),或建立一個(gè)OLAP實(shí)時(shí)分析系統(tǒng),提供一套快速、穩(wěn)定的實(shí)時(shí)數(shù)據(jù)服務(wù)。
技術(shù)選型
為解決實(shí)時(shí)分析的時(shí)效性,同時(shí)又能保證數(shù)據(jù)快速寫入查詢,先后調(diào)研了TiDB、ClickHouse、DorisDB,匯總?cè)缦拢?/p>
•TiDB:一款定位于在線事務(wù)處理/在線分析處理(HTAP)的融合數(shù)據(jù)庫(kù)產(chǎn)品,可替換MySQL,但生產(chǎn)環(huán)境要求配置較高,同時(shí)替換現(xiàn)有的MySQL數(shù)據(jù)庫(kù)成本高。
•ClickHouse:一款開(kāi)源的OLAP列式分析系統(tǒng),可單獨(dú)部署不影響現(xiàn)有架構(gòu),面向大寬表,支持MySQL外表,但無(wú)法支持好多表join,同時(shí)現(xiàn)有的業(yè)務(wù)SQL也需要一定部分改寫,運(yùn)維相對(duì)復(fù)雜。
•DorisDB:一款基于Apache開(kāi)源基金會(huì)頂級(jí)項(xiàng)目Apache Doris開(kāi)發(fā)的新一代極速M(fèi)PP分析型數(shù)據(jù)庫(kù),可單獨(dú)部署不影響現(xiàn)有架構(gòu),可多表join,實(shí)時(shí)數(shù)據(jù)查詢分析快,現(xiàn)有業(yè)務(wù)SQL基本無(wú)需改寫,支持MySQL外表,運(yùn)維簡(jiǎn)單,同時(shí)支持高并發(fā)、冷熱數(shù)據(jù)分離。
綜上所述,決定使用DorisDB建立一個(gè)實(shí)時(shí)分析系統(tǒng)。
數(shù)據(jù)同步
如上圖所示,我們使用Canal+Kafka方式實(shí)時(shí)將MySQL同步到DorisDB。Canal是阿里巴巴開(kāi)源的一個(gè)Mysql binlog同步工具,通過(guò)Canal我們可以把Mysql的數(shù)據(jù)同步到Kafka,在Kafka中數(shù)據(jù)是用Json的格式生成的,然后用DorisDB的Routine Load方式消費(fèi)Kafka數(shù)據(jù)同步到DorisDB。歷史數(shù)據(jù)通過(guò)創(chuàng)建MySQL外部表,使用INSERT SELECT方式導(dǎo)入到DorisDB。
冷熱數(shù)據(jù)存儲(chǔ)
實(shí)際使用DorisDB過(guò)程中,我們采用SSD/NVME+HDD實(shí)現(xiàn)冷熱數(shù)據(jù)分離存儲(chǔ),SSD/NVME存儲(chǔ)今年數(shù)據(jù),HDD存儲(chǔ)往年數(shù)據(jù)。同時(shí)DorisDB也支持冷熱數(shù)據(jù)自動(dòng)遷移的功能,相關(guān)建表參數(shù)可參考storage_medium、storage_cooldown_time等。
DorisDB在各場(chǎng)景中應(yīng)用
1.自定義多維度分析:業(yè)務(wù)人員自定義各種維度時(shí),系統(tǒng)自動(dòng)化動(dòng)態(tài)多表join,通過(guò)查詢DorisDB快速響應(yīng)查詢結(jié)果;
2.多條件明細(xì)數(shù)據(jù)查詢:實(shí)現(xiàn)了時(shí)間跨度范圍大的訂單數(shù)據(jù)、物流數(shù)據(jù)快速查詢;
3.定時(shí)導(dǎo)出明細(xì)數(shù)據(jù):實(shí)現(xiàn)了時(shí)間跨度范圍大的明細(xì)數(shù)據(jù)快速導(dǎo)出;
4.日志數(shù)據(jù)存儲(chǔ):利用DorisDB動(dòng)態(tài)分區(qū)特性,大量操作日志存儲(chǔ)于DorisDB,解決了日志類與業(yè)務(wù)類數(shù)據(jù)同時(shí)存儲(chǔ)在MySQL導(dǎo)致的性能下降問(wèn)題。
DorisDB上線效果
未使用DorisDB前,我們一直使用MySQL處理所有數(shù)據(jù),包括了實(shí)時(shí)數(shù)據(jù)分析,技術(shù)部門經(jīng)常收到業(yè)務(wù)部門的系統(tǒng)提速訴求,上線DorisDB后,提速訴求已基本沒(méi)有,上線前后SQL查詢對(duì)比結(jié)果如下表:

綜上表所述,在引入DorisDB后,查詢速度得到明顯提升,目前生成環(huán)境使用至少10倍以上。
遇到問(wèn)題及解決方案
1.SQL查詢GROUP BY:由于MySQL的sql_mode去掉了ONLY_FULL_GROUP_BY,轉(zhuǎn)移DorisDB測(cè)試過(guò)程中存在查詢報(bào)錯(cuò)“SELECT list is not in GROUP BY clause and contains nonaggregated column”,修改已有SQL即可解決;
2.varchar長(zhǎng)度問(wèn)題:MySQL的長(zhǎng)度以字符數(shù)計(jì)算,而DorisDB以字節(jié)計(jì)算,處理方案則是在生成創(chuàng)建DorisDB的SQL時(shí),長(zhǎng)度設(shè)置為原基礎(chǔ)上的2倍;
3.es外部表字符串部分顯示為null:DorisDB創(chuàng)建Elasticsearch外部表時(shí),屬性參數(shù)enable_docvalue_scan默認(rèn)為true,將其設(shè)置為false即可;
4.動(dòng)態(tài)創(chuàng)建分區(qū)不支持時(shí)間戳int型字段:DorisDB動(dòng)態(tài)創(chuàng)建分區(qū)支持date、datetime字段,目前我們將時(shí)間戳int型字段修改為datetime字段存儲(chǔ),當(dāng)然可以另外增加一列處理。
作者:林元猛,重慶格洛博技術(shù)負(fù)責(zé)人,負(fù)責(zé)產(chǎn)品技術(shù)實(shí)現(xiàn)、系統(tǒng)架構(gòu)設(shè)計(jì)等