統(tǒng)計(jì)服務(wù)對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行遷移,分析。
外部遷移:
業(yè)務(wù)數(shù)據(jù)存儲(chǔ)于Mysql中,Mysql存儲(chǔ)的數(shù)據(jù)會(huì)進(jìn)行垂直,水平切分,業(yè)務(wù)數(shù)據(jù)會(huì)存在于多個(gè)mysql表中,數(shù)據(jù)分散使得分析程序?qū)懫饋?lái)頭大。并且mysql的單表存儲(chǔ)量有限,擴(kuò)展起來(lái)也不容易,要定期做數(shù)據(jù)遷移。于是我們將mysql中的數(shù)據(jù)定時(shí)地遷移到mongoDB中,并清理mysql中的數(shù)據(jù)。
外部遷移的程序是通用的:全量遷移,增量遷移(insert,update)。遷移時(shí)是并發(fā)遷移的,可以根據(jù)業(yè)務(wù)ID或者時(shí)間分片。比如一個(gè)表中主要的操作是insert,這時(shí)他時(shí)間段內(nèi)(上次遷移的結(jié)束時(shí)間到這次遷移的時(shí)間)ID基本是連續(xù)增長(zhǎng)的,所以按ID分批,而某個(gè)表中的lastModifiedTime基本是連續(xù)的,這時(shí)我們按時(shí)間分批。
外部遷移將Mysql多個(gè)表中的數(shù)據(jù)遷移到mongoDB的一個(gè)collection中。同時(shí)支持進(jìn)行一些數(shù)據(jù)格式的轉(zhuǎn)換,但基本保證數(shù)據(jù)的原樣性。

內(nèi)部遷移
內(nèi)部遷移是對(duì)原始數(shù)據(jù)進(jìn)行初步的整理,并臨時(shí)存儲(chǔ)到mongoDB的collection中。在統(tǒng)計(jì)完畢后清理臨時(shí)表。
我們另外還開發(fā)了mongoDB查詢表達(dá)式和Java DSL,查詢表達(dá)式還支持用戶自定義函數(shù),內(nèi)部遷移只需要做簡(jiǎn)單的配置,類似于SQL.
select max(column) as max, count(column), min(column) from collection where columnc=”” and column b=””
求最大值,最小值,可以用來(lái)分批并發(fā)處理。
select userFunction(columnd), * from collectionA where columna=”” and columnb=”” group by columna into collectionB values set(columnb), sum(columnc), count(columna)
將columnd的數(shù)據(jù)格式化后upsert到collectionB中
sum是對(duì)columnc求和
count是對(duì)columna求個(gè)數(shù)
內(nèi)部遷移后的臨時(shí)數(shù)據(jù)可以用來(lái)外部排重。比如求人數(shù)(非次數(shù))可以group by后求count就可以了。

分析
分析程序我們也建議通過(guò)配置統(tǒng)計(jì)出來(lái),也支持plugin的分析程序analyzer。
select sum(columna), count(columnb)
查詢總數(shù)和個(gè)數(shù)
select columna,columnb from collectionB orderby columnc limit 30
查詢值最大的30條數(shù)據(jù)
CMS和排行服務(wù)可以通過(guò)統(tǒng)計(jì)服務(wù)直接查詢到感興趣的數(shù)據(jù)。