统计服务对业务数据进行迁移,分析。
外部迁移:
业务数据存储于Mysql中,Mysql存储的数据会进行垂直,水平切分,业务数据会存在于多个mysql表中,数据分散使得分析程序写起来头大。并且mysql的单表存储量有限,扩展起来也不容易,要定期做数据迁移。于是我们将mysql中的数据定时地迁移到mongoDB中,并清理mysql中的数据。
外部迁移的程序是通用的:全量迁移,增量迁移(insert,update)。迁移时是并发迁移的,可以根据业务ID或者时间分片。比如一个表中主要的操作是insert,这时他时间段内(上次迁移的结束时间到这次迁移的时间)ID基本是连续增长的,所以按ID分批,而某个表中的lastModifiedTime基本是连续的,这时我们按时间分批。
外部迁移将Mysql多个表中的数据迁移到mongoDB的一个collection中。同时支持进行一些数据格式的转换,但基本保证数据的原样性。
![](/images/blogjava_net/ldd600/migration.jpg)
内部迁移
内部迁移是对原始数据进行初步的整理,并临时存储到mongoDB的collection中。在统计完毕后清理临时表。
我们另外还开发了mongoDB查询表达式和Java DSL,查询表达式还支持用户自定义函数,内部迁移只需要做简单的配置,类似于SQL.
select max(column) as max, count(column), min(column) from collection where columnc=”” and column b=””
求最大值,最小值,可以用来分批并发处理。
select userFunction(columnd), * from collectionA where columna=”” and columnb=”” group by columna into collectionB values set(columnb), sum(columnc), count(columna)
将columnd的数据格式化后upsert到collectionB中
sum是对columnc求和
count是对columna求个数
内部迁移后的临时数据可以用来外部排重。比如求人数(非次数)可以group by后求count就可以了。
![](/images/blogjava_net/ldd600/analysis.jpg)
分析
分析程序我们也建议通过配置统计出来,也支持plugin的分析程序analyzer。
select sum(columna), count(columnb)
查询总数和个数
select columna,columnb from collectionB orderby columnc limit 30
查询值最大的30条数据
CMS和排行服务可以通过统计服务直接查询到感兴趣的数据。