在我负责的某个项目(调查类型的网站),不久前进行了一次推广调查。因为推广邮件是在同一时间发出,所以在5分钟之内,访问量剧增,发生了15000次左右的并发业务操作,整个系统的反映速度降低很明显。
该项目使用3台web服务器,2台mysql数据库。3台web服务器间的session共享通过NFS实现。经过后来调查,访问速度骤降是session并发导致的。
因此,开始考虑其他的session共享方案。考虑到未来能更容易的进行横向扩展,所以计划采用memcached和Tokyo tyrant。
memcached在国内的应用已经很广泛了。Tokyo tyrant是日本人 平林幹雄 开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍,想深入了解的人可以参考:http://blog.s135.com/post/362/。
在论证备选方案的可行性开始之前,先做个压力测试是必须的。
【测试环境】
4台pc安装JMeter模拟client,web服务器一台,一台cache服务器(用来安装NFS服务,Memcached,Tokyo tyrant)。
使用4台pc安装JMeter模拟client的原因是:使用JMETER进行并发测试的时候,单台PC只能发起4100个并发线程(这个不同机器会有不同),因此要做15000的并发测试,必须4*4100.
web服务器上apache设置:MaxClient 256
原来MaxClient 150 的情况下会成为性能瓶颈,改成256之后,apache没有成为瓶颈。针对某个功能做压力测试的时候,务必要做到其他环节不会成为系统贫瘠,不然测试就毫无准确度可言了。
安装NFS, memcached, Tokyo tyrant的cache服务器配置:
CPU: Intel(R) Pentium(R) 4 CPU 2.40GHz
Mem: 256M
HD: 40G
这台机器有点太寒碜了,呵呵,不过据说memcached对硬件配置要求很低,刚好可以验证下。
【测试程序】
因为是测试session的并发性,所以设计成个最简单的session操作流程:
1 page1.php创建session,往session写入1kb的数据,记录$time_start。
2 header至page2.php
3 page.php取得session,记录下$time_end,并计算出时间差$time_end-$time_start。
page1.php代码:
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
session_start();
$_SESSION['name']='abcdefghjiasdfsadflklklasdlklkjsfdkjkasdflkjsadfkljkljsdfaasdfsafdlklkjsadfkljsdafkljljksdflkflsadflkjlkjsdaflkjdsfaljklsdfajljfsd
sadflsadfljklkjsdfjlksdfaljkfjlkfslkjsadfjlksdflakkljsfdlkjsafdlkjsafdlkjlasdfkjlkjasdfljkasdlkjfsdlkjsdflkjlkasjdfljkasflkjasflkjdsaflkjlksdafklasdljksadkljfjklsdfjklfkjlsafkjlsjkldafljksljksaljklksjfdajklsdfakljsafdkljsafkdljkljsfadjklsafdasdfsfdaabcdefghjiasdfsadflklklasdlklkjsfdkjkasdflkjsadfkljkljsdfaasdfsafdlklkjsadfkljsdafkljljksdflkflsadflkjlkjsdaflkjdsfaljklsdfajljfsd
sadflsadfljklkjsdfjlksdfaljkfjlkfslkjsadfjlksdflakkljsfdlkjsafdlkjsafdlkjlasdfkjlkjasdfljkasdlkjfsdlkjsdflkjlkasjdfljkasflkjasflkjdsaflkjlksdafklasdljksadkljfjklsdfjklfkjlsafkjlsjkldafljksljksaljklksjfdajklsdfakljsafdkljsafkdljkljsfadjklsafdasdfsfdaabcdefghjiasdfsadflklklasdlklkjsfdkjkasdflkjsadfkljkljsdfaasdfsafdlklkjsadfkljsdafkljljksdflkflsadflkjlkjsdaflkjdsfaljklsdfajljfsd
abcdefghjiasdfsadflklklasdlklkjsfdkjkasdflkjsadfkljkljsdfaasdfsafdlklkjsadfkljsdafkljljksdflkflsadflkjlkjsdaflkjdsfaljklsdfajljfsd';
header( "location:./page2.php?sid=".session_id()."&time_start=".urlencode($time_start) );
page2.php代码:
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><?php
session_id($_GET['sid']);
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
session_start();
$name = $_SESSION['name'];
$time_start = urldecode($_GET['time_start']);
$time_end = microtime_float();
$time = ($time_end - $time_start)*1000;
$_file = './log/'. $_GET['sid'] . '.log';
$fp = fopen( $_file, 'a');
@fwrite($fp, $time);
@fclose($fp);
echo "$time Millisecond<br>";
echo $name;
?>
从代码可以看出,最后得到的time值并不是单纯的session操作的时间,session操作的时间会比这个值小。这样设计的原因是,这个值更能反映系统session并发操作的真实状况,但需确保测试环境的网络稳定,因为header函数的关系。
最后,再用perl写个简单的统计程序average.pl:
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#!/usr/bin/env perl
my $log_dir = "./log/";
my $total_times = 0;
my $file_nums = 0;
opendir DH, $log_dir or die "无法打开 $log_dir: $!";
foreach $file (readdir DH) {
open LOGFILE, "< $log_dir$file";
while (<LOGFILE>)
{
$total_times = $total_times + $_;
$file_nums = $file_nums + 1;
}
}
print $file_nums . " sessions\n";
print "average time is:" . $total_times/$file_nums . "\n";
closedir DH;
【测试过程说明】
1 使用badboy先生成Jmeter脚本,然后用Jmeter进行分布式并发测试。
2 php对于使用memcached来存储session的实现已经非常简单,只需要进行如下配置:
session.save_handler memcache
session.save_path tcp://192.168.8.2:11211
3 如何使用Tokyo tyrant来存储session呢?因为Tokyo tyrant完全兼容memcached的client,所以配置和memcache几乎完全一样,只要改下IP和端口号就可以了。
【测试结果】
使用NFS共享session:
2000 sessions
average time is:57.2385746240701
3000 sessions
average time is:188.679696798311
4000 sessions
average time is:1139.70507353546
5000 sessions
average time is:5486.23318772304
5000 sessions
average time is:5526.97186436598
5670 sessions(说明:发起了6000个访问,却只成功了5670)
average time is:8324.00726914608
5489 sessions(说明:发起了6000个访问,却只成功了5489)
average time is:9749.52457159197
从上面的结果看,NFS支持并发能力非常有限。根本没有办法支持到15000个session。在6000个session的时候,就会发生session 丢失等未知的状况。即使在5000个session以内,虽然可以完成测试,但性能低下。
当然,这和我使用的NFS服务端的机器配置很低有关,相信优化配置,或者“采用session存储的时候,进行目录分级”可以进行一定程度的优化,但NFS的并发操作确实存在问题。
因为有另一个理由:为了方便测试,我写了个perl程序用来删除session目录下的所有文件。
del_files.pl代码:
Code
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#!/usr/bin/env perl
my $log_dir = "./log/";
unlink glob "$log_dir/*.*";
my $session_dir = "./session_tmp/";
unlink glob "$session_dir/*";
my $session_dir2 = "./session_nfs/";
unlink glob "$session_dir2/*";
当这个程序用于删除NFS目录下的session文件时,程序运行的时间明显比用于删除非NFS目录慢非常的多。
使用Memcached共享session:
5000 sessions
average time is:8.691506099701
10000 sessions
average time is:9.07290377616917
15000 sessions
average time is:9.10538846651721
15000 sessions
average time is:9.42796174685197
15000 sessions
average time is:9.43535621960958
从以上结果可以看出,memcached性能很稳定,在5000,10000,15000个session几种情况下,每个流程处理的平均时间稳定在8毫秒到10毫秒之间。
使用Tokyo tyrant共享session:
5000 sessions
average time is:8.92114758491478
10000 sessions
average time is:8.35826919078823
15000 sessions
average time is:10.7764382680262
15000 sessions
average time is:11.4394629955285
15000 sessions
average time is:8.92091128031373
15000 sessions
average time is:10.3760389963784
tokyo tyrant速度也很快。但稳定性不如memcached,可能对机器的配置要求会高些吧,或者我对tokyo tyrant配置不了解也有可能。
从测试结果看,NFS用于存储session时候的并发性能明显不如memcached和tokyo tyrant。memcache和tokyo tyrant还可以进行更大规模的并发测试。但是限于我当前的硬件,没有再进行更大规模的测试。
ok了,Memcached和tokyo tyrant的表现都让人满意,符合预期。至于要选择哪个,就得考虑其他因素了:
1 是否需要持久存储,Memcached是不支持持久存储的,当然可以考虑使用 Memcached+DB的方式来达到“一定程度上的持久存储”,即Memcached实时保存session,在每隔一段时间(比如1分钟)将session保存到DB,至于能否接受这种方案,得看业务需求而定了。Memcached和tokyo tyrant的其他差别,可以参考下
http://blog.s135.com/post/362/等资料
2 对于这两项技术的掌握程度,整体上说,这两个技术应该都是靠得住,tokyo tyrant在日本也有不少成功的应用。但从国内来看,Memcached应用得较多,使用tokyo tyrant的话,还是要有一定的钻研精神才行。
分享到:
相关推荐
标题中的“tomcat8+memcached session共享”指的是在Tomcat 8服务器中利用Memcached进行session共享的技术实践。在分布式系统中,session共享是一个重要的问题,因为用户在访问不同的服务器节点时,需要保持登录状态...
【标题】:Tomcat+memcached+Nginx实现session共享 【内容详解】: Tomcat、Nginx和memcached的组合是常见的Web服务器架构,其中session共享是解决多服务器间用户状态同步的关键问题。本方案主要通过MSM(Memcached...
"nginx+tomcat+memcached"服务架构是一种常见的解决方案,它利用Nginx作为反向代理和负载均衡器,Tomcat作为Java应用服务器,而Memcached作为分布式缓存系统来实现session共享。以下是对这个架构和相关知识点的详细...
memcached实现集群的session共享问题,处理集群服务器情况下,memcached的session共享解决方案
标题中的“memcached+tomcat7共享session所需要的jar包”是指使用Memcached作为分布式缓存系统,实现Tomcat7服务器间的Session共享。这通常是为了在集群环境中解决Session复制或粘滞会话的问题,提高Web应用的可扩展...
5. 测试和监控:确保在部署后,Session可以在不同的Tomcat实例之间正确地共享和恢复,同时监控memcached的性能和可用性,以便及时发现并解决可能的问题。 总结来说,通过Nginx和memcached的结合,我们可以在多台...
memcached+tomcat7 session共享用到的jar包:javolution-5.5.1.jar,kryo-1.03.jar,kryo-serializers-0.10.jar,memcached-2.5.jar,memcached-session-manager-1.5.1.jar,memcached-session-manager-tc7-1.5.1.jar,...
实现"memcached+tomcat的session共享"的基本思路是:将Tomcat的session数据存储到memcached服务器上,而不是默认的本地内存或硬盘。这样,无论用户请求被路由到集群中的哪台Tomcat服务器,都可以从memcached中获取到...
在构建高性能、高可用性的Web应用系统时,通常会采用Nginx作为反向代理和负载均衡器,Tomcat作为应用服务器处理Java Servlet和JSP,而Memcached用于存储和共享Session数据。这个配置可以有效地分发用户请求,提高...
本知识点聚焦于如何在Windows环境下,利用Nginx作为反向代理,Memcached进行session共享,以及Tomcat作为Java应用服务器来搭建这样一个集群。这个配置确保了用户在集群中的任何一台服务器上的操作都能被其他服务器...
Nginx+Tomcat+Memcached实现tomcat集群和session共享 nginx配置
经过测试,1.9.6版本在这个场景下表现稳定,可以成功地在Tomcat 7和8上实现负载均衡和session共享。负载均衡是分布式系统的关键特性,它能将用户请求均匀分配到多个服务器,以提高服务的可用性和响应速度。 标签中...
Memcached是一种高性能的分布式内存对象缓存系统,可以用来实现多台Tomcat服务的Session共享。 Memcached是一个开源的、基于内存的对象缓存系统,使用 protocol-based 的方式来存储和检索数据。Memcached的优点是:...
将Session与Memcached结合,可以实现跨服务器的Session共享,提高系统的可扩展性和性能。 首先,我们需要了解Session的工作原理。在默认情况下,Session信息是存储在服务器端的一个Map中,每当客户端发送请求时,...
本文将深入探讨如何利用memcached实现session共享,以及在Java环境中所需的jar包。 首先,让我们理解一下会话(session)共享的重要性。在负载均衡的环境中,用户请求可能被分配到不同的服务器上,如果每个服务器都...
综上所述,"Nginx.tomcat.memcached负载均衡和session共享.rar"这个压缩包内容可能包含详细的配置示例、教程或者案例分析,旨在帮助开发者实现高效的Web应用架构,确保在多服务器环境下的用户体验和系统性能。...
今天学习tomcat,nginx,和memcached搭建集群,实现session共享的时候,发现网上的jar包都不全,要么就是不兼容,费了好大劲才找到能用的。
本主题将详细探讨如何在Windows7环境下,利用Nginx作为负载均衡器,Memcached作为session存储,以及Tomcat作为应用服务器,实现session共享。 **1. Nginx介绍与配置** Nginx是一款高性能的HTTP和反向代理服务器,它...
Memcached是一种高性能、分布式的内存对象缓存系统,常被用来解决session共享的问题。本篇将详细阐述如何利用Memcached配置session共享,并涉及所需依赖的jar包。 首先,Memcached作为一个缓存服务,能够存储会话...
Memcached-Session-Manager是解决这个问题的一个优秀解决方案,它允许我们将用户的Session数据存储在内存缓存系统——Memcached中,从而实现跨Tomcat实例的Session共享。下面将详细介绍Memcached-Session-Manager的...