<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[使用Memcached实现Session共享]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 28 Dec 2010 09:07:38 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	使用Memcached实现Session共享<br/>由于Cookie是保存的用户客户端的，安全性存在问题，为保证用户数据的安全性，我们必须使用Session机制来保存用户登录后的一些信息。 <br/>如果我们使用LVS对Apache实现负载均衡，就无法保证用户每次都能被分配到同一台Apache Server上，以取到自己的Session，虽然LVS可以加-p参数来保证客户端每次都被分配到同一台Apache Server上，但这种方式存在一些弊端，比如必须设置一个保持时间，如果时间太长了，LVS就需要缓存大量信息，时间太短了，又不能保证用户每次被分配到同一台Server上，而且这种方式也不易实现Session的冗余备份。 <br/>因此，我们需要Session共享，也就是说每台Apache都可以访问到所有的Session，这样用户被分配到哪台Server就不重要了。 <br/>Session共享主要有多种实现方式： <br/> Session复制。Apache可以实现把Session同步到其他Server上去，但这种技术太复杂，而且影响性能，占用内存，所以不推荐使用。 <br/> Session集中存储。存储介质可以是NFS文件系统、数据库、Memcached，从性能上考虑，当然是Memcached最好，推荐使用。<br/>1.3 实现 <br/>1.3.1 安装Memcached <br/>Memcached是基于libevent实现的，所以要首先确保已经安装libevent。 <br/>安装libevent <br/>tar zxvf libevent-1.4.13-stable.tar.gz <br/>cd libevent-1.4.13-stable <br/>./configure --prefix=/usr <br/>make &amp;&amp; make install <br/>安装Memcached <br/>tar zxvf memcached-1.4.4.tar.gz <br/>cd memcached-1.4.4 <br/>./configure --prefix=/usr/local/memcached --with-libevent=/usr <br/>make &amp;&amp; make install <br/>启动Memcached <br/><br/>/usr/local/memcached/bin/memcached -d -m 10 -u root -l 192.168.0.9 -p 11211 -c 256 -P /tmp/memcached.pid <br/>1.3.2 安装PHP扩展pecl::memcache <br/>pecl install memcache <br/>或源码安装 <br/>tar zxvf memcache-2.2.5.tgz <br/>cd memcache-2.2.5 <br/>phpize <br/>./configure <br/>make &amp;&amp; make install <br/><br/>将 php.ini 中 extension=memcache.so 打开，重启一下 apache，查看 phpinfo 中的 &quot;Registered save handlers&quot; 会有&quot;files user memcache&quot; 这3个可用。 <br/><br/>另外，基于libmemached的php扩展在pecl发布了，叫pecl::memcached，性能上可能会更好。 <br/>1.3.3 配置Memcached保存Session <br/>修改配置文件，在 php.ini 中全局设置 <br/>session.save_handler = memcache <br/>session.save_path = &quot;tcp://192.168.0.9:11211&quot; <br/>或者某个目录下的 .htaccess ： <br/>php_value session.save_handler &quot;memcache&quot; <br/>php_value session.save_path &quot;tcp://192.168.0.9:11211&quot; <br/>再或者在某个一个应用中： <br/>ini_set(&quot;session.save_handler&quot;, &quot;memcache&quot;); <br/>ini_set(&quot;session.save_path&quot;, &quot;tcp://192.168.0.9:11211&quot;); <br/>使用多个 memcached server 时用逗号&quot;,&quot;隔开，并且和 Memcache::addServer() 文档中说明的一样，可以带额外的参数&quot;persistent&quot;、&quot;weight&quot;、&quot;timeout&quot;、&quot;retry_interval&quot; 等等，类似这样的：&quot;tcp://host1:port1?persistent=1&amp;weight=2,tcp://host2:port2&quot; 。 <br/>1.3.4 测试 <br/><br/><div class="code">&lt;?php <br/>session_start(); <br/>if (!isset($_SESSION&#91;&#039;TEST&#039;&#93;)) &#123; <br/>$_SESSION&#91;&#039;TEST&#039;&#93; = time(); <br/>&#125; <br/>$_SESSION&#91;&#039;TEST3&#039;&#93; = time(); <br/>print $_SESSION&#91;&#039;TEST&#039;&#93;; <br/>print &quot;&lt;br&gt;&lt;br&gt;&quot;; <br/>print $_SESSION&#91;&#039;TEST3&#039;&#93;; <br/>print &quot;&lt;br&gt;&lt;br&gt;&quot;; <br/>print session_id(); <br/>?&gt; </div><br/>可以直接用sessionid 去 memcached 里查询一下： <br/>telnet 192.168.0.9 11211 <br/>get 19216821213c65cedec65b0883238c278eeb573e077 <br/>得到 <br/>TEST&#124;i:1177556731;TEST3&#124;i:1177556881; <br/>这样的结果，说明session 正常工作 <br/><br/>用Memcached来存储 session 在读写速度上会比文件快很多，而且在多个服务器需要共用session时会比较方便，将这些服务器都配置成使用同一组Memcached服务器就可以，减少了额外的工作量。缺点是 session 数据都保存在 memory 中，持久化方面有所欠缺，但对 session 数据来说也不是很大的问题，如果要持久化数据，也可以使用新浪开发的MemcacheDB或日本人开发的Tokyo tyrant+Tokyo Cabinet。 <br/>另外，如何解决Memcached的单点故障问题，有以下几个方案： <br/> 使用上面提到的Memcache::addServer增加多台Memcached，但这样只能达到一台出故障之后，另外一台可以使用，但每台Memcached的数据是独立的，不共享，不复制，出故障的数据丢失了。 <br/> 使用Memcached的一个补丁应用repcached，可以实现multi master replication和asynchronous data repliacation，并且支持原来Memcached的所有命令。不过这个应用只支持Memcached1.2.x版本。 <br/> 使用Tokyo tyrant+Tokyo Cabinet（简称TT+TC）。TT兼容Memcached协议，可以直接替换使用，TT支持replication，可以实现故障转移，TC则为TT提供持久化。 <br/>TT+TC是日本最大的社交类网站http://mixi.jp开发的开源应用，并已成功应用在mixi.jp中，值得研究。 <br/>来源：http://denniswwh.itpub.net/post/15174/507360
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 使用Memcached实现Session共享]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>