All in ECP,轉(zhuǎn)轉(zhuǎn)一站式ES數(shù)據(jù)清洗解決方案
一、業(yè)務(wù)背景
??轉(zhuǎn)轉(zhuǎn)作為國(guó)內(nèi)頭部的循環(huán)經(jīng)濟(jì)產(chǎn)業(yè)公司,目前業(yè)務(wù)架構(gòu)是中臺(tái)模式。中臺(tái)負(fù)責(zé)提供通用的交易能力,靈活快速響應(yīng)業(yè)務(wù)需求,業(yè)務(wù)方負(fù)責(zé)前臺(tái)探索創(chuàng)新,為用戶提供有價(jià)值的服務(wù)。
??轉(zhuǎn)轉(zhuǎn)交易中臺(tái)目前分為基礎(chǔ)服務(wù)、訂單、促銷、天路、支付等方向,每個(gè)方向都擁有各自業(yè)務(wù)所需的ES索引,索引量級(jí)20+,數(shù)據(jù)量10億+。
??隨著轉(zhuǎn)轉(zhuǎn)業(yè)務(wù)的快速增長(zhǎng),目前研發(fā)對(duì)于ES類需求的手動(dòng)支撐已無(wú)法滿足業(yè)務(wù)的快速迭代訴求。目前不僅缺乏技術(shù)沉淀和數(shù)據(jù)積累,而且上手門檻高且效率低。為了解決痛點(diǎn),ECP(Elasticsearch Chain Planning)系統(tǒng)應(yīng)用而生。
二、現(xiàn)狀與問(wèn)題
2.1 現(xiàn)狀概述
根據(jù)歷史經(jīng)驗(yàn),目前索引重建需要如下步驟:
- 1、確定需求方使用的索引
- 2、找到該索引最新一次使用的模板,編輯模板
- 3、根據(jù)模板創(chuàng)建一個(gè)新的索引(indexName_vn),其中n代表版本號(hào)
- 4、修改該索引的寫邏輯handler
- 5、上線索引寫服務(wù)
- 6、配置新老索引雙寫
- 7、找到或編寫導(dǎo)出ID數(shù)據(jù)的(Shell或Python)腳本,執(zhí)行并導(dǎo)出存量ID源(沙箱已被限制MySQL命令)
- 8、上傳到清洗機(jī)上(沙箱或者線上),調(diào)用索引寫服務(wù)的接口,觸發(fā)數(shù)據(jù)清洗
- 9、修改索引讀服務(wù)配置,增加對(duì)新字段的查詢配置
- 10、切換索引別名,將流量指向新索引
- 11、停止雙寫
- 12、刪除舊索引
2.2 存在的問(wèn)題
- 1、人工操作腳本(Shell或Python)導(dǎo)出所有待清洗ID數(shù)據(jù);目前沙箱已禁用MySQL命令(出于安全考慮);文本比較大,經(jīng)常遇到內(nèi)存不足或磁盤不足的情況。
- 2、重建索引成本高,步驟多且效率低,訂單索引重建一次大概需要5~7天的時(shí)間(Bulk方式)。
- 3、清洗進(jìn)度無(wú)感知,無(wú)法預(yù)估完成時(shí)間。
- 4、無(wú)法斷點(diǎn)續(xù)刷,失敗后需要人工介入找到臨界點(diǎn)后手動(dòng)觸發(fā),費(fèi)時(shí)費(fèi)力。
- 5、索引存量清洗與增量清洗未隔離,可能會(huì)影響線上正常業(yè)務(wù)。正常渠道產(chǎn)生的增量數(shù)據(jù)和刷索引產(chǎn)生的存量會(huì)放置到同一個(gè)阻塞隊(duì)列中,然后處理器讀取該阻塞隊(duì)列,進(jìn)行數(shù)據(jù)處理,若處理失敗,會(huì)將該條記錄寫入到Fail文件中,一分鐘后讀取該文件再次放置到阻塞隊(duì)列中處理,如下圖:
三、 解決思路
- 抽象流程步驟,將索引刷新流程標(biāo)準(zhǔn)化&自動(dòng)化&可視化,以提高效率和準(zhǔn)確性。
- 系統(tǒng)賦能,釋放人力資源,提供完備的任務(wù)管理能力,包括中斷恢復(fù)、進(jìn)度可視化、QPS限流和心跳檢測(cè)等功能。
- 存量與增量隔離,利用架構(gòu)部提供基于標(biāo)簽的流量路由能力,實(shí)現(xiàn)數(shù)據(jù)清洗存量數(shù)據(jù)與增量數(shù)據(jù)的環(huán)境隔離。
- 權(quán)限控制與數(shù)據(jù)沉淀,接入公司統(tǒng)一權(quán)限管理系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)源與腳本管理、ES集群與索引管理(含模板管理)、任務(wù)管理,及操作日志記錄等。
四、 實(shí)戰(zhàn)揭秘
4.1 什么是ECP系統(tǒng)?
ECP(Elasticsearch Chain Planning)系統(tǒng),即一個(gè)基于Elasticsearch的數(shù)據(jù)傳輸鏈路計(jì)劃管理平臺(tái)。在轉(zhuǎn)轉(zhuǎn)技術(shù)體系內(nèi),致力于協(xié)助研發(fā)運(yùn)營(yíng)人員高效管理ES的索引新建、數(shù)據(jù)清洗、索引重建等任務(wù)計(jì)劃,并提供可靠的一站式任務(wù)流解決方案,提升ES類需求的響應(yīng)效率。
4.2 ECP系統(tǒng)有哪些功能?
4.2.1 任務(wù)管理
任務(wù)管理包含ES索引新建、數(shù)據(jù)清洗、索引重建等任務(wù)流。它提供了多個(gè)獨(dú)立模塊,包括索引新建刪除、別名切換、數(shù)據(jù)清洗、索引預(yù)熱、雙寫管理等,同時(shí)還擁有任務(wù)進(jìn)度可視化、暫停和恢復(fù)、QPS限流、中斷自動(dòng)恢復(fù)等能力,此外還留存了任務(wù)過(guò)程數(shù)據(jù),方便日后復(fù)盤和查看。
4.2.2 數(shù)據(jù)源和腳本管理
主要管理數(shù)據(jù)庫(kù)基本信息和獲取源數(shù)據(jù)的SQL腳本,供任務(wù)獲取源數(shù)據(jù)使用。它具有數(shù)據(jù)庫(kù)連接檢測(cè)、SQL語(yǔ)法校驗(yàn)及格式化等輔助功能。
4.2.3 集群和索引管理
主要管理索引的基本信息,如索引的名稱、別名、磁盤占用、所屬集群、分片數(shù)量、健康狀態(tài)、部門歸屬等。
4.2.4 索引模板管理
主要針對(duì)索引模板進(jìn)行集中管理,避免散落丟失,索引模板通常用于索引新建操作。
4.3 ECP系統(tǒng)解決了什么問(wèn)題?
4.3.1 解決了ES索引重建數(shù)據(jù)清洗任務(wù)流程中的卡點(diǎn)和難點(diǎn)
例如原來(lái)刷ES索引需要從數(shù)據(jù)庫(kù)手動(dòng)導(dǎo)出一份ID文件,并傳輸至ES寫服務(wù)的服務(wù)器上,然后遠(yuǎn)程RPC觸發(fā)開(kāi)始執(zhí)行,過(guò)程中需要人工值守,中斷手動(dòng)重試。還有編寫導(dǎo)ID的Shell或Python腳本、服務(wù)器之間文件上傳下載、遠(yuǎn)程RPC端口轉(zhuǎn)發(fā)、源索引模板缺失、進(jìn)度不可見(jiàn)、中斷無(wú)感知等重重難點(diǎn)。不但上手門檻高效率低,事倍功半;而且操作不規(guī)范,與公司日益規(guī)范化進(jìn)程相悖。這次ECP解決了這些問(wèn)題,使整個(gè)任務(wù)操作流程簡(jiǎn)單、順暢、高效、規(guī)范。
4.3.2 解決ES索引數(shù)據(jù)清洗環(huán)境耦合及速率問(wèn)題
原先ES索引存量數(shù)據(jù)清洗與線上增量數(shù)據(jù)共用同一隊(duì)列,當(dāng)清洗速率過(guò)大時(shí),會(huì)影響線上正常數(shù)據(jù)的消費(fèi)時(shí)效,影響用戶體驗(yàn),例如用戶已經(jīng)支付成功了,但是看到的仍是未支付等問(wèn)題。本次ECP利用架構(gòu)提供的基于標(biāo)簽的流量路由能力將存量與增量進(jìn)行了機(jī)器隔離,徹底解決該痛點(diǎn)。理論上在下游服務(wù)承受范圍內(nèi),只要增加ES寫服務(wù)機(jī)器,即可提升存量數(shù)據(jù)清洗的速率。
4.3.3 解決索引、模板、腳本分散導(dǎo)致的需求響應(yīng)低效問(wèn)題
原先的索引、模板、腳本散落在各個(gè)角落,每次需求過(guò)來(lái)需要翻找上次需求使用的腳本和模板,由于人員的流動(dòng),經(jīng)常找不見(jiàn)舊的腳本或模板,而需要研發(fā)重新造輪子。這樣不但耗費(fèi)時(shí)間精力,需求響應(yīng)慢,業(yè)務(wù)感知較差;而且沒(méi)有技術(shù)和數(shù)據(jù)的沉淀,缺乏系統(tǒng)性的持續(xù)迭代,進(jìn)而提高效率。本次ECP將這些收攏起來(lái),便于日后持續(xù)提效。
4.4 名詞解釋
4.4.1 任務(wù)
任務(wù)指為了完成某個(gè)目標(biāo)而建立的活動(dòng)或工作。具有目標(biāo)明確、時(shí)間限制、進(jìn)度追蹤等特性。ECP系統(tǒng)中的任務(wù)通常有存量ID清洗任務(wù),存量文件清洗任務(wù),索引構(gòu)建任務(wù)等。
4.4.2 索引簇(cù)和索引
索引簇是索引的抽象,索引簇定義了索引的唯一標(biāo)識(shí)、模板、屬性等,但沒(méi)有具體的實(shí)現(xiàn),類似于Java中的接口或類;而索引是索引簇的實(shí)例。例如:在訂單列表場(chǎng)景中,“我賣出的”訂單列表索引簇(唯一標(biāo)識(shí)是:order_list),實(shí)際索引實(shí)例為(order_list_v2),假設(shè)業(yè)務(wù)需要新增一個(gè)索引字段,那么我們會(huì)新建索引實(shí)例(order_list_v3),這里v2和v3索引都屬于索引簇(order_list)的實(shí)例。
4.4.3 數(shù)據(jù)源
即數(shù)據(jù)的來(lái)源,在ECP中,分為ID源,文本源和MySQL源。
4.4.4 腳本
即MySQL源和SQL腳本的組合,可以從數(shù)據(jù)庫(kù)中讀取源數(shù)據(jù)。
4.5 整體設(shè)計(jì)
4.6 系統(tǒng)演示
4.6.1 新建任務(wù)
4.6.2 任務(wù)執(zhí)行
五、結(jié)語(yǔ)
5.1 總結(jié)
總的來(lái)說(shuō),ECP系統(tǒng)是一個(gè)基于Elasticsearch的數(shù)據(jù)傳輸鏈路計(jì)劃管理平臺(tái),致力于為用戶提供更加高效、便捷的數(shù)據(jù)清洗解決方案。我們會(huì)持續(xù)迭代系統(tǒng)的功能,以滿足不斷變化的業(yè)務(wù)需求和用戶期望。
5.2 規(guī)劃
目前ECP系統(tǒng)v1.0版本上線不久,仍處于團(tuán)隊(duì)內(nèi)測(cè)階段,索引刷新類需求提效已初露鋒芒。接下來(lái)我們將持續(xù)完善和打磨,并計(jì)劃在未來(lái)增加更多實(shí)用的功能。例如,清洗任務(wù)定時(shí)執(zhí)行、reindex支持、別名切換回滾以及數(shù)據(jù)一致性校驗(yàn)等功能,這些功能將使日常的ES數(shù)據(jù)清洗工作更加高效便捷。