+ -
当前位置:首页 → 问答吧 → 文件缓存系统的设计与实现

文件缓存系统的设计与实现

时间:2008-09-23

来源:互联网

作者:刘晨光 QQ:64452627 MSN:[email protected] 转载请注明出处 2008-09-23

一、项目背景
    随着系统运营时间的增加,数据量与日俱增,数据库系统单张表的数量超过百万以上,数据的慢查询日志频频出现慢查询语句。根据观察得出以下规律:

大部分是查询的历史数据且重复率不高。

现行处理办法:

方法

可扩展性

复杂度

效果

查询优化

结构调整

Memcache


      
二、系统架构




三、文件缓存系统说明
   系统由唯一md5(global unique key)生成的零星小文件组成,每个文件存储一条数据库记录。存储系统暂时分成三级目录存储,每个目录由md5(key)的单一两个字符组成。

1.总容量:
((10 + 26) * (10 + 26)) * ((10 + 26) * (10 + 26)) *
((10 + 26) * (10 + 26)) * 1024 = 2229025112064条

2.缓存文件路径规则:
$md5 = md5($key)
$cache_file = $path.”/”.substr($md5,0,2)."/".substr($md5,3,2)."/".substr($md5, 5, 2)."/".$md5.".php";

3.数据存储格式:
/cache/6d/4a/f3/6d04af37caec85c561772d40a0540746.php
<?php
$arr_post_list[] = array (
0 => '26135',
1=> '~值得收藏的美图~-6',
2 => '2001456573',
3 => '张金鑫',
4 => 'fs4.cyworld.com.cn/data6',
5 => '1165344437538443_file.jpg',
6 => '3',
);
?>


4.使用
$sql = “SELECT id FROM table”;
$data = $db->getAll($sql);
$arr_post_list = array();
foreach($data as $record) {

$cache_file = getLocalCacheFile($record[“id”]);

require_once($cache_file);
}

5.服务器部署
    Web服务器与文件缓存服务器之间通过nfs mount进行通信, Web服务器与文件缓存服务器之间是一对多的关系,每个Web服务器上有多个mount点已解决单点故障问题。每次数据更新是更新到所有的cache节点上。

6.数据表id作为主索引
因为数据表id作为主索引,因此查询时至通过索引就可以得到所需数据。


四、测试
以一张记录总数为277376条数据的表为例进行测试。
测试工具webbench

结构比较

结构

SQL + Memcache( 前 n 页 )

SQL + File Cache( 所有数据 )

SQL

SELECT id,… FROM table …

SELECT id FROM table


      
       结果 (时长30秒)
speed(pages/min) transfer(bytes/sec)

并发

speed

transfer

requets

slow log

speed

transfer

requets

slow log

1

170

221430

85

228

294333

114

5

272

354360

136

有 3

382

493089

191

100

242

134336

121

有 5

236

117174

118

500

196

141882

98

有 12

120

154856

60

1000

140

174381

70

有 23

146

154074

73


       结论:
       系统改造后的方案比改造前随并发量(或运行时长)的增加对数据库产生压力增长缓慢。




五、文件散列
散列结果相对均衡,都在9-10M之间
9.4M
./cache/b8
9.8M
./cache/7a
9.3M
./cache/7c



六、问题与挑战

1.生成的缓存文件占用硬盘较大,未压缩处理时大致十倍于数据库。
2.把对数据库的压力转嫁到磁盘IO上,产生大量的随机读取,磁盘损害几率加大。
3.大量零星的小文件存储可能遇到linux inode问题。
4.合适的文件系统未测试证实。

说明:本方案测试用例非通用,需结合自身系统自行设置业务逻辑。

原文见:http://hi.baidu.com/meizhe/blog/ ... 38e7489358072f.html
自己点进去看吧,欢迎回帖讨论!

作者: meizhe1981   发布时间: 2008-09-23

哈哈。我想看下文

作者: 逆雪寒   发布时间: 2008-09-23

不好意思,刚才发得有点问题!

作者: meizhe1981   发布时间: 2008-09-23