跟着ArthurXF学习搜索引擎理论——高速搜索理论
2008/06/12 18:40 ArthurXF
最近本人忙着完善ArthurXF建站框架的开源设计及PHP培训,很长时间未更新blog了,再这里对支持本人的朋友们表示抱歉,因为一直在写框架高速缓存,就有学生问我,google,baidu是用什么数据库做的?为什么那么大的数据量可以搜索的那么快呢?
在这里,我就和大家分享一下,我对搜索引擎的理解,仅仅是我的猜想,如有不对的地方,还望他人多多指点。
其实搜索引擎那么快速的反应,是任何一个数据库都做不到的。因为搜索引擎的数据是海量的,我们先举例搜索关键字mp3,在google里面有13亿的网页,搜索用时 0.04 秒,其实没有哪个数据库可以13亿条记录里面搜索结果出来只需要0.04秒,那么google是怎么做到的呢?
看完了上面的理论,其实我们可以很自豪的对投资人说,只要你跟我足够的钱(买服务器占了大部分,呵呵),我也可以做搜索引擎!
如何建立数据库结果集缓存?我正在写一个轻量级的数据库结果集缓存系统整合在我的ArthurXF网站系统里面,希望学习的朋友们到时可以下载来看看,多多指导!
在这里,我就和大家分享一下,我对搜索引擎的理解,仅仅是我的猜想,如有不对的地方,还望他人多多指点。
其实搜索引擎那么快速的反应,是任何一个数据库都做不到的。因为搜索引擎的数据是海量的,我们先举例搜索关键字mp3,在google里面有13亿的网页,搜索用时 0.04 秒,其实没有哪个数据库可以13亿条记录里面搜索结果出来只需要0.04秒,那么google是怎么做到的呢?
引用
其实我们用mysql都可以做出一个google来,因为大家所访问的搜索结果页面都是数据库结果集的缓存,怎么理解这个问题呢?我来举例说明。
我们假设在mysql数据库中从13亿条数据中搜索mp3关键字,需要耗时1分钟,那么做为用户的我们是无法忍受的,那么我们如何来改善这个结果呢?我们就要设计数据库结果集缓存了,也就是第一个人搜索的时候去数据库查找搜索结果,之后建立数据库结果集缓存,在规定时间内,如果还有人搜索mp3的,就直接将数据库结果集中的数据返回给用户,而不再搜索数据库了,这样就大大提高了用户的访问速度,一般可以把速度提升到小于1秒!过了规定时间以后重新建立数据库结果集缓存就可以更新结果列表了。
那么为什么我们没人碰到搜索非常慢的情况呢?也就是说为什么我不会成为第一个搜索的某个关键字的人呢?
其实非常简单,我们访问google,baidu的时候,我们只能访问到数据库结果集缓存,其实我们根本就访问不到搜索引擎的数据库。这样就可以保证每个人使用搜索引擎的时候,速度都很快!
那么搜索引擎的数据库结果集缓存怎么更新呢?也就是我们看到的数据库排列结果如何变化呢?
其实搜索引擎会根据大家搜索关键字的频率,从高到低来用机器人(程序)自动搜索数据库,建立或更新数据库结果集缓存,这样更新,即时数据库耗时5分钟才产生结果集,也不会有人投诉太慢的,呵呵。当用户再搜索相同的关键字时,就发现结果排列发生变化了。为了应对全球搜索的反应,所以google会在全球建立3大数据中心,共投入了45万台服务器,一些做抓取,一些更新缓存,一些做用户服务的。因为每个数据中心缓存更新的时间并不同步,所以才会发生google dance的现象。如何验证这个理论,你可以对比一个高频关键字和一个低频关键字的更新时间,你会发现高频关键字搜索结果更新速度远远超过低频关键字。
那么搜索结果有13亿,是不是需要建立庞大的数据库结果集缓存呢?如果有上亿的关键词那么不是需要非常多硬盘空间?
其实不管搜索结果有多少,数据库结果集缓存只会建立最高频率搜索的结果集,也就是每个搜索关键字的结果集有个最大页数,大家都知道,搜索结果列表访问最多的就是列表的前3页,但是又不能保证没有人会翻几十页,所以为了验证我的理论,测试结果表明baidu结果集缓存了76页,之后的结果会告诉你“提示:限于网页篇幅,部分结果未予显示。”,google的结果集缓存了100页,其实真的有人能翻页翻到100页的,恐怕也真是凤麟毛角了。那么就算每一页的缓存结果为2K,100页就是200K,看来需要一个海量的磁盘阵列来存储数据库结果集缓存是不可避免的。
那么众多的关键字,搜索引擎怎么知道应该建立哪写关键字的数据库结果集缓存呢?万一建立的关键字的数据库结果集缓存根本就没人查询那不是不很浪费硬盘空间?如何做好协调,既要合理使用硬盘空间,又要满足用户?
其实这个问题也不难解决,一定要建立关键字库,不断更新用户使用的关键字,并且记录关键字查询的次数,如果是一个从来没人用过的关键字,或者认为没必要建立缓存集的关键字,搜索引擎都会告诉你,找不到和您的查询 "kkdnwos" 相符的网页。其实谁能保证这个世界真的没人使用那个关键字呢?肯定有的,只是你查询的关键字还不在搜索引擎的关键字数据库中,只要你每天都搜几次那个关键字,相信再不久的将来,这个关键字会有搜索结果的。呵呵!
我们假设在mysql数据库中从13亿条数据中搜索mp3关键字,需要耗时1分钟,那么做为用户的我们是无法忍受的,那么我们如何来改善这个结果呢?我们就要设计数据库结果集缓存了,也就是第一个人搜索的时候去数据库查找搜索结果,之后建立数据库结果集缓存,在规定时间内,如果还有人搜索mp3的,就直接将数据库结果集中的数据返回给用户,而不再搜索数据库了,这样就大大提高了用户的访问速度,一般可以把速度提升到小于1秒!过了规定时间以后重新建立数据库结果集缓存就可以更新结果列表了。
那么为什么我们没人碰到搜索非常慢的情况呢?也就是说为什么我不会成为第一个搜索的某个关键字的人呢?
其实非常简单,我们访问google,baidu的时候,我们只能访问到数据库结果集缓存,其实我们根本就访问不到搜索引擎的数据库。这样就可以保证每个人使用搜索引擎的时候,速度都很快!
那么搜索引擎的数据库结果集缓存怎么更新呢?也就是我们看到的数据库排列结果如何变化呢?
其实搜索引擎会根据大家搜索关键字的频率,从高到低来用机器人(程序)自动搜索数据库,建立或更新数据库结果集缓存,这样更新,即时数据库耗时5分钟才产生结果集,也不会有人投诉太慢的,呵呵。当用户再搜索相同的关键字时,就发现结果排列发生变化了。为了应对全球搜索的反应,所以google会在全球建立3大数据中心,共投入了45万台服务器,一些做抓取,一些更新缓存,一些做用户服务的。因为每个数据中心缓存更新的时间并不同步,所以才会发生google dance的现象。如何验证这个理论,你可以对比一个高频关键字和一个低频关键字的更新时间,你会发现高频关键字搜索结果更新速度远远超过低频关键字。
那么搜索结果有13亿,是不是需要建立庞大的数据库结果集缓存呢?如果有上亿的关键词那么不是需要非常多硬盘空间?
其实不管搜索结果有多少,数据库结果集缓存只会建立最高频率搜索的结果集,也就是每个搜索关键字的结果集有个最大页数,大家都知道,搜索结果列表访问最多的就是列表的前3页,但是又不能保证没有人会翻几十页,所以为了验证我的理论,测试结果表明baidu结果集缓存了76页,之后的结果会告诉你“提示:限于网页篇幅,部分结果未予显示。”,google的结果集缓存了100页,其实真的有人能翻页翻到100页的,恐怕也真是凤麟毛角了。那么就算每一页的缓存结果为2K,100页就是200K,看来需要一个海量的磁盘阵列来存储数据库结果集缓存是不可避免的。
那么众多的关键字,搜索引擎怎么知道应该建立哪写关键字的数据库结果集缓存呢?万一建立的关键字的数据库结果集缓存根本就没人查询那不是不很浪费硬盘空间?如何做好协调,既要合理使用硬盘空间,又要满足用户?
其实这个问题也不难解决,一定要建立关键字库,不断更新用户使用的关键字,并且记录关键字查询的次数,如果是一个从来没人用过的关键字,或者认为没必要建立缓存集的关键字,搜索引擎都会告诉你,找不到和您的查询 "kkdnwos" 相符的网页。其实谁能保证这个世界真的没人使用那个关键字呢?肯定有的,只是你查询的关键字还不在搜索引擎的关键字数据库中,只要你每天都搜几次那个关键字,相信再不久的将来,这个关键字会有搜索结果的。呵呵!
看完了上面的理论,其实我们可以很自豪的对投资人说,只要你跟我足够的钱(买服务器占了大部分,呵呵),我也可以做搜索引擎!
如何建立数据库结果集缓存?我正在写一个轻量级的数据库结果集缓存系统整合在我的ArthurXF网站系统里面,希望学习的朋友们到时可以下载来看看,多多指导!
引用
另外本人还在搞php实习培训,到我公司跟着项目一边学习一边实践,全程指导使用本人设计的ArthurXF建站系统快速建站。有意向的朋友,可以跟我公司的小姑娘联系。QQ:272209362。
海猫网页预览拍照服务器
2007/09/22 11:58 ArthurXF
海猫是一款运行于LINUX系统上的网页预览、拍照服务器软件。 对于美工、普通用户,海猫可以成批地抓拍他们感兴趣的网页,保存为图片,方便收藏与管理。 对于互联网站,诸如大型搜索引擎、垂直搜索引擎、在线书签、网址大全等类网站,更是海猫大显身手的地方。利用海猫来预览网站内容,如同snap.com一样,可显著提升用户体验,提高搜索准确度。利用海猫抓拍的图片来作为网址或书签的标志,如alexa.com一样,更能有效提升网站观感、新鲜感,增加用户粘性。随着时间的推移,带宽的增加,这种技术将会得到更广泛的应用。
功能特色
后台运行
海猫作为一款LINUX服务器软件,运行于后台,不需要X-Windows。通过命令行工具和SOCKET调用与海猫进行通讯,获得服务。
多线程运行
因为运行于多线程模式,所以海猫服务效率很高,能够同时接受来自不同用户的网页拍照请求。
缩略图大小可随意指定
默认缩略图大小为109x82和1024x768,但用户可以自行选择一个或多个不同的大小,海猫会根据要求生成指定大小的缩略图。
能够抓拍整个页面
一般的网页转图片软件只能转网页的第一页,但海猫能将整个页面抓拍下来,存为图片,功能强大,发送请求只需指定enable-full为1即可,十分简单。
接口简单
海猫采用类似HTTP的操作协议,客户端程序通过SOCKET与其通讯,接受抓拍结果。这种方式的好处是WEB应用程序嵌入方便,一般的网站非常容易使用上海猫。
海猫2.0抓拍网址为什么那么快
通过比较以下抓拍步骤,就可以看出海猫2.0与1.0的差别。
海猫1.0:
接受抓拍网址 ==> 启动抓拍进程 ==> 等待进程进入就绪状态 ==> 开始抓拍 ==> 返回结果
海猫2.0:
接受抓拍网址 ==> 开始抓拍 ==> 返回结果
因为抓拍时少了“启动抓拍进程”和“等待进程进入就绪状态”这两步,所以海猫2.0在抓拍速度上表现得非常好。
为什么海猫2.0在接受抓拍网址后就能开始抓拍,原因在于海猫2.0采用了与1.0不同的体系结构。
海猫1.0相对简单,海猫作为一个服务启动,有抓拍请求时会新建一个抓拍进程来处理,处理完毕,进程被注销。
而海猫2.0将抓拍进程变成了抓拍服务器。海猫2.0在启动时,根据配置要求,会启动若干个抓拍服务器。这些抓拍服务器启动后,
一直处于就绪状态,等待海猫发送抓拍命令。海猫在接收到抓拍请求后,查看有哪个抓拍服务器不忙,就将抓拍请求送给这个抓拍服务
器,抓拍结束后,这个抓拍服务器再次等待抓拍指令,海猫则将抓拍结果返回。
将抓拍进程变为一个抓拍服务器,是最具挑战性的工作,也是海猫2.0鲜明的特色,目前很少有人做得到。这也是海猫的过人之处。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
功能特色
后台运行
海猫作为一款LINUX服务器软件,运行于后台,不需要X-Windows。通过命令行工具和SOCKET调用与海猫进行通讯,获得服务。
多线程运行
因为运行于多线程模式,所以海猫服务效率很高,能够同时接受来自不同用户的网页拍照请求。
缩略图大小可随意指定
默认缩略图大小为109x82和1024x768,但用户可以自行选择一个或多个不同的大小,海猫会根据要求生成指定大小的缩略图。
能够抓拍整个页面
一般的网页转图片软件只能转网页的第一页,但海猫能将整个页面抓拍下来,存为图片,功能强大,发送请求只需指定enable-full为1即可,十分简单。
接口简单
海猫采用类似HTTP的操作协议,客户端程序通过SOCKET与其通讯,接受抓拍结果。这种方式的好处是WEB应用程序嵌入方便,一般的网站非常容易使用上海猫。
海猫2.0抓拍网址为什么那么快
通过比较以下抓拍步骤,就可以看出海猫2.0与1.0的差别。
海猫1.0:
接受抓拍网址 ==> 启动抓拍进程 ==> 等待进程进入就绪状态 ==> 开始抓拍 ==> 返回结果
海猫2.0:
接受抓拍网址 ==> 开始抓拍 ==> 返回结果
因为抓拍时少了“启动抓拍进程”和“等待进程进入就绪状态”这两步,所以海猫2.0在抓拍速度上表现得非常好。
为什么海猫2.0在接受抓拍网址后就能开始抓拍,原因在于海猫2.0采用了与1.0不同的体系结构。
海猫1.0相对简单,海猫作为一个服务启动,有抓拍请求时会新建一个抓拍进程来处理,处理完毕,进程被注销。
而海猫2.0将抓拍进程变成了抓拍服务器。海猫2.0在启动时,根据配置要求,会启动若干个抓拍服务器。这些抓拍服务器启动后,
一直处于就绪状态,等待海猫发送抓拍命令。海猫在接收到抓拍请求后,查看有哪个抓拍服务器不忙,就将抓拍请求送给这个抓拍服务
器,抓拍结束后,这个抓拍服务器再次等待抓拍指令,海猫则将抓拍结果返回。
将抓拍进程变为一个抓拍服务器,是最具挑战性的工作,也是海猫2.0鲜明的特色,目前很少有人做得到。这也是海猫的过人之处。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
跟ArthurXF探讨大型网站架构——资料篇2
2007/08/12 15:29 ArthurXF
上一篇我们看了分布式运算的资料,这次我们来看看分布式内存共享。目前在PHP领域中能够做到分布式内存共享的只有Memcache。
1.memcached详细介绍。
2.memcached在freebsd下的安装:
3.memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
4.安装php对memcache支持模块
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
http://pecl.php.net/package/memcache
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
http://nio.infor96.com/wp-content/uploads/2006/04/memcached-client.zip
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
5.PHP memcached 应用示例
6.使用memcache情况,计数器、数据压缩的例子
使用情况一:统计
//访问统计
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
if($s=$memcache->get('a')) {
$s=$s+1;
$memcache->set('a',$s);
}
else
$memcache->set('a',1);
echo '访问结果为:'.$s;
?>
其实我们可以用increment方法代替上面的做法
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
if($s=$memcache->increment('a',1)) {
echo $s;
}
else
$memcache->set('a',1);
?>
数据压缩:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$test=(str_repeat('jetwong',100000));
$memcache->set('b',($test));
?>
使用压缩:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$test=(str_repeat('jetwong',100000));
$memcache->set('b',($test),MEMCACHE_COMPRESSED);
?>
使用情况说明:
前台比较 目前内存bytes 总共读取bytes_read 总共写入bytes_written
压缩前 700085 700081 416
压缩后 1131 1125 13
可能看到压缩后明显占用内存少了不少
Memcache内存的更新清理(delete flush)
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
/*设置值*/
$status = $memcache->getStats();
echo '设置前内存使用情况'.$status['bytes'].'
';
echo '设置后';
for($i=0;$i<9;$i++) {
$memcache->set('b'.$i,rand(1,99));
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
/*查看设置的值*/
$status = $memcache->getStats();
echo 'delete前内存使用情况'.$status['bytes'].'
';
echo '
开始delete';
for($i=0;$i<9;$i++) {
$memcache->delete('b'.$i);
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
/*查看flush使用的情况*/
$status = $memcache->getStats();
echo '使用flush前内存使用情况'.$status['bytes'].'
';
echo '使用flush情况:';
for($i=0;$i<9;$i++) {
$memcache->set('b'.$i,rand(1,99));
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
$memcache->flush();
echo 'flush之后:';
for($i=0;$i<9;$i++) {
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
$status = $memcache->getStats();
echo 'flush后内存使用情况'.$status['bytes'].'
';
?>
内存超量的测试(set)
我们把内存设为2M
./memcached -d -m 2 -p 11211 -u root
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
//600K左右
$test1= str_repeat('jetlee',100000);
//600K左右
$test2= str_repeat('jetlee',100000);
//600K左右
$test3= str_repeat('李连杰',200000);
//600K左右
$test4= str_repeat('连杰李',100000);
//200K
$test5= file_get_contents('http://img.pconline.com.cn/images/photoblog/2988177/20068/4/1154688770042_mthumb.JPG');
$test6= file_get_contents('http://img.pconline.com.cn/images/photoblog/1767557/20069/28/1159417108902_mthumb.jpg');
for($i=1;$i<=6;$i++) {
$j='test'.$i;
if($memcache->set($j,$$j)) {
echo $j.'->设置成功
';
$status = $memcache->getStats();
echo '内存:'.$status['bytes'].'
';
}
else {
echo $j.'->设置失败
';
}
}
?>
执行结果:
test1->设置成功
内存:600042
test2->设置成功
内存:1200084
test3->设置失败
test4->设置成功
内存:1200084
test5->设置失败
test6->设置失败
刚好印证我们的计算,不过20万的repeat为什么会失败,不是太了解,,,,,,
总结:
示例:
//设置篇
if($data = $memcache->get('k',$v)) {
//显示我们的数据
}
else {
$data = get_from_database; //得到数据源
if(!$memcache->set('k',$data), MEMCACHE_COMPRESSED) //开始设置
log(); //不成功,记录失败信息
}
?>
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章?phpbr>?phpbr>?phpbr>?phpbr>?phpbr>?phpbr>?php>?php>9;$i++)>9;$i++)>9;$i++)>9;$i++)>=6;$i++)>?br>
1.memcached详细介绍。
引用
通常的网页缓存方式有动态缓存和静态缓存等几种,在ASP.NET中已经可以实现对页面局部进行缓存,而使用memcached的缓存比 ASP.NET的局部缓存更加灵活,可以缓存任意的对象,不管是否在页面上输出。而memcached最大的优点是可以分布式的部署,这对于大规模应用来 说也是必不可少的要求。
LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memcached作为缓存工具。memcached可以大规模网站应用发挥巨大的作用。
Memcached是什么?
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
如何使用memcached-Server端?
在服务端运行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
这将会启动一个占用2G内存的进程,并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。
如何使用memcached-Client端?
在应用端包含一个用于描述Client的Class后,就可以直接使用,非常简单。
PHP Example:
$options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");
$options["debug"] = false;
$memc = new MemCachedClient($options);
$myarr = array("one","two", 3);
$memc->set("key_one", $myarr);
$val = $memc->get("key_one");
print $val[0]."\n"; // prints 'one‘
print $val[1]."\n"; // prints 'two‘
print $val[2]."\n"; // prints 3
为什么不使用数据库做这些?
暂且不考虑使用什么样的数据库(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 实现事务(ACID,Atomicity, Consistency, Isolation, and Durability )需要大量开销,特别当使用到硬盘的时候,这就意味着查询可能会阻塞。当使用不包含事务的数据库(例如Mysql-MyISAM),上面的开销不存在,但 读线程又可能会被写线程阻塞。
Memcached从不阻塞,速度非常快。
为什么不使用共享内存?
最初的缓存做法是在线程内对对象进行缓存,但这样进程间就无法共享缓存,命中率非常低,导致缓存效率极低。后来出现了共享内存的缓存,多个进程或者线程共享同一块缓存,但毕竟还是只能局限在一台机器上,多台机器做相同的缓存同样是一种资源的浪费,而且命中率也比较低。
Memcached Server和Clients共同工作,实现跨服务器分布式的全局的缓存。并且可以与Web Server共同工作,Web Server对CPU要求高,对内存要求低,Memcached Server对CPU要求低,对内存要求高,所以可以搭配使用。
Mysql 4.x的缓存怎么样?
Mysql查询缓存不是很理想,因为以下几点:
当指定的表发生更新后,查询缓存会被清空。在一个大负载的系统上这样的事情发生的非常频繁,导致查询缓存效率非常低,有的情况下甚至还不如不开,因为它对cache的管理还是会有开销。
在32位机器上,Mysql对内存的操作还是被限制在4G以内,但memcached可以分布开,内存规模理论上不受限制。
Mysql上的是查询缓存,而不是对象缓存,如果在查询后还需要大量其它操作,查询缓存就帮不上忙了。
如果要缓存的数据不大,并且查询的不是非常频繁,这样的情况下可以用Mysql 查询缓存,不然的话memcached更好。
数据库同步怎么样?
这里的数据库同步是指的类似Mysql Master-Slave模式的靠日志同步实现数据库同步的机制。
你可以分布读操作,但无法分布写操作,但写操作的同步需要消耗大量的资源,而且这个开销是随着slave服务器的增长而不断增长的。
下一步是要对数据库进行水平切分,从而让不同的数据分布到不同的数据库服务器组上,从而实现分布的读写,这需要在应用中实现根据不同的数据连接不同的数据库。
当这一模式工作后(我们也推荐这样做),更多的数据库导致更多的让人头疼的硬件错误。
Memcached可以有效的降低对数据库的访问,让数据库用主要的精力来做不频繁的写操作,而这是数据库自己控制的,很少会自己阻塞 自己。
Memcached快吗?
非常快,它使用libevent,可以应付任意数量打开的连接(使用epoll,而非poll),使用非阻塞网络IO,分布式散列对象到不同的服务器,查询复杂度是O(1)。(于敦德)
参考资料:
Distributed Caching with Memcached | Linux Journal
http://www.danga.com/
http://www.linuxjournal.com/article/7451
LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memcached作为缓存工具。memcached可以大规模网站应用发挥巨大的作用。
Memcached是什么?
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
如何使用memcached-Server端?
在服务端运行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
这将会启动一个占用2G内存的进程,并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。
如何使用memcached-Client端?
在应用端包含一个用于描述Client的Class后,就可以直接使用,非常简单。
PHP Example:
$options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");
$options["debug"] = false;
$memc = new MemCachedClient($options);
$myarr = array("one","two", 3);
$memc->set("key_one", $myarr);
$val = $memc->get("key_one");
print $val[0]."\n"; // prints 'one‘
print $val[1]."\n"; // prints 'two‘
print $val[2]."\n"; // prints 3
为什么不使用数据库做这些?
暂且不考虑使用什么样的数据库(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 实现事务(ACID,Atomicity, Consistency, Isolation, and Durability )需要大量开销,特别当使用到硬盘的时候,这就意味着查询可能会阻塞。当使用不包含事务的数据库(例如Mysql-MyISAM),上面的开销不存在,但 读线程又可能会被写线程阻塞。
Memcached从不阻塞,速度非常快。
为什么不使用共享内存?
最初的缓存做法是在线程内对对象进行缓存,但这样进程间就无法共享缓存,命中率非常低,导致缓存效率极低。后来出现了共享内存的缓存,多个进程或者线程共享同一块缓存,但毕竟还是只能局限在一台机器上,多台机器做相同的缓存同样是一种资源的浪费,而且命中率也比较低。
Memcached Server和Clients共同工作,实现跨服务器分布式的全局的缓存。并且可以与Web Server共同工作,Web Server对CPU要求高,对内存要求低,Memcached Server对CPU要求低,对内存要求高,所以可以搭配使用。
Mysql 4.x的缓存怎么样?
Mysql查询缓存不是很理想,因为以下几点:
当指定的表发生更新后,查询缓存会被清空。在一个大负载的系统上这样的事情发生的非常频繁,导致查询缓存效率非常低,有的情况下甚至还不如不开,因为它对cache的管理还是会有开销。
在32位机器上,Mysql对内存的操作还是被限制在4G以内,但memcached可以分布开,内存规模理论上不受限制。
Mysql上的是查询缓存,而不是对象缓存,如果在查询后还需要大量其它操作,查询缓存就帮不上忙了。
如果要缓存的数据不大,并且查询的不是非常频繁,这样的情况下可以用Mysql 查询缓存,不然的话memcached更好。
数据库同步怎么样?
这里的数据库同步是指的类似Mysql Master-Slave模式的靠日志同步实现数据库同步的机制。
你可以分布读操作,但无法分布写操作,但写操作的同步需要消耗大量的资源,而且这个开销是随着slave服务器的增长而不断增长的。
下一步是要对数据库进行水平切分,从而让不同的数据分布到不同的数据库服务器组上,从而实现分布的读写,这需要在应用中实现根据不同的数据连接不同的数据库。
当这一模式工作后(我们也推荐这样做),更多的数据库导致更多的让人头疼的硬件错误。
Memcached可以有效的降低对数据库的访问,让数据库用主要的精力来做不频繁的写操作,而这是数据库自己控制的,很少会自己阻塞 自己。
Memcached快吗?
非常快,它使用libevent,可以应付任意数量打开的连接(使用epoll,而非poll),使用非阻塞网络IO,分布式散列对象到不同的服务器,查询复杂度是O(1)。(于敦德)
参考资料:
Distributed Caching with Memcached | Linux Journal
http://www.danga.com/
http://www.linuxjournal.com/article/7451
2.memcached在freebsd下的安装:
引用
步骤1:安装memcached
代码:
# cd /usr/ports/databases/memcached/
# make install
步骤2:启动memcached
代码:
#/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd
参数解释:
-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
以上以完成了memcached的安装及启动!
使用时按要求填上IP与端口既可
代码:
# cd /usr/ports/databases/memcached/
# make install
步骤2:启动memcached
代码:
#/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd
参数解释:
-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
以上以完成了memcached的安装及启动!
使用时按要求填上IP与端口既可
3.memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
4.安装php对memcache支持模块
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
http://pecl.php.net/package/memcache
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
http://nio.infor96.com/wp-content/uploads/2006/04/memcached-client.zip
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
5.PHP memcached 应用示例
引用
首先 下载 memcached-client.php,在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:
add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
下面是一段简单的测试代码,代码中对标识符为 'mykey' 的对象数据进行存取操作:
是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
$sql = 'SELECT * FROM users';
$key = md5($sql); //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db('test');
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
$mc->add($key, $datas);
} else {
echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>
可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。
add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
下面是一段简单的测试代码,代码中对标识符为 'mykey' 的对象数据进行存取操作:
// 包含 memcached 类文件
require_once('memcached-client.php');
// 选项设置
$options = array(
'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
'debug' => true, //是否打开 debug
'compress_threshold' => 10240, //超过多少字节的数据时进行压缩
'persistant' => false //是否使用持久连接
);
// 创建 memcached 对象实例
$mc = new memcached($options);
// 设置此脚本使用的唯一标识符
$key = 'mykey';
// 往 memcached 中写入对象
$mc->add($key, 'some random strings');
$val = $mc->get($key);
echo "n".str_pad('$mc->add() ', 60, '_')."n";
var_dump($val);
// 替换已写入的对象数据值
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo "n".str_pad('$mc->replace() ', 60, '_')."n";
var_dump($val);
// 删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo "n".str_pad('$mc->delete() ', 60, '_')."n";
var_dump($val);
?>
是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
$sql = 'SELECT * FROM users';
$key = md5($sql); //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db('test');
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
$mc->add($key, $datas);
} else {
echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>
可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。
6.使用memcache情况,计数器、数据压缩的例子
引用
使用情况一:统计
//访问统计
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
if($s=$memcache->get('a')) {
$s=$s+1;
$memcache->set('a',$s);
}
else
$memcache->set('a',1);
echo '访问结果为:'.$s;
?>
其实我们可以用increment方法代替上面的做法
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
if($s=$memcache->increment('a',1)) {
echo $s;
}
else
$memcache->set('a',1);
?>
数据压缩:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$test=(str_repeat('jetwong',100000));
$memcache->set('b',($test));
?>
使用压缩:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$test=(str_repeat('jetwong',100000));
$memcache->set('b',($test),MEMCACHE_COMPRESSED);
?>
使用情况说明:
前台比较 目前内存bytes 总共读取bytes_read 总共写入bytes_written
压缩前 700085 700081 416
压缩后 1131 1125 13
可能看到压缩后明显占用内存少了不少
Memcache内存的更新清理(delete flush)
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
/*设置值*/
$status = $memcache->getStats();
echo '设置前内存使用情况'.$status['bytes'].'
';
echo '设置后';
for($i=0;$i<9;$i++) {
$memcache->set('b'.$i,rand(1,99));
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
/*查看设置的值*/
$status = $memcache->getStats();
echo 'delete前内存使用情况'.$status['bytes'].'
';
echo '
开始delete';
for($i=0;$i<9;$i++) {
$memcache->delete('b'.$i);
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
/*查看flush使用的情况*/
$status = $memcache->getStats();
echo '使用flush前内存使用情况'.$status['bytes'].'
';
echo '使用flush情况:';
for($i=0;$i<9;$i++) {
$memcache->set('b'.$i,rand(1,99));
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
$memcache->flush();
echo 'flush之后:';
for($i=0;$i<9;$i++) {
echo '
'.$i.'->'.$memcache->get('b'.$i);
}
$status = $memcache->getStats();
echo 'flush后内存使用情况'.$status['bytes'].'
';
?>
内存超量的测试(set)
我们把内存设为2M
./memcached -d -m 2 -p 11211 -u root
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
//600K左右
$test1= str_repeat('jetlee',100000);
//600K左右
$test2= str_repeat('jetlee',100000);
//600K左右
$test3= str_repeat('李连杰',200000);
//600K左右
$test4= str_repeat('连杰李',100000);
//200K
$test5= file_get_contents('http://img.pconline.com.cn/images/photoblog/2988177/20068/4/1154688770042_mthumb.JPG');
$test6= file_get_contents('http://img.pconline.com.cn/images/photoblog/1767557/20069/28/1159417108902_mthumb.jpg');
for($i=1;$i<=6;$i++) {
$j='test'.$i;
if($memcache->set($j,$$j)) {
echo $j.'->设置成功
';
$status = $memcache->getStats();
echo '内存:'.$status['bytes'].'
';
}
else {
echo $j.'->设置失败
';
}
}
?>
执行结果:
test1->设置成功
内存:600042
test2->设置成功
内存:1200084
test3->设置失败
test4->设置成功
内存:1200084
test5->设置失败
test6->设置失败
刚好印证我们的计算,不过20万的repeat为什么会失败,不是太了解,,,,,,
总结:
示例:
//设置篇
if($data = $memcache->get('k',$v)) {
//显示我们的数据
}
else {
$data = get_from_database; //得到数据源
if(!$memcache->set('k',$data), MEMCACHE_COMPRESSED) //开始设置
log(); //不成功,记录失败信息
}
?>
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章?phpbr>?phpbr>?phpbr>?phpbr>?phpbr>?phpbr>?php>?php>9;$i++)>9;$i++)>9;$i++)>9;$i++)>=6;$i++)>?br>
跟ArthurXF探讨大型网站架构——资料篇1
2007/08/10 15:47 ArthurXF
随着信息技术的应用和发展,未来单台计算机的处理能力是越来越不能满足要求了,势必将发展成为众多计算级组成的集群来做服务,不断的将更多的计算机加入集群就可以满足更大压力需求。
我这里说的集群是概念上的集群,最终这种大型的集群势必需要解决分布式运算(即众多CPU协同运算)和分布式存储(即文件分布在各个计算机中)和分布式内存共享(即形成了数据共享使用),这些问题都解决了,其实就是由很多分布在各地的计算机组成了一台超级计算机,由这台超级计算机去完成一定的服务。我觉得这势必是未来计算机发展的方向,当然这里还需要解决很多问题。
目前已经有了很多很成熟分布式的系统,我针对上面3个大方向,收集了一些资料,仅供参考。
先提供的分布式运算,也叫平行运算的资料。
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章>
我这里说的集群是概念上的集群,最终这种大型的集群势必需要解决分布式运算(即众多CPU协同运算)和分布式存储(即文件分布在各个计算机中)和分布式内存共享(即形成了数据共享使用),这些问题都解决了,其实就是由很多分布在各地的计算机组成了一台超级计算机,由这台超级计算机去完成一定的服务。我觉得这势必是未来计算机发展的方向,当然这里还需要解决很多问题。
目前已经有了很多很成熟分布式的系统,我针对上面3个大方向,收集了一些资料,仅供参考。
先提供的分布式运算,也叫平行运算的资料。
引用
LAM/MPI CLuster System With FreeBSD 5.3 HOWTO
tonnyom < tonnyom # hotmail.com >
版权声明:可以任意转载,转载时请务必以文字形式标明文章原始出处和作者信息及本声明.
前言
MPI(Message Passing Interface)消息传送接口
它不是一个协议,但它的地位已经实际上是一个协议了。它主要用于在分布式存储系统中的并行程序通信。MPI是一个函数库,它可以通过Fortran和C程序进行调用,MPI的好处是它速度比较快,而且移植性比较好。
Cluster
目前常见的Cluster(集群)架构有两种,一种是Web/Internet Cluster System,这种架构主要是将资料放置在不同的主机上面,亦即由多部主机同时负责一项服务;而另外一种则是所谓的平行运算了(Parallel Algorithms Cluster System)!平行运算其实就是将同一个运算的工作,交给整个Cluster里面的所有CPU来进行同步运算的一个功能。由于使用到多个CPU的运算能力,所以可以加快运算的速度。
此文档所安装架设的LAM/MPI Cluster System属于后者,由于实验环境条件以及自身能力的限制,可能文档有部分解释不详尽,如有疑问请来信与我联系,我将尽力完善此文档,谢谢!
软件及平台
Server \\ FreeBSD 5.3 Stable
IP:172.18.5.247
Hostname: center.the9.com
Client \\ FreeBSD 5.3 Release
IP:172.18.5.80
Hostname: node1.the9.com
apache_1.3.29 \\ All Ports Install
php4-4.3.10
php4-gd-4.3.10
php4-extensions-1.0
lam-6.5.9
ganglia-monitor-core-2.5.6
ganglia-webfrontend-2.5.5
目的
架设一套基于FreeBSD 5.3的LAM/MPI Cluster System.
安装及配置
一,各节点系统 /etc/hosts 的基本配置 \\ 如果内网有DNS,则配置好系统中的 /etc/resolv.conf 即可!
center.the9.com
#more /etc/hosts
172.18.5.247 center.the9.com
172.18.5.80 node1.the9.com
node1.the9.com
#more /etc/hosts
172.18.5.247 center.the9.com
172.18.5.80 node1.the9.com
二,Apache+PHP Server 的架设
center.the9.com
#cd /usr/ports/www/apache13-modssl
#make install clean \\ 安装 APACHE
#cd /usr/ports/lang/php4-extensions
#make install clean \\ 安装 PHP. 切记这里一定要选择安装GD库
#vi /usr/local/etc/apache/http.conf \\ 加入以下相关参数
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
三,NFS Server-Client 的架设
NFS Server(center.the9.com)
#vi /etc/rc.conf \\ 加入以下相关参数
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4 -h 172.18.5.247"
mountd_enable="YES"
mountd_flags="-r -l"
rpcbind_enable="YES"
rpcbind_flags="-l -h 172.18.5.247"
#vi /etc/exports \\ 配置NFS共享目录
/cluster -maproot=0:0 -network 172.18.5.0 -mask 255.255.255.0
#/etc/rc.d/rpcbind start #/etc/rc.d/mountd start #/etc/rc.d/nfsd start \\ 启动NFS Server
NFS Client(node1.the9.com)
#vi /etc/rc.conf \\ 加入以下相关参数
nfs_client_enable="YES"
#vi /etc/fstab \\ 加入以下相关参数 172.18.5.247:/cluster /cluster nfs rw 0 0
#mount /cluster \\ Mount /Cluster 目录
四,LAM/MPI Cluster System的架设
Step 1: 基本安装
center.the9.com
#cd /usr/ports/net/lam
#make install clean \\ 安装 LAM
#cd /usr/ports/sysutils/ganglia-monitor-core
#make install clean \\ 安装Cluster System 所需的Monitor Core
#cd /usr/ports/sysutils/ganglia-webfrontend
#make install clean \\ 安装上面Monitor Core 所需的WEB GUI
node1.the9.com
#cd /usr/ports/net/lam
#make install clean \\ 安装 LAM
#cd /usr/ports/sysutils/ganglia-monitor-core
#make install clean \\ 安装Cluster System 所需的Monitor Core
Step 2: 配置
center.the9.com
#cd /usr/local/etc/
#cp gmond.conf.sample gmond.conf
#cp gmetad.conf.sample gmetad.conf
#vi gmond.conf \\ 修改name和mcast_if 的参数
# The name of the cluster this node is a part of
# default: "unspecified"
name "BSDCluster"
# The multicast interface for gmond to send/receive data on
# default: the kernel decides based on routing configuration
mcast_if lnc0
#vi gmetad.conf \\ 修改data_source 的参数
# data_source "my cluster" 10 localhost my.machine.edu:8649 1.2.3.5:8655
# data_source "my grid" 50 1.3.4.7:8655 grid.org:8651 grid-backup.org:8651
# data_source "another source" 1.3.4.7:8655 1.3.4.8
data_source "BSDCluster" 10 center.the9.com:8649 node1.the9.com:8649
#vi /usr/local/etc/lam-bhost.def \\ 加入各node 的hostname
center.the9.com
node1.the9.com
node1.the9.com \\ 基本上,每个新增节点的配置都要和以上center.the9.com 的配置一致.
node2.the9.com
nodeX.the9.com ........
五,Monitor WEB GUI 的配置
center.the9.com
#vi /usr/local/etc/apache/http.conf \\ 加入以下相关参数,配置Cluster Monitor Web的路径
Alias /ganglia/ "/usr/local/www/ganglia/"
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
#vi /etc/rc.conf \\ 加入以下参数
apache_enable="YES"
apache_flags="-DSSL"
apache_pidfile="/var/run/httpd.pid"
#/usr/local/etc/rc.d/apache.sh start \\ 启动APACHE
六,启动并调试Cluster System以及检查测试
center.the9.com node1.the9.com nodeX.the9.com etc....
#/usr/local/etc/rc.d/gmetad.sh start #/usr/local/etc/rc.d/gmond.sh start \\ 启动Cluster 各Node的Monitor Core
center.the9.com
$lamboot -dv \\ 启动各节点的lam daemon
LAM 6.5.9/MPI 2 C++/ROMIO - Indiana University
lamboot: boot schema file: /usr/local/etc/lam-bhost.def
lamboot: opening hostfile /usr/local/etc/lam-bhost.def
lamboot: found the following hosts:
lamboot: n0 center.the9.com
lamboot: n1 node1.the9.com
lamboot: resolved hosts:
lamboot: n0 center.the9.com --> 172.18.5.247
lamboot: n1 node1.the9.com --> 172.18.5.80
lamboot: found 2 host node(s)
lamboot: origin node is 0 (center.the9.com)
Executing hboot on n0 (center.the9.com - 1 CPU)...
lamboot: attempting to execute "hboot -t -c lam-conf.lam -d -v -I " -H 172.18.5.247 -P 53433 -n 0 -o 0 ""
hboot: process schema = "/usr/local/etc/lam-conf.lam"
hboot: found /usr/local/bin/lamd
hboot: performing tkill
hboot: tkill
hboot: booting...
hboot: fork /usr/local/bin/lamd
[1] 28338 lamd -H 172.18.5.247 -P 53433 -n 0 -o 0 -d
hboot: attempting to execute
Executing hboot on n1 (node1.the9.com - 1 CPU)...
lamboot: attempting to execute "/usr/bin/ssh node1.the9.com -n echo $SHELL"
lamboot: got remote shell /bin/sh
lamboot: attempting to execute "/usr/bin/ssh node1.the9.com -n (. ./.profile; hboot -t -c lam-conf.lam -d -v -s -I "-H 172.18.5.247 -P 53433 -n 1 -o 0 " )"
hboot: process schema = "/usr/local/etc/lam-conf.lam"
hboot: found /usr/local/bin/lamd
hboot: performing tkill
hboot: tkill
hboot: booting...
hboot: fork /usr/local/bin/lamd
[1] 43110 lamd -H 172.18.5.247 -P 53433 -n 1 -o 0 -d
topology done
lamboot completed successfully
$lamhalt -dv \\ 停止各节点的lam daemon
LAM 6.5.9/MPI 2 C++/ROMIO - Indiana University
Shutting down LAM
lamhalt: sending HALT to n1 (node1.the9.com)
lamhalt: waiting for HALT ACKs from remote LAM daemons
lamhalt: received HALT ACK from n1 (node1.the9.com)
lamhalt: sending final HALT to n0 (center.the9.com)
lamhalt: local LAM daemon halted
LAM halted
$lamnodes \\ 查看node info $lamexec N echo "hello" \\ 查看node run status
center.the9.com
#ps ax
28338 ?? I 0:00.04 /usr/local/bin/lamd -H 172.18.5.247 -P 53433 -n 0 -o 0 -d
node1.the9.com
#ps ax
43110 ?? S 0:00.05 /usr/local/bin/lamd -H 172.18.5.247 -P 53433 -n 1 -o 0 -d
Cluster Monitor WEB GUI
http://center.the9.com/ganglia/ \\ 用这个查看系统数据,还是很直观的,是以RRDTool 生成的 images. :)
CPUs Total: 2
Hosts up: 2
Hosts down: 0
Avg Load (15, 5, 1m):
1%, 4%, 0%
Localtime:
2004-12-31 10:50
Total CPUs: 2
Total Memory: 0.2 GB
Total Disk: 8.0 GB
Most Full Disk: 61.2% Used
参考
http://lam-mpi.org/ lam-mpi http://www.beowulf.org/ beowulf FAQ http://www.lasg.ac.cn/cgi-bin/forum/topic.cgi?forum=4&topic=2247 MPI Cluster With RH9 http://lists.freebsd.org/mailman/listinfo/freebsd-cluster freebsd cluster maillist
tonnyom < tonnyom # hotmail.com >
版权声明:可以任意转载,转载时请务必以文字形式标明文章原始出处和作者信息及本声明.
前言
MPI(Message Passing Interface)消息传送接口
它不是一个协议,但它的地位已经实际上是一个协议了。它主要用于在分布式存储系统中的并行程序通信。MPI是一个函数库,它可以通过Fortran和C程序进行调用,MPI的好处是它速度比较快,而且移植性比较好。
Cluster
目前常见的Cluster(集群)架构有两种,一种是Web/Internet Cluster System,这种架构主要是将资料放置在不同的主机上面,亦即由多部主机同时负责一项服务;而另外一种则是所谓的平行运算了(Parallel Algorithms Cluster System)!平行运算其实就是将同一个运算的工作,交给整个Cluster里面的所有CPU来进行同步运算的一个功能。由于使用到多个CPU的运算能力,所以可以加快运算的速度。
此文档所安装架设的LAM/MPI Cluster System属于后者,由于实验环境条件以及自身能力的限制,可能文档有部分解释不详尽,如有疑问请来信与我联系,我将尽力完善此文档,谢谢!
软件及平台
Server \\ FreeBSD 5.3 Stable
IP:172.18.5.247
Hostname: center.the9.com
Client \\ FreeBSD 5.3 Release
IP:172.18.5.80
Hostname: node1.the9.com
apache_1.3.29 \\ All Ports Install
php4-4.3.10
php4-gd-4.3.10
php4-extensions-1.0
lam-6.5.9
ganglia-monitor-core-2.5.6
ganglia-webfrontend-2.5.5
目的
架设一套基于FreeBSD 5.3的LAM/MPI Cluster System.
安装及配置
一,各节点系统 /etc/hosts 的基本配置 \\ 如果内网有DNS,则配置好系统中的 /etc/resolv.conf 即可!
center.the9.com
#more /etc/hosts
172.18.5.247 center.the9.com
172.18.5.80 node1.the9.com
node1.the9.com
#more /etc/hosts
172.18.5.247 center.the9.com
172.18.5.80 node1.the9.com
二,Apache+PHP Server 的架设
center.the9.com
#cd /usr/ports/www/apache13-modssl
#make install clean \\ 安装 APACHE
#cd /usr/ports/lang/php4-extensions
#make install clean \\ 安装 PHP. 切记这里一定要选择安装GD库
#vi /usr/local/etc/apache/http.conf \\ 加入以下相关参数
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
三,NFS Server-Client 的架设
NFS Server(center.the9.com)
#vi /etc/rc.conf \\ 加入以下相关参数
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4 -h 172.18.5.247"
mountd_enable="YES"
mountd_flags="-r -l"
rpcbind_enable="YES"
rpcbind_flags="-l -h 172.18.5.247"
#vi /etc/exports \\ 配置NFS共享目录
/cluster -maproot=0:0 -network 172.18.5.0 -mask 255.255.255.0
#/etc/rc.d/rpcbind start #/etc/rc.d/mountd start #/etc/rc.d/nfsd start \\ 启动NFS Server
NFS Client(node1.the9.com)
#vi /etc/rc.conf \\ 加入以下相关参数
nfs_client_enable="YES"
#vi /etc/fstab \\ 加入以下相关参数 172.18.5.247:/cluster /cluster nfs rw 0 0
#mount /cluster \\ Mount /Cluster 目录
四,LAM/MPI Cluster System的架设
Step 1: 基本安装
center.the9.com
#cd /usr/ports/net/lam
#make install clean \\ 安装 LAM
#cd /usr/ports/sysutils/ganglia-monitor-core
#make install clean \\ 安装Cluster System 所需的Monitor Core
#cd /usr/ports/sysutils/ganglia-webfrontend
#make install clean \\ 安装上面Monitor Core 所需的WEB GUI
node1.the9.com
#cd /usr/ports/net/lam
#make install clean \\ 安装 LAM
#cd /usr/ports/sysutils/ganglia-monitor-core
#make install clean \\ 安装Cluster System 所需的Monitor Core
Step 2: 配置
center.the9.com
#cd /usr/local/etc/
#cp gmond.conf.sample gmond.conf
#cp gmetad.conf.sample gmetad.conf
#vi gmond.conf \\ 修改name和mcast_if 的参数
# The name of the cluster this node is a part of
# default: "unspecified"
name "BSDCluster"
# The multicast interface for gmond to send/receive data on
# default: the kernel decides based on routing configuration
mcast_if lnc0
#vi gmetad.conf \\ 修改data_source 的参数
# data_source "my cluster" 10 localhost my.machine.edu:8649 1.2.3.5:8655
# data_source "my grid" 50 1.3.4.7:8655 grid.org:8651 grid-backup.org:8651
# data_source "another source" 1.3.4.7:8655 1.3.4.8
data_source "BSDCluster" 10 center.the9.com:8649 node1.the9.com:8649
#vi /usr/local/etc/lam-bhost.def \\ 加入各node 的hostname
center.the9.com
node1.the9.com
node1.the9.com \\ 基本上,每个新增节点的配置都要和以上center.the9.com 的配置一致.
node2.the9.com
nodeX.the9.com ........
五,Monitor WEB GUI 的配置
center.the9.com
#vi /usr/local/etc/apache/http.conf \\ 加入以下相关参数,配置Cluster Monitor Web的路径
Alias /ganglia/ "/usr/local/www/ganglia/"
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
#vi /etc/rc.conf \\ 加入以下参数
apache_enable="YES"
apache_flags="-DSSL"
apache_pidfile="/var/run/httpd.pid"
#/usr/local/etc/rc.d/apache.sh start \\ 启动APACHE
六,启动并调试Cluster System以及检查测试
center.the9.com node1.the9.com nodeX.the9.com etc....
#/usr/local/etc/rc.d/gmetad.sh start #/usr/local/etc/rc.d/gmond.sh start \\ 启动Cluster 各Node的Monitor Core
center.the9.com
$lamboot -dv \\ 启动各节点的lam daemon
LAM 6.5.9/MPI 2 C++/ROMIO - Indiana University
lamboot: boot schema file: /usr/local/etc/lam-bhost.def
lamboot: opening hostfile /usr/local/etc/lam-bhost.def
lamboot: found the following hosts:
lamboot: n0 center.the9.com
lamboot: n1 node1.the9.com
lamboot: resolved hosts:
lamboot: n0 center.the9.com --> 172.18.5.247
lamboot: n1 node1.the9.com --> 172.18.5.80
lamboot: found 2 host node(s)
lamboot: origin node is 0 (center.the9.com)
Executing hboot on n0 (center.the9.com - 1 CPU)...
lamboot: attempting to execute "hboot -t -c lam-conf.lam -d -v -I " -H 172.18.5.247 -P 53433 -n 0 -o 0 ""
hboot: process schema = "/usr/local/etc/lam-conf.lam"
hboot: found /usr/local/bin/lamd
hboot: performing tkill
hboot: tkill
hboot: booting...
hboot: fork /usr/local/bin/lamd
[1] 28338 lamd -H 172.18.5.247 -P 53433 -n 0 -o 0 -d
hboot: attempting to execute
Executing hboot on n1 (node1.the9.com - 1 CPU)...
lamboot: attempting to execute "/usr/bin/ssh node1.the9.com -n echo $SHELL"
lamboot: got remote shell /bin/sh
lamboot: attempting to execute "/usr/bin/ssh node1.the9.com -n (. ./.profile; hboot -t -c lam-conf.lam -d -v -s -I "-H 172.18.5.247 -P 53433 -n 1 -o 0 " )"
hboot: process schema = "/usr/local/etc/lam-conf.lam"
hboot: found /usr/local/bin/lamd
hboot: performing tkill
hboot: tkill
hboot: booting...
hboot: fork /usr/local/bin/lamd
[1] 43110 lamd -H 172.18.5.247 -P 53433 -n 1 -o 0 -d
topology done
lamboot completed successfully
$lamhalt -dv \\ 停止各节点的lam daemon
LAM 6.5.9/MPI 2 C++/ROMIO - Indiana University
Shutting down LAM
lamhalt: sending HALT to n1 (node1.the9.com)
lamhalt: waiting for HALT ACKs from remote LAM daemons
lamhalt: received HALT ACK from n1 (node1.the9.com)
lamhalt: sending final HALT to n0 (center.the9.com)
lamhalt: local LAM daemon halted
LAM halted
$lamnodes \\ 查看node info $lamexec N echo "hello" \\ 查看node run status
center.the9.com
#ps ax
28338 ?? I 0:00.04 /usr/local/bin/lamd -H 172.18.5.247 -P 53433 -n 0 -o 0 -d
node1.the9.com
#ps ax
43110 ?? S 0:00.05 /usr/local/bin/lamd -H 172.18.5.247 -P 53433 -n 1 -o 0 -d
Cluster Monitor WEB GUI
http://center.the9.com/ganglia/ \\ 用这个查看系统数据,还是很直观的,是以RRDTool 生成的 images. :)
CPUs Total: 2
Hosts up: 2
Hosts down: 0
Avg Load (15, 5, 1m):
1%, 4%, 0%
Localtime:
2004-12-31 10:50
Total CPUs: 2
Total Memory: 0.2 GB
Total Disk: 8.0 GB
Most Full Disk: 61.2% Used
参考
http://lam-mpi.org/ lam-mpi http://www.beowulf.org/ beowulf FAQ http://www.lasg.ac.cn/cgi-bin/forum/topic.cgi?forum=4&topic=2247 MPI Cluster With RH9 http://lists.freebsd.org/mailman/listinfo/freebsd-cluster freebsd cluster maillist
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章>
跟ArthurXF探讨大型网站架构——学习篇3
2007/08/06 00:18 ArthurXF
这里我先转贴别人做的一个系统架构,这个架构还是很具有借鉴意义的。
服务器的大用户量的承载方案 -------作者:叶金荣 主页:http://www.imysql.cn
一、前言
[Copy to clipboard] [ - ]CODE:
二、编译安装
三、 安装MySQL、memcache
四、 安装Apache、PHP、eAccelerator、php-memcache
五、 安装Squid
六、后记
一、前言
一、前言,准备工作
当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。
我们采用的架构图如下:
-------- ---------- ------------- --------- ------------
| 客户端 | ===> |负载均衡器| ===> |反向代理/缓存| ===> |WEB服务器| ===> |数据库服务器|
-------- ---------- ------------- --------- ------------
Nginx Squid Apache,PHP MySQL
eAccelerator/memcache
准备工作:
服务器: Intel(R) Xeon(TM) CPU 3.00GHz * 2, 2GB mem, SCISC 硬盘
操作系统:CentOs4.4,内核版本2.6.9-22.ELsmp,gcc版本3.4.4
软件:
Apache 2.2.3(能使用MPM模式)
PHP 5.2.0(选用该版本是因为5.2.0的引擎相对更高效)
eAccelerator 0.9.5(加速PHP引擎,同时也可以加密PHP源程序)
memcache 1.2.0(用于高速缓存常用数据)
libevent 1.2a(memcache工作机制所需)
MySQL 5.0.27(选用二进制版本,省去编译工作)
Nginx 0.5.4(用做负载均衡器)
squid-2.6.STABLE6(做反向代理的同时提供专业缓存功能)
二、编译安装
二、编译安装
一、) 安装Nginx
1.) 安装
Nginx发音为[engine x],是由俄罗斯人Igor Sysoev建立的项目,基于BSD许可。据说他当初是F5的成员之一,英文主页:http://nginx.net。俄罗斯的一些大网站已经使用它超过两年多了,一直表现不凡。
Nginx的编译参数如下:
备注:在这里,取消了一些不必要的模块,如果你需要用到这些模块,那么请去掉部分参数。
2.) 安装PHP 5.2.0
[Copy to clipboard] [ - ]CODE:
[root@localhost]#./configure --prefix=/usr/local/server/php --with-mysql \
--with-apxs2=/usr/local/server/apache/bin/apxs --with-freetype-dir=/usr/ --with-png-dir=/usr/ \
--with-gd=/usr/ --with-jpeg-dir=/usr/ --with-zlib --enable-magic-quotes --with-iconv \
--without-sqlite --without-pdo-sqlite --with-pdo-mysql --disable-dom --disable-simplexml \
--enable-roxen-zts
[root@localhost]#make && make install
备注:如果不需要gd或者pdo等模块,请自行去掉。
3.) 安装eAccelerator-0.9.5
[Copy to clipboard] [ - ]CODE:
[root@localhost]#cd eAccelerator-0.9.5
[root@localhost]#export PHP_PREFIX=/usr/local/server/php
[root@localhost]#$PHP_PREFIX/bin/phpize
[root@localhost]#./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
[root@localhost]#make && make install
4.) 安装memcache模块
[Copy to clipboard] [ - ]CODE:
[root@localhost]#cd memcache-2.1.0
[root@localhost]#export PHP_PREFIX=/usr/local/server/php
[root@localhost]#$PHP_PREFIX/bin/phpize
[root@localhost]#./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
[root@localhost]#make && make install
5.) 修改 php.ini 配置然后修改 php.ini,修改/加入类似以下内容:
[Copy to clipboard] [ - ]CODE:
extension_dir = "/usr/local/server/php/lib/"
extension="eaccelerator.so"
eaccelerator.shm_size="32" ;设定eaccelerator的共享内存为32MB
eaccelerator.cache_dir="/usr/local/server/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter="*.php"
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.log_file = "/usr/local/server/apache/logs/eaccelerator_log"
eaccelerator.allowed_admin_path = "/usr/local/server/apache/htdocs/ea_admin"
extension="memcache.so"
在这里,最好是在apache的配置中增加默认文件类型的cache机制,即利用apache的expires模块,新增类似如下几行:
[Copy to clipboard] [ - ]CODE:
ExpiresActive On
ExpiresByType text/html "access plus 10 minutes"
ExpiresByType text/css "access plus 1 day"
ExpiresByType image/jpg "access 1 month"
ExpiresByType image/gif "access 1 month"
ExpiresByType image/jpg "access 1 month"
ExpiresByType application/x-shockwave-flash "access plus 3 day"
这么设置是由于我的这些静态文件通常很少更新,因此我选择的是"access"规则,如果更新相对比较频繁,可以改用"modification"规则;或者也可以用"access"规则,但是在文件更新的时候,执行一下"touch"命令,把文件的时间刷新一下即可。
五、 安装Squid
五、) 安装Squid
[root@localhost]#./configure --prefix=/usr/local/server/squid --enable-async-io=100 --disable-delay-pools --disable-mem-gen-trace --disable-useragent-log --enable-kill-parent-hack --disable-arp-acl --enable-epoll --disable-ident-lookups --enable-snmp --enable-large-cache-files --with-large-files
[root@localhost]#make && make install
或使用如下安装方法:
[root@localhost]#yum install squid
如果是2.6的内核,才能支持epoll的IO模式,旧版本的内核则只能选择poll或其他模式了;另外,记得带上支持大文件的选项,否则在access
log等文件达到2G的时候就会报错。设定 squid 的配置大概如下内容:
#设定缓存目录为 /var/cache1 和 /var/lib/squid,每次处理缓存大小为128MB,当缓存空间使用达到95%时
#新的内容将取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动
#/var/cache1 最大1024MB,/var/lib/squid 最大 5000MB,都是 16*256 级子目录
[Copy to clipboard] [ - ]CODE:
cache_dir aufs /var/cache1 1024 16 256
cache_dir aufs /var/lib/squid 5000 16 256
cache_mem 128 MB
cache_swap_low 90
cache_swap_high 95
#设置存储策略等
maximum_object_size 4096 KB
minimum_object_size 0 KB
maximum_object_size_in_memory 80 KB
ipcache_size 1024
ipcache_low 90
ipcache_high 95
cache_replacement_policy lru
memory_replacement_policy lru
#设置超时策略
forward_timeout 20 seconds
connect_timeout 15 seconds
read_timeout 3 minutes
request_timeout 1 minutes
persistent_request_timeout 15 seconds
client_lifetime 15 minutes
shutdown_lifetime 5 seconds
negative_ttl 10 seconds
#限制一个ip最大只能有16个连接
acl OverConnLimit maxconn 16
http_access deny OverConnLimit
#限制baidu spider访问
#acl AntiBaidu req_header User-Agent Baiduspider
#http_access deny AntiBaidu
#常规设置
visible_hostname cache.yejr.com
cache_mgr webmaster@yejr.com
client_persistent_connections off
server_persistent_connections on
cache_effective_user nobody
cache_effective_group nobody
tcp_recv_bufsize 65535 bytes
half_closed_clients off
#设定不缓存的规则
hierarchy_stoplist cgi-bin
acl QUERY urlpath_regex cgi-bin
cache deny QUERY
#不要相信ETag 因为有gzip
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
#设置access log,并且令其格式和apache的格式一样,方便awstats分析
emulate_httpd_log on
logformat apache %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %
初始化和启动squid
[Copy to clipboard] [ - ]CODE:
[root@localhost]#/usr/local/server/squid/sbin/squid -z
[root@localhost]#/usr/local/server/squid/sbin/squid
第一条命令是先初始化squid缓存哈希子目录,只需执行一次即可。
六、后记
六、后记一、)想要启用squid所需的改变想要更好的利用squid的cache功能,不是把它启用了就可以的,我们需要做以下几个调整:
1、启用apache的 mod_expires 模块,修改 httpd.conf,加入以下内容:
[Copy to clipboard] [ - ]CODE:
#expiresdefault "modification plus 2 weeks"expiresactive
onexpiresbytype text/html "access plus 10 minutes"expiresbytype
image/gif "modification plus 1 month"expiresbytype image/jpeg "modification
plus 1 month"expiresbytype image/png "modification plus 1
month"expiresbytype text/css "access plus 1 day"expiresbytype
application/x-shockwave-flash "access plus 3 day"
以上配置的作用是规定各种类型文件的cache规则,对那些图片/flash等静态文件总是cache起来,可根据各自的需要做适当调整。
2、修改 php.ini 配置,如下:
session.cache_limiter = nocache
以上配置的作用是默认取消php中的cache功能,避免不正常的cache产生。
3、修改应用程序例如,有一个php程序页面static.php,它存放着某些查询数据库后的结果,并且数据更新并不频繁,于是,我们就可以考虑对其cache。只需在static.php中加入类似如下代码:
header('Cache-Control: max-age=86400
,must-revalidate');header('Pragma:');header('Last-Modified: ' .
gmdate('D, d M Y H:i:s') . ' GMT' );header("Expires: " .gmdate ('D, d M Y
H:i:s', time() + '86400' ). ' GMT');
以上代码的意思是,输出一个http头部信息,让squid知道本页面默认缓存时长为一天。
二、)squidclient简要介绍
*
[Copy to clipboard] [ - ]CODE:
取得squid运行状态信息: squidclient -p 80 mgr:info
*取得squid内存使用情况: squidclient -p 80 mgr:mem
*取得squid已经缓存的列表: squidclient -p 80 mgr:objects. use it carefully,it may crash
*取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
*强制更新某个url:squidclient -p 80 -m PURGE http://www.yejr.com/static...
*更多的请查看:squidclient-h 或者 squidclient -p 80 mgr:
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
引用
服务器的大用户量的承载方案 -------作者:叶金荣 主页:http://www.imysql.cn
一、前言
[Copy to clipboard] [ - ]CODE:
二、编译安装
三、 安装MySQL、memcache
四、 安装Apache、PHP、eAccelerator、php-memcache
五、 安装Squid
六、后记
一、前言
一、前言,准备工作
当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。
我们采用的架构图如下:
-------- ---------- ------------- --------- ------------
| 客户端 | ===> |负载均衡器| ===> |反向代理/缓存| ===> |WEB服务器| ===> |数据库服务器|
-------- ---------- ------------- --------- ------------
Nginx Squid Apache,PHP MySQL
eAccelerator/memcache
准备工作:
服务器: Intel(R) Xeon(TM) CPU 3.00GHz * 2, 2GB mem, SCISC 硬盘
操作系统:CentOs4.4,内核版本2.6.9-22.ELsmp,gcc版本3.4.4
软件:
Apache 2.2.3(能使用MPM模式)
PHP 5.2.0(选用该版本是因为5.2.0的引擎相对更高效)
eAccelerator 0.9.5(加速PHP引擎,同时也可以加密PHP源程序)
memcache 1.2.0(用于高速缓存常用数据)
libevent 1.2a(memcache工作机制所需)
MySQL 5.0.27(选用二进制版本,省去编译工作)
Nginx 0.5.4(用做负载均衡器)
squid-2.6.STABLE6(做反向代理的同时提供专业缓存功能)
二、编译安装
二、编译安装
一、) 安装Nginx
1.) 安装
Nginx发音为[engine x],是由俄罗斯人Igor Sysoev建立的项目,基于BSD许可。据说他当初是F5的成员之一,英文主页:http://nginx.net。俄罗斯的一些大网站已经使用它超过两年多了,一直表现不凡。
Nginx的编译参数如下:
[root@localhost]#./configure --prefix=/usr/local/server/nginx --with-openssl=/usr/include \
--with-pcre=/usr/include/pcre/ --with-http_stub_status_module --without-http_memcached_module \
--without-http_fastcgi_module --without-http_rewrite_module --without-http_map_module \
--without-http_geo_module --without-http_autoindex_module
在这里,需要说明一下,由于Nginx的配置文件中我想用到正则,所以需要 pcre 模块的支持。我已经安装了 pcre 及 pcre-devel 的rpm包,但是 Ngxin 并不能正确找到 .h/.so/.a/.la 文件,因此我稍微变通了一下:
[Copy to clipboard] [ - ]CODE:
[root@localhost]#mkdir /usr/include/pcre/.libs/
[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a
[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la
然后,修改 objs/Makefile 大概在908行的位置上,注释掉以下内容:
./configure --disable-shared
接下来,就可以正常执行 make 及 make install 了。
2.) 修改配置文件 /usr/local/server/nginx/conf/nginx.conf
以下是我的 nginx.conf 内容,仅供参考:
[Copy to clipboard] [ - ]CODE:
#运行用户
user nobody nobody;
#启动进程
worker_processes 2;
#全局错误日志及PID文件
error_log logs/error.log notice;
pid logs/nginx.pid;
#工作模式及连接数上限
events {
use epoll;
worker_connections 1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型
include conf/mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
#设定请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
#开启gzip模块
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
#设定access log
access_log logs/access.log main;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
#设定负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
#设定虚拟主机
server {
listen 80;
server_name 192.168.8.1 [url]www.yejr.com[/url];
charset gb2312;
#设定本虚拟主机的访问日志
access_log logs/www.yejr.com.access.log main;
#如果访问 /img/*, /js/*, /css/* 资源,则直接取本地文件,不通过squid
#如果这些文件较多,不推荐这种方式,因为通过squid的缓存效果更好
location ~ ^/(img|js|css)/ {
root /data3/Html;
expires 24h;
}
#对 "/" 启用负载均衡
location / {
proxy_pass http://mysvr;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
}
}
备注:conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可,内容大致如下:
3.) 查看 Nginx 运行状态
输入地址 http://192.168.8.1/NginxStatus/,输入验证帐号密码,即可看到类似如下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324
第一行表示目前活跃的连接数
第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,如果快达到了上限,就需要加大上限值了。
第四行是Nginx的队列状态
三、 安装MySQL、memcache
1.) 安装MySQL,步骤如下:
[Copy to clipboard] [ - ]CODE:
[root@localhost]#tar zxf mysql-standard-5.0.27-linux-i686.tar.gz -C /usr/local/server
[root@localhost]#mv /usr/local/server/mysql-standard-5.0.27-linux-i686 /usr/local/server/mysql
[root@localhost]#cd /usr/local/server/mysql
[root@localhost]#./scripts/mysql_install_db --basedir=/usr/local/server/mysql \
--datadir=/usr/local/server/mysql/data --user=nobody
[root@localhost]#cp /usr/local/server/mysql/support-files/my-large.cnf \
/usr/local/server/mysql/data/my.cnf
2.) 修改 MySQL 配置,增加部分优化参数,如下:
[root@localhost]#vi /usr/local/server/mysql/data/my.cnf
[Copy to clipboard] [ - ]CODE:
主要内容如下:
[mysqld]
basedir = /usr/local/server/mysql
datadir = /usr/local/server/mysql/data
user = nobody
port = 3306
socket = /tmp/mysql.sock
wait_timeout = 30
long_query_time=1
#log-queries-not-using-indexes = TRUE
log-slow-queries=/usr/local/server/mysql/slow.log
log-error = /usr/local/server/mysql/error.log
external-locking = FALSE
key_buffer_size = 512M
back_log = 400
table_cache = 512
sort_buffer_size = 2M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 32
query_cache_limit = 2M
query_cache_size = 64M
thread_concurrency = 4
thread_stack = 128K
tmp_table_size = 64M
binlog_cache_size = 2M
max_binlog_size = 128M
max_binlog_cache_size = 512M
max_relay_log_size = 128M
bulk_insert_buffer_size = 8M
myisam_repair_threads = 1
skip-bdb
#如果不需要使用innodb就关闭该选项
#skip-innodb
innodb_data_home_dir = /usr/local/server/mysql/data/
innodb_data_file_path = ibdata1:256M;ibdata2:256M:autoextend
innodb_log_group_home_dir = /usr/local/server/mysql/data/
innodb_log_arch_dir = /usr/local/server/mysql/data/
innodb_buffer_pool_size = 512M
innodb_additional_mem_pool_size = 8M
innodb_log_file_size = 128M
innodb_log_buffer_size = 8M
innodb_lock_wait_timeout = 50
innodb_flush_log_at_trx_commit = 2
innodb_file_io_threads = 4
innodb_thread_concurrency = 16
innodb_log_files_in_group = 3
以上配置参数请根据具体的需要稍作修改。运行以下命令即可启动 MySQL 服务器:
/usr/local/server/mysql/bin/mysqld_safe \
--defaults-file=/usr/local/server/mysql/data/my.cnf &
由于 MySQL 不是安装在标准目录下,因此必须要修改 mysqld_safe 中的 my_print_defaults 文件所在位置,才能通过
mysqld_safe 来启动 MySQL 服务器。
3.) memcache + libevent 安装编译安装:
[Copy to clipboard] [ - ]CODE:
[root@localhost]#cd libevent-1.2a
[root@localhost]#./configure --prefix=/usr/ && make && make install
[root@localhost]#cd ../memcached-1.2.0
[root@localhost]#./configure --prefix=/usr/local/server/memcached --with-libevent=/usr/
[root@localhost]#make && make install
备注:如果 libevent 不是安装在 /usr 目录下,那么需要把 libevent-1.2a.so.1 拷贝/链接到 /usr/lib 中,否则
memcached 无法正常加载。运行以下命令来启动 memcached:
[root@localhost]#/usr/local/server/memcached/bin/memcached \
-l 192.168.8.1 -d -p 10000 -u nobody -m 128
表示用 daemon 的方式启动 memcached,监听在 192.168.8.1 的 10000 端口上,运行用户为 nobody,为其分配
128MB 的内存。
四、 安装Apache、PHP、eAccelerator、php-memcache
四、) 安装Apache、PHP、eAccelerator、php-memcache由于Apache
2下的php静态方式编译十分麻烦,因此在这里采用动态模块(DSO)方式。1.) 安装Apache 2.2.3
[root@localhost]#./configure --prefix=/usr/local/server/apache --disable-userdir --disable-actions \
--disable-negotiation --disable-autoindex --disable-filter --disable-include --disable-status \
--disable-asis --disable-auth --disable-authn-default --disable-authn-file --disable-authz-groupfile \
--disable-authz-host --disable-authz-default --disable-authz-user --disable-userdir \
--enable-expires --enable-module=so
--with-pcre=/usr/include/pcre/ --with-http_stub_status_module --without-http_memcached_module \
--without-http_fastcgi_module --without-http_rewrite_module --without-http_map_module \
--without-http_geo_module --without-http_autoindex_module
在这里,需要说明一下,由于Nginx的配置文件中我想用到正则,所以需要 pcre 模块的支持。我已经安装了 pcre 及 pcre-devel 的rpm包,但是 Ngxin 并不能正确找到 .h/.so/.a/.la 文件,因此我稍微变通了一下:
[Copy to clipboard] [ - ]CODE:
[root@localhost]#mkdir /usr/include/pcre/.libs/
[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a
[root@localhost]#cp /usr/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la
然后,修改 objs/Makefile 大概在908行的位置上,注释掉以下内容:
./configure --disable-shared
接下来,就可以正常执行 make 及 make install 了。
2.) 修改配置文件 /usr/local/server/nginx/conf/nginx.conf
以下是我的 nginx.conf 内容,仅供参考:
[Copy to clipboard] [ - ]CODE:
#运行用户
user nobody nobody;
#启动进程
worker_processes 2;
#全局错误日志及PID文件
error_log logs/error.log notice;
pid logs/nginx.pid;
#工作模式及连接数上限
events {
use epoll;
worker_connections 1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型
include conf/mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
#设定请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
#开启gzip模块
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
#设定access log
access_log logs/access.log main;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
#设定负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
#设定虚拟主机
server {
listen 80;
server_name 192.168.8.1 [url]www.yejr.com[/url];
charset gb2312;
#设定本虚拟主机的访问日志
access_log logs/www.yejr.com.access.log main;
#如果访问 /img/*, /js/*, /css/* 资源,则直接取本地文件,不通过squid
#如果这些文件较多,不推荐这种方式,因为通过squid的缓存效果更好
location ~ ^/(img|js|css)/ {
root /data3/Html;
expires 24h;
}
#对 "/" 启用负载均衡
location / {
proxy_pass http://mysvr;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
}
}
备注:conf/htpasswd 文件的内容用 apache 提供的 htpasswd 工具来产生即可,内容大致如下:
3.) 查看 Nginx 运行状态
输入地址 http://192.168.8.1/NginxStatus/,输入验证帐号密码,即可看到类似如下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324
第一行表示目前活跃的连接数
第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,如果快达到了上限,就需要加大上限值了。
第四行是Nginx的队列状态
三、 安装MySQL、memcache
1.) 安装MySQL,步骤如下:
[Copy to clipboard] [ - ]CODE:
[root@localhost]#tar zxf mysql-standard-5.0.27-linux-i686.tar.gz -C /usr/local/server
[root@localhost]#mv /usr/local/server/mysql-standard-5.0.27-linux-i686 /usr/local/server/mysql
[root@localhost]#cd /usr/local/server/mysql
[root@localhost]#./scripts/mysql_install_db --basedir=/usr/local/server/mysql \
--datadir=/usr/local/server/mysql/data --user=nobody
[root@localhost]#cp /usr/local/server/mysql/support-files/my-large.cnf \
/usr/local/server/mysql/data/my.cnf
2.) 修改 MySQL 配置,增加部分优化参数,如下:
[root@localhost]#vi /usr/local/server/mysql/data/my.cnf
[Copy to clipboard] [ - ]CODE:
主要内容如下:
[mysqld]
basedir = /usr/local/server/mysql
datadir = /usr/local/server/mysql/data
user = nobody
port = 3306
socket = /tmp/mysql.sock
wait_timeout = 30
long_query_time=1
#log-queries-not-using-indexes = TRUE
log-slow-queries=/usr/local/server/mysql/slow.log
log-error = /usr/local/server/mysql/error.log
external-locking = FALSE
key_buffer_size = 512M
back_log = 400
table_cache = 512
sort_buffer_size = 2M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 32
query_cache_limit = 2M
query_cache_size = 64M
thread_concurrency = 4
thread_stack = 128K
tmp_table_size = 64M
binlog_cache_size = 2M
max_binlog_size = 128M
max_binlog_cache_size = 512M
max_relay_log_size = 128M
bulk_insert_buffer_size = 8M
myisam_repair_threads = 1
skip-bdb
#如果不需要使用innodb就关闭该选项
#skip-innodb
innodb_data_home_dir = /usr/local/server/mysql/data/
innodb_data_file_path = ibdata1:256M;ibdata2:256M:autoextend
innodb_log_group_home_dir = /usr/local/server/mysql/data/
innodb_log_arch_dir = /usr/local/server/mysql/data/
innodb_buffer_pool_size = 512M
innodb_additional_mem_pool_size = 8M
innodb_log_file_size = 128M
innodb_log_buffer_size = 8M
innodb_lock_wait_timeout = 50
innodb_flush_log_at_trx_commit = 2
innodb_file_io_threads = 4
innodb_thread_concurrency = 16
innodb_log_files_in_group = 3
以上配置参数请根据具体的需要稍作修改。运行以下命令即可启动 MySQL 服务器:
/usr/local/server/mysql/bin/mysqld_safe \
--defaults-file=/usr/local/server/mysql/data/my.cnf &
由于 MySQL 不是安装在标准目录下,因此必须要修改 mysqld_safe 中的 my_print_defaults 文件所在位置,才能通过
mysqld_safe 来启动 MySQL 服务器。
3.) memcache + libevent 安装编译安装:
[Copy to clipboard] [ - ]CODE:
[root@localhost]#cd libevent-1.2a
[root@localhost]#./configure --prefix=/usr/ && make && make install
[root@localhost]#cd ../memcached-1.2.0
[root@localhost]#./configure --prefix=/usr/local/server/memcached --with-libevent=/usr/
[root@localhost]#make && make install
备注:如果 libevent 不是安装在 /usr 目录下,那么需要把 libevent-1.2a.so.1 拷贝/链接到 /usr/lib 中,否则
memcached 无法正常加载。运行以下命令来启动 memcached:
[root@localhost]#/usr/local/server/memcached/bin/memcached \
-l 192.168.8.1 -d -p 10000 -u nobody -m 128
表示用 daemon 的方式启动 memcached,监听在 192.168.8.1 的 10000 端口上,运行用户为 nobody,为其分配
128MB 的内存。
四、 安装Apache、PHP、eAccelerator、php-memcache
四、) 安装Apache、PHP、eAccelerator、php-memcache由于Apache
2下的php静态方式编译十分麻烦,因此在这里采用动态模块(DSO)方式。1.) 安装Apache 2.2.3
[root@localhost]#./configure --prefix=/usr/local/server/apache --disable-userdir --disable-actions \
--disable-negotiation --disable-autoindex --disable-filter --disable-include --disable-status \
--disable-asis --disable-auth --disable-authn-default --disable-authn-file --disable-authz-groupfile \
--disable-authz-host --disable-authz-default --disable-authz-user --disable-userdir \
--enable-expires --enable-module=so
备注:在这里,取消了一些不必要的模块,如果你需要用到这些模块,那么请去掉部分参数。
2.) 安装PHP 5.2.0
[Copy to clipboard] [ - ]CODE:
[root@localhost]#./configure --prefix=/usr/local/server/php --with-mysql \
--with-apxs2=/usr/local/server/apache/bin/apxs --with-freetype-dir=/usr/ --with-png-dir=/usr/ \
--with-gd=/usr/ --with-jpeg-dir=/usr/ --with-zlib --enable-magic-quotes --with-iconv \
--without-sqlite --without-pdo-sqlite --with-pdo-mysql --disable-dom --disable-simplexml \
--enable-roxen-zts
[root@localhost]#make && make install
备注:如果不需要gd或者pdo等模块,请自行去掉。
3.) 安装eAccelerator-0.9.5
[Copy to clipboard] [ - ]CODE:
[root@localhost]#cd eAccelerator-0.9.5
[root@localhost]#export PHP_PREFIX=/usr/local/server/php
[root@localhost]#$PHP_PREFIX/bin/phpize
[root@localhost]#./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
[root@localhost]#make && make install
4.) 安装memcache模块
[Copy to clipboard] [ - ]CODE:
[root@localhost]#cd memcache-2.1.0
[root@localhost]#export PHP_PREFIX=/usr/local/server/php
[root@localhost]#$PHP_PREFIX/bin/phpize
[root@localhost]#./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
[root@localhost]#make && make install
5.) 修改 php.ini 配置然后修改 php.ini,修改/加入类似以下内容:
[Copy to clipboard] [ - ]CODE:
extension_dir = "/usr/local/server/php/lib/"
extension="eaccelerator.so"
eaccelerator.shm_size="32" ;设定eaccelerator的共享内存为32MB
eaccelerator.cache_dir="/usr/local/server/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter="*.php"
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.log_file = "/usr/local/server/apache/logs/eaccelerator_log"
eaccelerator.allowed_admin_path = "/usr/local/server/apache/htdocs/ea_admin"
extension="memcache.so"
在这里,最好是在apache的配置中增加默认文件类型的cache机制,即利用apache的expires模块,新增类似如下几行:
[Copy to clipboard] [ - ]CODE:
ExpiresActive On
ExpiresByType text/html "access plus 10 minutes"
ExpiresByType text/css "access plus 1 day"
ExpiresByType image/jpg "access 1 month"
ExpiresByType image/gif "access 1 month"
ExpiresByType image/jpg "access 1 month"
ExpiresByType application/x-shockwave-flash "access plus 3 day"
这么设置是由于我的这些静态文件通常很少更新,因此我选择的是"access"规则,如果更新相对比较频繁,可以改用"modification"规则;或者也可以用"access"规则,但是在文件更新的时候,执行一下"touch"命令,把文件的时间刷新一下即可。
五、 安装Squid
五、) 安装Squid
[root@localhost]#./configure --prefix=/usr/local/server/squid --enable-async-io=100 --disable-delay-pools --disable-mem-gen-trace --disable-useragent-log --enable-kill-parent-hack --disable-arp-acl --enable-epoll --disable-ident-lookups --enable-snmp --enable-large-cache-files --with-large-files
[root@localhost]#make && make install
或使用如下安装方法:
[root@localhost]#yum install squid
如果是2.6的内核,才能支持epoll的IO模式,旧版本的内核则只能选择poll或其他模式了;另外,记得带上支持大文件的选项,否则在access
log等文件达到2G的时候就会报错。设定 squid 的配置大概如下内容:
#设定缓存目录为 /var/cache1 和 /var/lib/squid,每次处理缓存大小为128MB,当缓存空间使用达到95%时
#新的内容将取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动
#/var/cache1 最大1024MB,/var/lib/squid 最大 5000MB,都是 16*256 级子目录
[Copy to clipboard] [ - ]CODE:
cache_dir aufs /var/cache1 1024 16 256
cache_dir aufs /var/lib/squid 5000 16 256
cache_mem 128 MB
cache_swap_low 90
cache_swap_high 95
#设置存储策略等
maximum_object_size 4096 KB
minimum_object_size 0 KB
maximum_object_size_in_memory 80 KB
ipcache_size 1024
ipcache_low 90
ipcache_high 95
cache_replacement_policy lru
memory_replacement_policy lru
#设置超时策略
forward_timeout 20 seconds
connect_timeout 15 seconds
read_timeout 3 minutes
request_timeout 1 minutes
persistent_request_timeout 15 seconds
client_lifetime 15 minutes
shutdown_lifetime 5 seconds
negative_ttl 10 seconds
#限制一个ip最大只能有16个连接
acl OverConnLimit maxconn 16
http_access deny OverConnLimit
#限制baidu spider访问
#acl AntiBaidu req_header User-Agent Baiduspider
#http_access deny AntiBaidu
#常规设置
visible_hostname cache.yejr.com
cache_mgr webmaster@yejr.com
client_persistent_connections off
server_persistent_connections on
cache_effective_user nobody
cache_effective_group nobody
tcp_recv_bufsize 65535 bytes
half_closed_clients off
#设定不缓存的规则
hierarchy_stoplist cgi-bin
acl QUERY urlpath_regex cgi-bin
cache deny QUERY
#不要相信ETag 因为有gzip
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
#设置access log,并且令其格式和apache的格式一样,方便awstats分析
emulate_httpd_log on
logformat apache %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %
初始化和启动squid
[Copy to clipboard] [ - ]CODE:
[root@localhost]#/usr/local/server/squid/sbin/squid -z
[root@localhost]#/usr/local/server/squid/sbin/squid
第一条命令是先初始化squid缓存哈希子目录,只需执行一次即可。
六、后记
六、后记一、)想要启用squid所需的改变想要更好的利用squid的cache功能,不是把它启用了就可以的,我们需要做以下几个调整:
1、启用apache的 mod_expires 模块,修改 httpd.conf,加入以下内容:
[Copy to clipboard] [ - ]CODE:
#expiresdefault "modification plus 2 weeks"expiresactive
onexpiresbytype text/html "access plus 10 minutes"expiresbytype
image/gif "modification plus 1 month"expiresbytype image/jpeg "modification
plus 1 month"expiresbytype image/png "modification plus 1
month"expiresbytype text/css "access plus 1 day"expiresbytype
application/x-shockwave-flash "access plus 3 day"
以上配置的作用是规定各种类型文件的cache规则,对那些图片/flash等静态文件总是cache起来,可根据各自的需要做适当调整。
2、修改 php.ini 配置,如下:
session.cache_limiter = nocache
以上配置的作用是默认取消php中的cache功能,避免不正常的cache产生。
3、修改应用程序例如,有一个php程序页面static.php,它存放着某些查询数据库后的结果,并且数据更新并不频繁,于是,我们就可以考虑对其cache。只需在static.php中加入类似如下代码:
header('Cache-Control: max-age=86400
,must-revalidate');header('Pragma:');header('Last-Modified: ' .
gmdate('D, d M Y H:i:s') . ' GMT' );header("Expires: " .gmdate ('D, d M Y
H:i:s', time() + '86400' ). ' GMT');
以上代码的意思是,输出一个http头部信息,让squid知道本页面默认缓存时长为一天。
二、)squidclient简要介绍
*
[Copy to clipboard] [ - ]CODE:
取得squid运行状态信息: squidclient -p 80 mgr:info
*取得squid内存使用情况: squidclient -p 80 mgr:mem
*取得squid已经缓存的列表: squidclient -p 80 mgr:objects. use it carefully,it may crash
*取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
*强制更新某个url:squidclient -p 80 -m PURGE http://www.yejr.com/static...
*更多的请查看:squidclient-h 或者 squidclient -p 80 mgr:
现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章