海量数据展现方案

时间 : 14-02-23 评论 : 0 点击 : 1,396 次

这两年互联网界都在谈海量数据,好像不谈海量数据都不好意思说自己是在互联网上混的,ocean也以自己有限的经验,谈一下海量数据相关的一些解决方案。

ocean的工作主要是在数据展现这一块,因此通过曾经开发过的一个数据产品作为案例,谈一下海量数据的展现方案,为大家提供一个思路,做的不好的地方,也请大家批评指正,共同进步。

架构图

海量数据架构图

数据量

每天入库数据5G+,一亿+条记录。

历史数据处理

随着系统的运行,数据会越积越多,数据库查询也会越来越慢。为了解决这个问题,设计了两套数据库,第一套只存储半年内的数据,第二套存储3年内的历史数据,超过3年的历史数据只做冷备,不提供查询。基本上99.9%的用户都只会查询半年内的数据,第一套数据库使用性能较好的设备,同时因为数据量少,查询速度快,保证了大部分用户的体验;第二套数据库查询速度比较慢,体验较差,主要是满足功能需求。

热点数据处理

对于用户查询比较多的数据,我们称为热点数据。对于热点数据,使用Mysqlmemory引擎,数据全部存在内存中,能够提升数倍的查询性能,进一步提升用户体验。Mysqlmemory引擎跟InnoDB、MyISAM引擎一样,是通过sql查询的,这样使得php查询数据库的代码不需要做任何改变,开发代价小。

DB路由管理

现在有三套DB了,为了解决路由问题,建了一个DB路由表。DB路由表定义如下:

db_id(分库ID table_name start_date end_date db
230 tb_test 20130501 20130531 1.1.1.1:3306

如上表所示,各字段分别表示所在分库,要查询的表名,要查询数据的起始时间,本次查询该路由到的db信息

DB路由管理表的好处是做到了DO分离(开发和运维分离),运维对mysql集群做了变动之后,不需要开发人员去修改代码,更改路由算法,运维自己修改DB路由表就可以完成变更了。

配置数据缓存

对于DB路由表和其它的一些写少读多的配置信息,缓存到memcache等缓存服务器中,可以提升响应速度,降低数据库负载。

海量数据分解

前面讲了这么多,每天的入库量还是1亿条,这仍然是一个我们无法处理的数字,我们要做的就是想办法分解。重点讲下半年内数据的那套数据库的处理情况。有2套主从db,每套分到5000万条记录,对数据库进行分库,我们使用的方案是分250个库,这样每个库分到20万条记录,这个数据产品有十几张表,平均下来每个表有2万条记录左右,这就是我们可以处理的一个数量级了。

实际情况并不是那么平均,有些表一天几百条记录、有些几千条记录、有些表几万条记录。最多的一个表有接近百万条记录,不过百万条记录的表是只存一天数据的,对表进行索引优化之后,查询耗时在20ms以内。还有一个表一天有4万条记录,半年下来将近800万条记录,对该表的日期字段和其它一些字段进行索引优化之后,查询30天的数据的耗时在500ms左右。该对哪些字段建立索引进行优化,要根据业务的具体情况具体分析。通常数据产品是基于app或者基于用户的,单个app或者单个用户的数据量并不会太多,大量的app和大量的用户组成了海量数据,app之间或者用户之间不需要经常进行联合查询,相对独立,这是能够进行分库的基础。

异步请求

php和前端页面数据交互通常有两种方式。一种是php把数据查询出来,然后在html中用php语法把数据显示出来;第二种是前端页面向php发起ajax请求,php吐出json格式数据,js在页面上把数据渲染出来。

我们采用第二种方案,因为第一种方案要求所有数据在一次请求中全部查询出来,一个页面中多个不同的数据模块被串联查询了,页面加载速度比较慢。第二种方式,多个不同的数据模块同时向webserver发起异步请求,数据查询是并发的,响应速度快很多。

其它

这里解释一个架构图中出现的apc缓存和mfs分布式文件服务器。因为php我们采用开源框架ci,开源框架在大大提升开发速度的同时,也极大的降低了php的执行速度。ci每次执行都会包含十几个php文件进来,做性能测试的时候发现cpu大部分时间都耗在打开文件上了,因此试用apc缓存把php的编译结果缓存在内存中,能够提升5-6倍的性能。因为采用了多台webserver,会存在共享用户上传的一些静态文件的问题(比如图片),mfs分布式文件服务器可以搭建在webserver上面,文件会分布到多台webserver,而每台webserver可以映射mfs的共享文件夹到本地,当作本地文件夹一样读取文件。共享文件夹也可以存储session数据,实现多台webserversession共享。

mysql, 海量数据

本文标签 , ,

海量数据展现方案:等您坐沙发呢!

发表评论