锁定老帖子 主题:网站数据统计服务(一),架构
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-12
最后修改:2011-04-13
统计服务对业务数据进行迁移,分析。
外部迁移: 业务数据存储于Mysql中,Mysql存储的数据会进行垂直,水平切分,业务数据会存在于多个mysql表中,数据分散使得分析程序写起来头大。并且mysql的单表存储量有限,扩展起来也不容易,要定期做数据迁移。于是我们将mysql中的数据定时地迁移到mongoDB中,并清理mysql中的数据。
外部迁移的程序是通用的:全量迁移,增量迁移(insert,update)。迁移时是并发迁移的,可以根据业务ID或者时间分片。比如一个表中主要的操作是insert,这时他时间段内(上次迁移的结束时间到这次迁移的时间)ID基本是连续增长的,所以按ID分批,而某个表中的lastModifiedTime基本是连续的,这时我们按时间分批。
外部迁移将Mysql多个表中的数据迁移到mongoDB的一个collection中。同时支持进行一些数据格式的转换,但基本保证数据的原样性。
内部迁移 内部迁移是对原始数据进行初步的整理,并临时存储到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), sum(columnc), columna from collectionA group by columna into collectionB 将columnd的数据格式化后upsert到collectionB中 sum是对columnc求和 count是对columna求个数
内部迁移后的临时数据可以用来外部排重。比如求人数(非次数)可以group by后求count就可以了。
分析 分析程序我们也建议通过配置统计出来,也支持plugin的分析程序analyzer。 select sum(columna), count(columnb) 查询总数和个数
select columna,columnb from collectionB orderby columnc limit 30 查询值最大的30条数据
CMS和排行服务可以通过统计服务直接查询到感兴趣的数据。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-27
"比如一个表中主要的操作是insert,这时他时间段内(上次迁移的结束时间到这次迁移的时间)ID基本是连续增长的,所以按ID分批,而某个表中的lastModifiedTime基本是连续的,这时我们按时间分批。"
请问:如何判断“ID基本是连续增长的” 和 “lastModifiedTime基本是连续的”? |
|
返回顶楼 | |
发表时间:2011-05-28
chakey 写道 "比如一个表中主要的操作是insert,这时他时间段内(上次迁移的结束时间到这次迁移的时间)ID基本是连续增长的,所以按ID分批,而某个表中的lastModifiedTime基本是连续的,这时我们按时间分批。"
请问:如何判断“ID基本是连续增长的” 和 “lastModifiedTime基本是连续的”? 主要还是取决于当前的业务逻辑。 1.自增长的ID是连续增长的 2.这里有误,lastmodifytime不可能是连续的,应该表述成lastmodifytime是业务数据修改的时间。如果业务数据有改动需要重新爬取。 不管按哪种方式分批,都需要取出count,min,max最大值,计算分批。min,max用于确定边界,所以说需要可以不断增长的字段。sequence,time是不错的选择。 |
|
返回顶楼 | |
浏览 2162 次