﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java fans-随笔分类-J2EE-负载均衡</title><link>http://www.blogjava.net/jlin/category/54694.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 21 Oct 2015 19:43:49 GMT</lastBuildDate><pubDate>Wed, 21 Oct 2015 19:43:49 GMT</pubDate><ttl>60</ttl><item><title>一致性Hash算法在Redis分布式中的使用(转)</title><link>http://www.blogjava.net/jlin/archive/2015/10/20/427834.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 20 Oct 2015 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2015/10/20/427834.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/427834.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2015/10/20/427834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/427834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/427834.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><span style="line-height: 1.5;">由于redis是单点，但是项目中不可避免的会使用多台Redis缓存服务器，那么怎么把缓存的Key均匀的映射到多台Redis服务器上，且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢？这样就需要我们自己实现分布式。</span></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">　　Memcached对大家应该不陌生，通过把Key映射到Memcached Server上，实现快速读取。我们可以动态对其节点增加，并未影响之前已经映射到内存的Key与memcached Server之间的关系，这就是因为使用了一致性哈希。<br />因为Memcached的哈希策略是在其客户端实现的，因此不同的客户端实现也有区别，以Spymemcache、Xmemcache为例，都是使用了KETAMA作为其实现。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">　　因此，我们也可以使用一致性hash算法来解决Redis分布式这个问题。在介绍一致性hash算法之前，先介绍一下我之前想的一个方法，怎么把Key均匀的映射到多台Redis Server上。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">　　<strong>由于LZ水平有限且对Redis研究的不深，文中有写的不对的地方请指正。</strong></p><h2>方案一</h2><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">该方案是前几天想的一个方法，主要思路是通过对缓存Key中的字母和数字的ascii码值求sum，该sum值对Redis Server总数取余得到的数字即为该Key映射到的Redis Server，该方法有一个很大的缺陷就是当Redis Server增加或减少时，基本上所有的Key都映射不到对应的的Redis Server了。代码如下：</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">    <span style="color: #808080; line-height: 1.5 !important;">///</span> <span style="color: #808080; line-height: 1.5 !important;">&lt;summary&gt;</span>         <span style="color: #808080; line-height: 1.5 !important;">///</span><span style="color: #008000; line-height: 1.5 !important;"> 根据缓存的Key映射对应的Server         </span><span style="color: #808080; line-height: 1.5 !important;">///</span> <span style="color: #808080; line-height: 1.5 !important;">&lt;/summary&gt;</span>         <span style="color: #808080; line-height: 1.5 !important;">///</span> <span style="color: #808080; line-height: 1.5 !important;">&lt;param name="Key"&gt;&lt;/param&gt;</span>         <span style="color: #808080; line-height: 1.5 !important;">///</span> <span style="color: #808080; line-height: 1.5 !important;">&lt;returns&gt;&lt;/returns&gt;</span>         <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> RedisClient GetRedisClientByKey(<span style="color: #0000ff; line-height: 1.5 !important;">string</span><span style="line-height: 1.5 !important;"> Key)         {             List</span>&lt;RedisClientInfo&gt; RedisClientList = <span style="color: #0000ff; line-height: 1.5 !important;">new</span> List&lt;RedisClientInfo&gt;<span style="line-height: 1.5 !important;">();             RedisClientList.Add(</span><span style="color: #0000ff; line-height: 1.5 !important;">new</span> RedisClientInfo() { Num = <span style="color: #800080; line-height: 1.5 !important;">0</span>, IPPort = <span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">127.0.0.1:6379</span><span style="color: #800000; line-height: 1.5 !important;">"</span><span style="line-height: 1.5 !important;"> });             RedisClientList.Add(</span><span style="color: #0000ff; line-height: 1.5 !important;">new</span> RedisClientInfo() { Num = <span style="color: #800080; line-height: 1.5 !important;">1</span>, IPPort = <span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">127.0.0.1:9001</span><span style="color: #800000; line-height: 1.5 !important;">"</span><span style="line-height: 1.5 !important;"> });              </span><span style="color: #0000ff; line-height: 1.5 !important;">char</span>[] charKey =<span style="line-height: 1.5 !important;"> Key.ToCharArray();             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">记录Key中的所有字母与数字的ascii码和</span>             <span style="color: #0000ff; line-height: 1.5 !important;">int</span> KeyNum = <span style="color: #800080; line-height: 1.5 !important;">0</span><span style="line-height: 1.5 !important;">;             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">记录余数</span>             <span style="color: #0000ff; line-height: 1.5 !important;">int</span> Num = <span style="color: #800080; line-height: 1.5 !important;">0</span><span style="line-height: 1.5 !important;">;             </span><span style="color: #0000ff; line-height: 1.5 !important;">foreach</span> (<span style="color: #0000ff; line-height: 1.5 !important;">var</span> c <span style="color: #0000ff; line-height: 1.5 !important;">in</span><span style="line-height: 1.5 !important;"> charKey)             {                 </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> ((c &gt;= <span style="color: #800000; line-height: 1.5 !important;">'</span><span style="color: #800000; line-height: 1.5 !important;">a</span><span style="color: #800000; line-height: 1.5 !important;">'</span> &amp;&amp; <span style="color: #800000; line-height: 1.5 !important;">'</span><span style="color: #800000; line-height: 1.5 !important;">z</span><span style="color: #800000; line-height: 1.5 !important;">'</span> &gt;= c) || (c &gt;= <span style="color: #800000; line-height: 1.5 !important;">'</span><span style="color: #800000; line-height: 1.5 !important;">A</span><span style="color: #800000; line-height: 1.5 !important;">'</span> &amp;&amp; <span style="color: #800000; line-height: 1.5 !important;">'</span><span style="color: #800000; line-height: 1.5 !important;">Z</span><span style="color: #800000; line-height: 1.5 !important;">'</span> &gt;=<span style="line-height: 1.5 !important;"> c))                 {                     System.Text.ASCIIEncoding asciiEncoding </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> System.Text.ASCIIEncoding();                     KeyNum </span>= KeyNum + (<span style="color: #0000ff; line-height: 1.5 !important;">int</span>)asciiEncoding.GetBytes(c.ToString())[<span style="color: #800080; line-height: 1.5 !important;">0</span><span style="line-height: 1.5 !important;">];                 }                 </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (c &gt;= <span style="color: #800000; line-height: 1.5 !important;">'</span><span style="color: #800000; line-height: 1.5 !important;">1</span><span style="color: #800000; line-height: 1.5 !important;">'</span> &amp;&amp; <span style="color: #800000; line-height: 1.5 !important;">'</span><span style="color: #800000; line-height: 1.5 !important;">9</span><span style="color: #800000; line-height: 1.5 !important;">'</span> &gt;=<span style="line-height: 1.5 !important;"> c)                 {                     KeyNum </span>+=<span style="line-height: 1.5 !important;"> Convert.ToInt32(c.ToString());                 }             }             Num </span>= KeyNum %<span style="line-height: 1.5 !important;"> RedisClientList.Count;             </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span> <span style="color: #0000ff; line-height: 1.5 !important;">new</span> RedisClient(RedisClientList.Where(it =&gt; it.Num ==<span style="line-height: 1.5 !important;"> Num).First().IPPort);         }         </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">Redis客户端信息</span>         <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> RedisClientInfo         {             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">Redis Server编号</span>             <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">int</span> Num { <span style="color: #0000ff; line-height: 1.5 !important;">get</span>; <span style="color: #0000ff; line-height: 1.5 !important;">set</span><span style="line-height: 1.5 !important;">; }             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">Redis Server IP地址和端口号</span>             <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">string</span> IPPort { <span style="color: #0000ff; line-height: 1.5 !important;">get</span>; <span style="color: #0000ff; line-height: 1.5 !important;">set</span><span style="line-height: 1.5 !important;">; }         }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><h2>方案二</h2><h3><span style="line-height: 1.5;">1、分布式实现</span></h3><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">通过key做一致性哈希，实现key对应redis结点的分布。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">一致性哈希的实现：</p><ol style="padding-left: 50px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><li style="list-style-type: decimal;">hash值计算：通过支持MD5与MurmurHash两种计算方式，默认是采用MurmurHash，高效的hash计算。</li><li style="list-style-type: decimal;">一致性的实现：通过java的TreeMap来模拟环状结构，实现均匀分布</li></ol><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">什么也不多说了，直接上代码吧，LZ也是只知道点皮毛，代码中还有一些看不懂的地方，留着以后慢慢琢磨</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> KetamaNodeLocator     {         </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">原文中的JAVA类TreeMap实现了Comparator方法，这里我图省事，直接用了net下的SortedList，其中Comparer接口方法）</span>         <span style="color: #0000ff; line-height: 1.5 !important;">private</span> SortedList&lt;<span style="color: #0000ff; line-height: 1.5 !important;">long</span>, <span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt; ketamaNodes = <span style="color: #0000ff; line-height: 1.5 !important;">new</span> SortedList&lt;<span style="color: #0000ff; line-height: 1.5 !important;">long</span>, <span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt;<span style="line-height: 1.5 !important;">();         </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> HashAlgorithm hashAlg;         </span><span style="color: #0000ff; line-height: 1.5 !important;">private</span> <span style="color: #0000ff; line-height: 1.5 !important;">int</span> numReps = <span style="color: #800080; line-height: 1.5 !important;">160</span><span style="line-height: 1.5 !important;">;         </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">此处参数与JAVA版中有区别，因为使用的静态方法，所以不再传递HashAlgorithm alg参数</span>         <span style="color: #0000ff; line-height: 1.5 !important;">public</span> KetamaNodeLocator(List&lt;<span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt; nodes<span style="color: #008000; line-height: 1.5 !important;">/*</span><span style="color: #008000; line-height: 1.5 !important;">，int nodeCopies</span><span style="color: #008000; line-height: 1.5 !important;">*/</span><span style="line-height: 1.5 !important;">)         {             ketamaNodes </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span> SortedList&lt;<span style="color: #0000ff; line-height: 1.5 !important;">long</span>, <span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt;<span style="line-height: 1.5 !important;">();             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">numReps = nodeCopies;             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">对所有节点，生成nCopies个虚拟结点</span>             <span style="color: #0000ff; line-height: 1.5 !important;">foreach</span> (<span style="color: #0000ff; line-height: 1.5 !important;">string</span> node <span style="color: #0000ff; line-height: 1.5 !important;">in</span><span style="line-height: 1.5 !important;"> nodes)             {                 </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">每四个虚拟结点为一组</span>                 <span style="color: #0000ff; line-height: 1.5 !important;">for</span> (<span style="color: #0000ff; line-height: 1.5 !important;">int</span> i = <span style="color: #800080; line-height: 1.5 !important;">0</span>; i &lt; numReps / <span style="color: #800080; line-height: 1.5 !important;">4</span>; i++<span style="line-height: 1.5 !important;">)                 {                     </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">getKeyForNode方法为这组虚拟结点得到惟一名称 </span>                     <span style="color: #0000ff; line-height: 1.5 !important;">byte</span>[] digest = HashAlgorithm.computeMd5(node +<span style="line-height: 1.5 !important;"> i);                     </span><span style="color: #008000; line-height: 1.5 !important;">/*</span><span style="color: #008000; line-height: 1.5 !important;">* Md5是一个16字节长度的数组，将16字节的数组每四个字节一组，分别对应一个虚拟结点，这就是为什么上面把虚拟结点四个划分一组的原因</span><span style="color: #008000; line-height: 1.5 !important;">*/</span>                     <span style="color: #0000ff; line-height: 1.5 !important;">for</span> (<span style="color: #0000ff; line-height: 1.5 !important;">int</span> h = <span style="color: #800080; line-height: 1.5 !important;">0</span>; h &lt; <span style="color: #800080; line-height: 1.5 !important;">4</span>; h++<span style="line-height: 1.5 !important;">)                     {                         </span><span style="color: #0000ff; line-height: 1.5 !important;">long</span> m =<span style="line-height: 1.5 !important;"> HashAlgorithm.hash(digest, h);                         ketamaNodes[m] </span>=<span style="line-height: 1.5 !important;"> node;                     }                 }             }         }         </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">string</span> GetPrimary(<span style="color: #0000ff; line-height: 1.5 !important;">string</span><span style="line-height: 1.5 !important;"> k)         {             </span><span style="color: #0000ff; line-height: 1.5 !important;">byte</span>[] digest =<span style="line-height: 1.5 !important;"> HashAlgorithm.computeMd5(k);             </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span> rv = GetNodeForKey(HashAlgorithm.hash(digest, <span style="color: #800080; line-height: 1.5 !important;">0</span><span style="line-height: 1.5 !important;">));             </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> rv;         }         </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span> GetNodeForKey(<span style="color: #0000ff; line-height: 1.5 !important;">long</span><span style="line-height: 1.5 !important;"> hash)         {             </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span><span style="line-height: 1.5 !important;"> rv;             </span><span style="color: #0000ff; line-height: 1.5 !important;">long</span> key =<span style="line-height: 1.5 !important;"> hash;             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">如果找到这个节点，直接取节点，返回   </span>             <span style="color: #0000ff; line-height: 1.5 !important;">if</span> (!<span style="line-height: 1.5 !important;">ketamaNodes.ContainsKey(key))             {                 </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">得到大于当前key的那个子Map，然后从中取出第一个key，就是大于且离它最近的那个key 说明详见: </span><span style="color: #008000; text-decoration: underline; line-height: 1.5 !important;">http://www.javaeye.com/topic/684087</span>                 <span style="color: #0000ff; line-height: 1.5 !important;">var</span> tailMap = <span style="color: #0000ff; line-height: 1.5 !important;">from</span> coll <span style="color: #0000ff; line-height: 1.5 !important;">in</span><span style="line-height: 1.5 !important;"> ketamaNodes                               </span><span style="color: #0000ff; line-height: 1.5 !important;">where</span> coll.Key &gt;<span style="line-height: 1.5 !important;"> hash                               </span><span style="color: #0000ff; line-height: 1.5 !important;">select</span> <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> { coll.Key };                 </span><span style="color: #0000ff; line-height: 1.5 !important;">if</span> (tailMap == <span style="color: #0000ff; line-height: 1.5 !important;">null</span> || tailMap.Count() == <span style="color: #800080; line-height: 1.5 !important;">0</span><span style="line-height: 1.5 !important;">)                     key </span>=<span style="line-height: 1.5 !important;"> ketamaNodes.FirstOrDefault().Key;                 </span><span style="color: #0000ff; line-height: 1.5 !important;">else</span><span style="line-height: 1.5 !important;">                     key </span>=<span style="line-height: 1.5 !important;"> tailMap.FirstOrDefault().Key;             }             rv </span>=<span style="line-height: 1.5 !important;"> ketamaNodes[key];             </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> rv;         }     }     </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">class</span><span style="line-height: 1.5 !important;"> HashAlgorithm     {         </span><span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">long</span> hash(<span style="color: #0000ff; line-height: 1.5 !important;">byte</span>[] digest, <span style="color: #0000ff; line-height: 1.5 !important;">int</span><span style="line-height: 1.5 !important;"> nTime)         {             </span><span style="color: #0000ff; line-height: 1.5 !important;">long</span> rv = ((<span style="color: #0000ff; line-height: 1.5 !important;">long</span>)(digest[<span style="color: #800080; line-height: 1.5 !important;">3</span> + nTime * <span style="color: #800080; line-height: 1.5 !important;">4</span>] &amp; <span style="color: #800080; line-height: 1.5 !important;">0xFF</span>) &lt;&lt; <span style="color: #800080; line-height: 1.5 !important;">24</span><span style="line-height: 1.5 !important;">)                     </span>| ((<span style="color: #0000ff; line-height: 1.5 !important;">long</span>)(digest[<span style="color: #800080; line-height: 1.5 !important;">2</span> + nTime * <span style="color: #800080; line-height: 1.5 !important;">4</span>] &amp; <span style="color: #800080; line-height: 1.5 !important;">0xFF</span>) &lt;&lt; <span style="color: #800080; line-height: 1.5 !important;">16</span><span style="line-height: 1.5 !important;">)                     </span>| ((<span style="color: #0000ff; line-height: 1.5 !important;">long</span>)(digest[<span style="color: #800080; line-height: 1.5 !important;">1</span> + nTime * <span style="color: #800080; line-height: 1.5 !important;">4</span>] &amp; <span style="color: #800080; line-height: 1.5 !important;">0xFF</span>) &lt;&lt; <span style="color: #800080; line-height: 1.5 !important;">8</span><span style="line-height: 1.5 !important;">)                     </span>| ((<span style="color: #0000ff; line-height: 1.5 !important;">long</span>)digest[<span style="color: #800080; line-height: 1.5 !important;">0</span> + nTime * <span style="color: #800080; line-height: 1.5 !important;">4</span>] &amp; <span style="color: #800080; line-height: 1.5 !important;">0xFF</span><span style="line-height: 1.5 !important;">);             </span><span style="color: #0000ff; line-height: 1.5 !important;">return</span> rv &amp; <span style="color: #800080; line-height: 1.5 !important;">0xffffffffL</span>; <span style="color: #008000; line-height: 1.5 !important;">/*</span><span style="color: #008000; line-height: 1.5 !important;"> Truncate to 32-bits </span><span style="color: #008000; line-height: 1.5 !important;">*/</span><span style="line-height: 1.5 !important;">         }         </span><span style="color: #008000; line-height: 1.5 !important;">/*</span><span style="color: #008000; line-height: 1.5 !important;">*          * Get the md5 of the given key.          </span><span style="color: #008000; line-height: 1.5 !important;">*/</span>         <span style="color: #0000ff; line-height: 1.5 !important;">public</span> <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">byte</span>[] computeMd5(<span style="color: #0000ff; line-height: 1.5 !important;">string</span><span style="line-height: 1.5 !important;"> k)         {             MD5 md5 </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> MD5CryptoServiceProvider();              </span><span style="color: #0000ff; line-height: 1.5 !important;">byte</span>[] keyBytes =<span style="line-height: 1.5 !important;"> md5.ComputeHash(Encoding.UTF8.GetBytes(k));             md5.Clear();             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">md5.update(keyBytes);             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">return md5.digest();</span>             <span style="color: #0000ff; line-height: 1.5 !important;">return</span><span style="line-height: 1.5 !important;"> keyBytes;         }     }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><h3>2、分布式测试</h3><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">1、假设有两个server：0001和0002，循环调用10次看看Key值能不能均匀的映射到server上，代码如下：</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">    <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">void</span> Main(<span style="color: #0000ff; line-height: 1.5 !important;">string</span><span style="line-height: 1.5 !important;">[] args)         {             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">假设的server</span>             List&lt;<span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt; nodes = <span style="color: #0000ff; line-height: 1.5 !important;">new</span> List&lt;<span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt;() { <span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">0001</span><span style="color: #800000; line-height: 1.5 !important;">"</span>,<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">0002</span><span style="color: #800000; line-height: 1.5 !important;">"</span><span style="line-height: 1.5 !important;"> };             KetamaNodeLocator k </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> KetamaNodeLocator(nodes);             </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span> str = <span style="color: #800000; line-height: 1.5 !important;">""</span><span style="line-height: 1.5 !important;">;             </span><span style="color: #0000ff; line-height: 1.5 !important;">for</span> (<span style="color: #0000ff; line-height: 1.5 !important;">int</span> i = <span style="color: #800080; line-height: 1.5 !important;">0</span>; i &lt; <span style="color: #800080; line-height: 1.5 !important;">10</span>; i++<span style="line-height: 1.5 !important;">)             {                 </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span> Key=<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">user_</span><span style="color: #800000; line-height: 1.5 !important;">"</span> +<span style="line-height: 1.5 !important;"> i;                 str </span>+= <span style="color: #0000ff; line-height: 1.5 !important;">string</span>.Format(<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">Key:{0}分配到的Server为：{1}\n\n</span><span style="color: #800000; line-height: 1.5 !important;">"</span><span style="line-height: 1.5 !important;">, Key, k.GetPrimary(Key));             }                          Console.WriteLine(str);                         Console.ReadLine();                       }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">程序运行两次的结果如下，发现Key基本上均匀的分配到Server节点上了。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><img src="http://images.cnitblog.com/blog/340919/201412/311503359036441.jpg" alt="" style="border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">2、我们在添加一个0003的server节点，代码如下：</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">  <span style="color: #0000ff; line-height: 1.5 !important;">static</span> <span style="color: #0000ff; line-height: 1.5 !important;">void</span> Main(<span style="color: #0000ff; line-height: 1.5 !important;">string</span><span style="line-height: 1.5 !important;">[] args)         {             </span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">假设的server</span>             List&lt;<span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt; nodes = <span style="color: #0000ff; line-height: 1.5 !important;">new</span> List&lt;<span style="color: #0000ff; line-height: 1.5 !important;">string</span>&gt;() { <span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">0001</span><span style="color: #800000; line-height: 1.5 !important;">"</span>,<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">0002</span><span style="color: #800000; line-height: 1.5 !important;">"</span> ,<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">0003</span><span style="color: #800000; line-height: 1.5 !important;">"</span><span style="line-height: 1.5 !important;">};             KetamaNodeLocator k </span>= <span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> KetamaNodeLocator(nodes);             </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span> str = <span style="color: #800000; line-height: 1.5 !important;">""</span><span style="line-height: 1.5 !important;">;             </span><span style="color: #0000ff; line-height: 1.5 !important;">for</span> (<span style="color: #0000ff; line-height: 1.5 !important;">int</span> i = <span style="color: #800080; line-height: 1.5 !important;">0</span>; i &lt; <span style="color: #800080; line-height: 1.5 !important;">10</span>; i++<span style="line-height: 1.5 !important;">)             {                 </span><span style="color: #0000ff; line-height: 1.5 !important;">string</span> Key=<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">user_</span><span style="color: #800000; line-height: 1.5 !important;">"</span> +<span style="line-height: 1.5 !important;"> i;                 str </span>+= <span style="color: #0000ff; line-height: 1.5 !important;">string</span>.Format(<span style="color: #800000; line-height: 1.5 !important;">"</span><span style="color: #800000; line-height: 1.5 !important;">Key:{0}分配到的Server为：{1}\n\n</span><span style="color: #800000; line-height: 1.5 !important;">"</span><span style="line-height: 1.5 !important;">, Key, k.GetPrimary(Key));             }                          Console.WriteLine(str);                         Console.ReadLine();                       }</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #1d58d1; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">程序运行两次的结果如下：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><img src="http://images.cnitblog.com/blog/340919/201412/311507534973079.jpg" alt="" style="border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">对比第一次的运行结果发现只有user_5,user_7,user_9的缓存丢失，其他的缓存还可以命中。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">3、我们去掉server 0002，运行两次的结果如下:</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><img src="http://images.cnitblog.com/blog/340919/201412/311512112632729.jpg" alt="" style="border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">对比第二次和本次运行结果发现 user_0,user_1,user_6 缓存丢失。</p><h2>结论</h2><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">通过一致性hash算法可以很好的解决Redis分布式的问题，且当Redis server增加或减少的时候，之前存储的缓存命中率还是比较高的。<br /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><a href="http://www.cnblogs.com/lc-chenlong/p/4194150.html" target="_blank" style="color: #1d58d1; text-decoration: none;">http://www.cnblogs.com/lc-chenlong/p/4194150.html</a><br /><a href="http://www.cnblogs.com/lc-chenlong/p/4195033.html" target="_blank" style="color: #1d58d1; text-decoration: none;">http://www.cnblogs.com/lc-chenlong/p/4195033.html</a><br /><a href="http://www.cnblogs.com/lc-chenlong/p/3218157.html" target="_blank" style="color: #1d58d1; text-decoration: none;">http://www.cnblogs.com/lc-chenlong/p/3218157.html</a></p><h2>本文参考</h2><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">1、<a href="http://blog.csdn.net/chen77716/article/details/5949166" target="_blank" style="color: #1d58d1; text-decoration: none;">http://blog.csdn.net/chen77716/article/details/5949166</a></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;">2、<a href="http://www.cr173.com/html/6474_2.html" target="_blank" style="color: #1d58d1; text-decoration: none;">http://www.cr173.com/html/6474_2.html</a></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2000007629395px; background-color: #ffffff;"><br />转:<span style="font-family: verdana, 'courier new'; line-height: 21px;">http://www.cnblogs.com/lc-chenlong/p/4195814.html?utm_source=tuicool&amp;utm_medium=referral<br /><br /><br /><br /></span></p><img src ="http://www.blogjava.net/jlin/aggbug/427834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2015-10-20 15:51 <a href="http://www.blogjava.net/jlin/archive/2015/10/20/427834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用于负载均衡的一致性哈希及java实现(转)</title><link>http://www.blogjava.net/jlin/archive/2015/10/19/427820.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Mon, 19 Oct 2015 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2015/10/19/427820.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/427820.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2015/10/19/427820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/427820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/427820.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这几天看了几遍一致性哈希的文章，但是都没有比较完整的实现，因此试着实现了一下，这里我就不讲一致性哈希的原理了，网上很多，以一致性哈希用在负载均衡的实例来说，一致性哈希就是先把主机ip从小大到全部放到一个环内，然后客户端ip来连接的时候，把客户端ip连接到大小最接近客户端ip且大于客户端ip的主机。当然，这里的ip一般都是要先hash一下的。我的程序运行结果如下：&nbsp; &nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/jlin/archive/2015/10/19/427820.html'>阅读全文</a><img src ="http://www.blogjava.net/jlin/aggbug/427820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2015-10-19 15:23 <a href="http://www.blogjava.net/jlin/archive/2015/10/19/427820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能网站架构设计之缓存篇（5）- Redis 集群(转)</title><link>http://www.blogjava.net/jlin/archive/2015/10/14/427731.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Wed, 14 Oct 2015 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2015/10/14/427731.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/427731.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2015/10/14/427731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/427731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/427731.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">集群技术是构建高性能网站架构的重要手段，试想在网站承受高并发访问压力的同时，还需要从海量数据中查询出满足条件的数据，并快速响应，我们必然想到的是将数据进行切片，把数据根据某种规则放入多个不同的服务器节点，来降低单节点服务器的压力。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">上一篇我们讲到了 Redis 的主从复制技术，当实现了多节点的 master-slave 后，我们也可以把它叫做集群，但我们今天要讲的集群主要是利用切片技术来组建的集群。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点，这里我们需要一个规则或者算法，通常的做法是获取 key 的哈希值，然后根据节点数来求模，但这种做法有其明显的弊端，当我们需要增加或减少一个节点时，会造成大量的 key 无法命中，这种比例是相当高的，所以就有人提出了一致性哈希的概念。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">一致性哈希有四个重要特征：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">均衡性：也有人把它定义为平衡性，是指哈希的结果能够尽可能分布到所有的节点中去，这样可以有效的利用每个节点上的资源。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px;">单调性：对于单调性有很多翻译让我非常的不解，而我想要的是</span><span style="margin: 0px; padding: 0px;">当节点数量变化时哈希的结果应尽可能的</span><span style="margin: 0px; padding: 0px;">保护已分配的内容不会被重新分派到新的节点。</span></p><div style="margin: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">分散性和负载：这两个其实是差不多的意思，就是要求一致性哈希算法对 key 哈希应尽可能的避免重复。</div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">但一致性哈希不是我们今天要介绍的重点，因为 Redis 引入另一种哈希槽（hash slot）的概念。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Redis 集群中内置了 16384 个哈希槽，当需要在 Redis 集群中放置一个 key-value 时，redis 先对 key 使用 crc16 算法算出一个结果，然后把结果对 16384 求余数，这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽，redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">使用哈希槽的好处就在于可以方便的添加或移除节点。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">当需要增加节点时，只需要把其他节点的某些哈希槽挪到新节点就可以了；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">当需要移除节点时，只需要把移除节点上的哈希槽挪到其他节点就行了；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">内部机制，与我何干，对于我们来说，在新增或移除节点的时候不要让我们先停掉所有的 redis 服务我就谢天谢地了，这点它做到了。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">下面我们就开始动手搭建一个 redis 集群来体验一下。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">因为我们要启动多个 redis 实例，虽然我们可以直接通过命令行来启动，但始终是不怎么方便的，所以我们先来新建三个实例目录，分别是9001，9002，9003，目录名就是 redis 实例的端口号。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;"><img src="http://images.cnitblog.com/i/25806/201406/021614556613255.png" alt="" width="137" height="72" style="margin: 0px; padding: 0px; border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">我这里已经建好了目录，然后我们把以前编译过和修改过的 redis-server、redis.conf这两个文件分别拷贝到这三个目录里面，拷贝完之后就像这样子了：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;"><img src="http://images.cnitblog.com/i/25806/201406/021617469582257.png" alt="" width="139" height="50" style="margin: 0px; padding: 0px; border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">我们打开 redis.conf 文件，为了简单起见，我们只保留下面几个配置项：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">daemonize yes<br style="margin: 0px; padding: 0px;" />port 9001<br style="margin: 0px; padding: 0px;" />cluster-enabled yes<br style="margin: 0px; padding: 0px;" />cluster-config-file nodes.conf<br style="margin: 0px; padding: 0px;" />cluster-node-timeout 5000<br style="margin: 0px; padding: 0px;" />appendonly yes</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">注意：port 要修改成对应目录的名字，也就是每个实例要有不同的端口。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">下面我们分别启动这三个实例：</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis-cluster</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:redis-cluster zhaogh$ cd 9001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:9001 zhaogh$ ./redis-server ./redis.conf</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:9003 zhaogh$ cd ../9002</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:9002 zhaogh$ ./redis-server ./redis.conf</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:9002 zhaogh$ cd ../9003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:9003 zhaogh$ ./redis-server ./redis.conf</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:9003 zhaogh$&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">接下来我们来创建集群，让三个实例互相通讯：</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Creating cluster</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Connecting to node 127.0.0.1:9001: OK</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Connecting to node 127.0.0.1:9002: OK</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Connecting to node 127.0.0.1:9003: OK</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Performing hash slots allocation on 3 nodes...</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Using 3 masters:</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9002</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&nbsp;&nbsp; slots:0-5460 (5461 slots) master</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&nbsp;&nbsp; slots:5461-10922 (5462 slots) master</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&nbsp;&nbsp; slots:10923-16383 (5461 slots) master</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Can I set the above configuration? (type 'yes' to accept): yes</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Nodes configuration updated</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Assign a different config epoch to each node</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Sending CLUSTER MEET messages to join the cluster</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">Waiting for the cluster to join..</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Performing Cluster Check (using node 127.0.0.1:9001)</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&nbsp;&nbsp; slots:0-5460 (5461 slots) master</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&nbsp;&nbsp; slots:5461-10922 (5462 slots) master</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&nbsp;&nbsp; slots:10923-16383 (5461 slots) master</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">[OK] All nodes agree about slots configuration.</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Check for open slots...</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">&gt;&gt;&gt; Check slots coverage...</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">[OK] All 16384 slots covered.</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:src zhaogh$&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">需要注意的是执行&nbsp;redis-trib.rb 命令需要 ruby 的支持，如果你没有安装可以先到&nbsp;<a href="http://www.cnblogs.com/zhaoguihua/p/redis-004.html" style="margin: 0px; padding: 1px 3px; color: green; text-decoration: none; line-height: 1.5;">https://rubygems.org/gems/redis</a>&nbsp;下载，然后离线安装。</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">sudo gem install redis-3.0.7.gem --local</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">下面我们用 redis 自带的客户端测试一下：</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9001&gt; get testkey001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">-&gt; Redirected to slot [12786] located at 127.0.0.1:9003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">(nil)</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9003&gt; set testkey002 testvalue002</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">-&gt; Redirected to slot [401] located at 127.0.0.1:9001</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">OK</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9001&gt; get testkey002</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">"testvalue002"</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9001&gt; set testkey003 testvalue003</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">OK</p><p style="margin-top: 10px; margin-bottom: 10px; margin-left: 30px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">127.0.0.1:9001&gt;&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">可以看到，虽然我们第一次连接的是9001端口，当我们去获取 testkey001 的时候，redis cluster 自动帮我们重定向到 9003 。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.9200000762939px; line-height: 20.8800010681152px; background-color: #ffffff;">当我们在 9003 设置 testkey002 时，redis cluster 又重定向到 9001 。</p><img src ="http://www.blogjava.net/jlin/aggbug/427731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2015-10-14 10:26 <a href="http://www.blogjava.net/jlin/archive/2015/10/14/427731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx配置文件详细说明</title><link>http://www.blogjava.net/jlin/archive/2015/02/03/422720.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Tue, 03 Feb 2015 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2015/02/03/422720.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/422720.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2015/02/03/422720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/422720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/422720.html</trackback:ping><description><![CDATA[<p>在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.</p>
<blockquote>
<p>#运行用户<br />user www-data;&nbsp;&nbsp;&nbsp; <br />#启动进程,通常设置成和cpu的数量相等<br />worker_processes&nbsp; 1;</p>
<p>#全局错误日志及PID文件<br />error_log&nbsp; /var/log/nginx/error.log;<br />pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/run/nginx.pid;</p>
<p>#工作模式及连接数上限<br />events {<br />&nbsp;&nbsp;&nbsp; use&nbsp;&nbsp; epoll;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能<br />&nbsp;&nbsp;&nbsp; worker_connections&nbsp; 1024;#单个后台worker process进程的最大并发链接数<br />&nbsp;&nbsp;&nbsp; # multi_accept on; <br />}</p>
<p>#设定http服务器，利用它的反向代理功能提供负载均衡支持<br />http {<br />&nbsp;&nbsp;&nbsp;&nbsp; #设定mime类型,类型由mime.type文件定义<br />&nbsp;&nbsp;&nbsp; include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/nginx/mime.types;<br />&nbsp;&nbsp;&nbsp; default_type&nbsp; application/octet-stream;<br />&nbsp;&nbsp;&nbsp; #设定日志格式<br />&nbsp;&nbsp;&nbsp; access_log&nbsp;&nbsp;&nbsp; /var/log/nginx/access.log;</p>
<p>&nbsp;&nbsp;&nbsp; #sendfile 指令指定 nginx 是否调用 sendfile 函数（zero copy 方式）来输出文件，对于普通应用，<br />&nbsp;&nbsp;&nbsp; #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用，可设置为 off，以平衡磁盘与网络I/O处理速度，降低系统的uptime.<br />&nbsp;&nbsp;&nbsp; sendfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br />&nbsp;&nbsp;&nbsp; #tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp; on;</p>
<p>&nbsp;&nbsp;&nbsp; #连接超时时间<br />&nbsp;&nbsp;&nbsp; #keepalive_timeout&nbsp; 0;<br />&nbsp;&nbsp;&nbsp; keepalive_timeout&nbsp; 65;<br />&nbsp;&nbsp;&nbsp; tcp_nodelay&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; #开启gzip压缩<br />&nbsp;&nbsp;&nbsp; gzip&nbsp; on;<br />&nbsp;&nbsp;&nbsp; gzip_disable "MSIE [1-6]\.(?!.*SV1)";</p>
<p>&nbsp;&nbsp;&nbsp; #设定请求缓冲<br />&nbsp;&nbsp;&nbsp; client_header_buffer_size&nbsp;&nbsp;&nbsp; 1k;<br />&nbsp;&nbsp;&nbsp; large_client_header_buffers&nbsp; 4 4k;</p>
<p>&nbsp;&nbsp;&nbsp; include /etc/nginx/conf.d/*.conf;<br />&nbsp;&nbsp;&nbsp; include /etc/nginx/sites-enabled/*;</p>
<p>&nbsp;&nbsp;&nbsp; #设定负载均衡的服务器列表<br />&nbsp;&nbsp;&nbsp;&nbsp; upstream mysvr {<br />&nbsp;&nbsp;&nbsp; #weigth参数表示权值，权值越高被分配到的几率越大<br />&nbsp;&nbsp;&nbsp; #本机上的Squid开启3128端口<br />&nbsp;&nbsp;&nbsp; server 192.168.8.1:3128 weight=5;<br />&nbsp;&nbsp;&nbsp; server 192.168.8.2:80&nbsp; weight=1;<br />&nbsp;&nbsp;&nbsp; server 192.168.8.3:80&nbsp; weight=6;<br />&nbsp;&nbsp;&nbsp; }</p>
<p><br />&nbsp;&nbsp; server {<br />&nbsp;&nbsp;&nbsp; #侦听80端口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #定义使用<a href="http://www.xx.com/">www.xx.com</a>访问<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server_name&nbsp; www.xx.com;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #设定本虚拟主机的访问日志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access_log&nbsp; logs/www.xx.com.access.log&nbsp; main;</p>
<p>&nbsp;&nbsp;&nbsp; #默认请求<br />&nbsp;&nbsp;&nbsp; location / {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp; /root;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #定义服务器的默认网站根目录位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index index.php index.html index.htm;&nbsp;&nbsp; #定义首页索引文件的名称</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_pass&nbsp; www.xx.com;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp; SCRIPT_FILENAME&nbsp; $document_root/$fastcgi_script_name; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include /etc/nginx/fastcgi_params;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; # 定义错误提示页面<br />&nbsp;&nbsp;&nbsp; error_page&nbsp;&nbsp; 500 502 503 504 /50x.html;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; location = /50x.html {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp; /root;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; #静态文件，nginx自己处理<br />&nbsp;&nbsp;&nbsp; location ~ ^/(images|javascript|js|css|flash|media|static)/ {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root /var/www/virtual/htdocs;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #过期30天，静态文件不怎么更新，过期可以设大一点，如果频繁更新，则可以设置得小一点。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expires 30d;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.<br />&nbsp;&nbsp;&nbsp; location ~ \.php$ {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root /root;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_pass 127.0.0.1:9000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_index index.php;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include fastcgi_params;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; #设定查看Nginx状态的地址<br />&nbsp;&nbsp;&nbsp; location /NginxStatus {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stub_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access_log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth_basic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "NginxStatus";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth_basic_user_file&nbsp; conf/htpasswd;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; #禁止访问 .htxxx 文件<br />&nbsp;&nbsp;&nbsp; location ~ /\.ht {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deny all;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p></blockquote>
<p>以上是一些基本的配置,使用Nginx最大的好处就是负载均衡</p>
<p>如果要使用负载均衡的话,可以修改配置http节点如下：</p>
<blockquote>
<p>#设定http服务器，利用它的反向代理功能提供负载均衡支持<br />http {<br />&nbsp;&nbsp;&nbsp;&nbsp; #设定mime类型,类型由mime.type文件定义<br />&nbsp;&nbsp;&nbsp; include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /etc/nginx/mime.types;<br />&nbsp;&nbsp;&nbsp; default_type&nbsp; application/octet-stream;<br />&nbsp;&nbsp;&nbsp; #设定日志格式<br />&nbsp;&nbsp;&nbsp; access_log&nbsp;&nbsp;&nbsp; /var/log/nginx/access.log;</p>
<p>&nbsp;&nbsp;&nbsp; #省略上文有的一些配置节点</p>
<p>&nbsp;&nbsp;&nbsp; #。。。。。。。。。。</p>
<p>&nbsp;&nbsp;&nbsp; #设定负载均衡的服务器列表<br />&nbsp;&nbsp;&nbsp;&nbsp; upstream mysvr {<br />&nbsp;&nbsp;&nbsp; #weigth参数表示权值，权值越高被分配到的几率越大<br />&nbsp;&nbsp;&nbsp; server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口<br />&nbsp;&nbsp;&nbsp; server 192.168.8.2x:80&nbsp; weight=1;<br />&nbsp;&nbsp;&nbsp; server 192.168.8.3x:80&nbsp; weight=6;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; upstream mysvr2 {<br />&nbsp;&nbsp;&nbsp; #weigth参数表示权值，权值越高被分配到的几率越大</p>
<p>&nbsp;&nbsp;&nbsp; server 192.168.8.x:80&nbsp; weight=1;<br />&nbsp;&nbsp;&nbsp; server 192.168.8.x:80&nbsp; weight=6;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; #第一个虚拟服务器<br />&nbsp;&nbsp; server {<br />&nbsp;&nbsp;&nbsp; #侦听192.168.8.x的80端口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server_name&nbsp; 192.168.8.x;</p>
<p>&nbsp; &nbsp; &nbsp; #对aspx后缀的进行负载均衡请求<br />&nbsp; &nbsp;&nbsp;location ~ .*\.aspx$ {</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; root &nbsp; /root; &nbsp; &nbsp;&nbsp; #定义服务器的默认网站根目录位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index index.php index.html index.htm;&nbsp;&nbsp; #定义首页索引文件的名称</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_pass&nbsp; http://mysvr ;#请求转向mysvr 定义的服务器列表</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #以下是一些反向代理的配置可删除.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_redirect off;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_set_header Host $host;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_set_header X-Real-IP $remote_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client_max_body_size 10m;&nbsp;&nbsp;&nbsp; #允许客户端请求的最大单文件字节数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client_body_buffer_size 128k;&nbsp; #缓冲区代理缓冲用户端请求的最大字节数，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_connect_timeout 90;&nbsp; #nginx跟后端服务器连接超时时间(代理连接超时)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_send_timeout 90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #后端服务器数据回传时间(代理发送超时)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_read_timeout 90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #连接成功后，后端服务器响应时间(代理接收超时)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_buffer_size 4k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #设置代理服务器（nginx）保存用户头信息的缓冲区大小<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_buffers 4 32k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #proxy_buffers缓冲区，网页平均在32k以下的话，这样设置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_busy_buffers_size 64k;&nbsp;&nbsp;&nbsp; #高负荷下缓冲大小（proxy_buffers*2）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_temp_file_write_size 64k;&nbsp; #设定缓存文件夹大小，大于这个值，将从upstream服务器传</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p></blockquote><img src ="http://www.blogjava.net/jlin/aggbug/422720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2015-02-03 23:00 <a href="http://www.blogjava.net/jlin/archive/2015/02/03/422720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx+Tomcat+Memcached集群(转)</title><link>http://www.blogjava.net/jlin/archive/2015/02/01/422636.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 01 Feb 2015 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2015/02/01/422636.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/422636.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2015/02/01/422636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/422636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/422636.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">Tomcat集群session同步方案有以下几种方式：</p><ul style="margin-left: 45px; padding-left: 0px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><li style="list-style: inherit !important;">使用tomcat自带的cluster方式，多个tomcat间自动实时复制session信息，配置起来很简单。但这个方案的效率比较低，在大并发下表现并不好。原理：http://zyycaesar.iteye.com/blog/296606</li></ul><ul style="margin-left: 45px; padding-left: 0px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><li style="list-style: inherit !important;">利用nginx的基于访问ip的hash路由策略，保证访问的ip始终被路由到同一个tomcat上，这个配置更简单。但如果应用是某一个局域网大量用户同时登录，这样负载均衡就没什么作用了。</li><li style="list-style: inherit !important;">利用nginx插件实现tomcat集群和session同步，nginx-upstream-jvm-route-0.1.tar.gz，是一个 Nginx 的扩展模块，用来实现基于 Cookie 的 Session Sticky 的功能，可通过http://code.google.com/p/nginx-upstream-jvm-route/downloads/list获取。</li></ul><div style="font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><ul style="margin-left: 45px; padding-left: 0px;"><li style="list-style: inherit !important;">利用memcached把多个tomcat的session集中管理，前端在利用nginx负载均衡和动静态资源分离，在兼顾系统水平扩展的同时又能保证较高的性能。</li></ul></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">以下使用第四种方案，集群环境：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">1. nginx最新版本：1.5.7</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><span style="line-height: 1.5;">2. tomcat版本：6.0.37</span></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">3. memcached最新版本：1.4.15</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">4. session复制同步使用memcache-session-manager最新版本：1.6.5</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">5. 系统：CentOS6.3</p><hr style="font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">一、Nginx安装</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- centos6.3默认未安装gcc-c++，先装gcc：</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="line-height: 1.5 !important;">yum</span> -y <span style="line-height: 1.5 !important;">install</span> <span style="line-height: 1.5 !important;">gcc</span>-c++</pre></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">装完后记得reboot系统。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- cd到安装目录</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">cd /usr/lcoal/src</pre></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- 安装pcre库</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">cd /usr/local/<span style="line-height: 1.5 !important;">src </span><span style="line-height: 1.5 !important;">wget</span> <span style="line-height: 1.5 !important;">ftp</span>:<span style="line-height: 1.5 !important;">//</span><span style="line-height: 1.5 !important;">ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz</span> <span style="line-height: 1.5 !important;">tar</span> -zxvf pcre-<span style="line-height: 1.5 !important;">8.21</span>.<span style="line-height: 1.5 !important;">tar</span><span style="line-height: 1.5 !important;">.gz cd pcre</span>-<span style="line-height: 1.5 !important;">8.21</span><span style="line-height: 1.5 !important;"> .</span>/<span style="line-height: 1.5 !important;">configure </span><span style="line-height: 1.5 !important;">make</span> <span style="line-height: 1.5 !important;">make</span> <span style="line-height: 1.5 !important;">install</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">如果wget下载不到的话，去官网下载pcre-8.12.tar.gz包拷贝到src下。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- 安装zlib库</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">cd /usr/local/<span style="line-height: 1.5 !important;">src   </span><span style="line-height: 1.5 !important;">wget</span> http:<span style="line-height: 1.5 !important;">//</span><span style="line-height: 1.5 !important;">zlib.net/zlib-1.2.8.tar.gz</span> <span style="line-height: 1.5 !important;">tar</span> -zxvf zlib-<span style="line-height: 1.5 !important;">1.2</span>.<span style="line-height: 1.5 !important;">8</span>.<span style="line-height: 1.5 !important;">tar</span><span style="line-height: 1.5 !important;">.gz cd zlib</span>-<span style="line-height: 1.5 !important;">1.2</span>.<span style="line-height: 1.5 !important;">8</span><span style="line-height: 1.5 !important;"> .</span>/<span style="line-height: 1.5 !important;">configure </span><span style="line-height: 1.5 !important;">make</span> <span style="line-height: 1.5 !important;">make</span> <span style="line-height: 1.5 !important;">install</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- 安装ssl</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">cd /usr/local/<span style="line-height: 1.5 !important;">src </span><span style="line-height: 1.5 !important;">wget</span> http:<span style="line-height: 1.5 !important;">//</span><span style="line-height: 1.5 !important;">www.openssl.org/source/openssl-1.0.1c.tar.gz</span> <span style="line-height: 1.5 !important;">tar</span> -zxvf openssl-<span style="line-height: 1.5 !important;">1.0</span>.1c.<span style="line-height: 1.5 !important;">tar</span>.gz</pre></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- 安装nginx</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">cd nginx-<span style="line-height: 1.5 !important;">1.5</span>.<span style="line-height: 1.5 !important;">7</span><span style="line-height: 1.5 !important;">   .</span>/configure --prefix=/usr/local/nginx/<span style="line-height: 1.5 !important;">nginx \ </span>--with-<span style="line-height: 1.5 !important;">http_ssl_module \ </span>--with-pcre=/usr/local/src/pcre-<span style="line-height: 1.5 !important;">8.12</span><span style="line-height: 1.5 !important;"> \ </span>--with-zlib=/usr/local/src/zlib-<span style="line-height: 1.5 !important;">1.2</span>.<span style="line-height: 1.5 !important;">8</span><span style="line-height: 1.5 !important;"> \ </span>--with-openssl=/usr/local/src/openssl-<span style="line-height: 1.5 !important;">1.0</span><span style="line-height: 1.5 !important;">.1c   </span><span style="line-height: 1.5 !important;">make</span> <span style="line-height: 1.5 !important;">make</span> <span style="line-height: 1.5 !important;">install</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">安装成功，cd /usr/local/nginx/conf/nginx.conf，修改配置文件：</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="line-height: 1.5 !important;">http { ...     upstream localhost {         server    localhost:8081;         server    localhost:8082;         server    localhost:8083;     } ... }   location / {       root   html;       index  index.html index.htm;       proxy_pass   http://localhost;       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;         }</span></pre><p style="margin-top: 10px; margin-bottom: 10px;">&nbsp;</p><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">二、memcached安装</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">- memcached安装较简单，需要先libevent库：</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="color: #0000ff; line-height: 1.5 !important;">sudo</span> <span style="color: #0000ff; line-height: 1.5 !important;">yum</span> <span style="color: #0000ff; line-height: 1.5 !important;">install</span> libevent libevent-<span style="line-height: 1.5 !important;">devel  </span><span style="color: #0000ff; line-height: 1.5 !important;">wget</span> http:<span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">www.danga.com/memcached/dist/memcached-1.4.15.tar.gz</span> <span style="color: #0000ff; line-height: 1.5 !important;">tar</span> zxf memcached-<span style="color: #800080; line-height: 1.5 !important;">1.4</span>.<span style="color: #800080; line-height: 1.5 !important;">15</span>.<span style="color: #0000ff; line-height: 1.5 !important;">tar</span><span style="line-height: 1.5 !important;">.gz cd memcached</span>-<span style="color: #800080; line-height: 1.5 !important;">1.4</span>.<span style="color: #800080; line-height: 1.5 !important;">15</span><span style="line-height: 1.5 !important;"> .</span>/<span style="line-height: 1.5 !important;">configure </span><span style="color: #0000ff; line-height: 1.5 !important;">make</span> <span style="color: #0000ff; line-height: 1.5 !important;">sudo</span> <span style="color: #0000ff; line-height: 1.5 !important;">make</span> <span style="color: #0000ff; line-height: 1.5 !important;">install</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">安装成功（默认安装在bin下），启动：</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">#-<span style="line-height: 1.5 !important;">vv 控制台输出 #</span>-<span style="line-height: 1.5 !important;">d 后台运行 </span>/usr/local/bin/memcached -vv</pre></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">启动后，可以telnet上去看下状态：</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;">telnet <span style="color: #800080; line-height: 1.5 !important;">127.0</span>.<span style="color: #800080; line-height: 1.5 !important;">0.1</span> <span style="color: #800080; line-height: 1.5 !important;">11211</span><span style="line-height: 1.5 !important;">  stats</span></pre></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">三、tomcat配置</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">1. 修改server.xml</p><div style="margin: 5px 0px; font-size: 12px !important;"><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="color: #0000ff; line-height: 1.5 !important;">&lt;</span><span style="color: #800000; line-height: 1.5 !important;">Engine </span><span style="color: #ff0000; line-height: 1.5 !important;">name</span><span style="color: #0000ff; line-height: 1.5 !important;">="Catalina"</span><span style="color: #ff0000; line-height: 1.5 !important;"> defaultHost</span><span style="color: #0000ff; line-height: 1.5 !important;">="localhost"</span><span style="color: #ff0000; line-height: 1.5 !important;"> jvmRoute</span><span style="color: #0000ff; line-height: 1.5 !important;">="jvm1"</span><span style="color: #0000ff; line-height: 1.5 !important;">&gt;</span><span style="line-height: 1.5 !important;">  ...  </span><span style="color: #0000ff; line-height: 1.5 !important;">&lt;</span><span style="color: #800000; line-height: 1.5 !important;">Context </span><span style="color: #ff0000; line-height: 1.5 !important;">path</span><span style="color: #0000ff; line-height: 1.5 !important;">=""</span><span style="color: #ff0000; line-height: 1.5 !important;"> docBase</span><span style="color: #0000ff; line-height: 1.5 !important;">="/demo/appserver/app/cluster"</span><span style="color: #ff0000; line-height: 1.5 !important;"> debug</span><span style="color: #0000ff; line-height: 1.5 !important;">="0"</span><span style="color: #ff0000; line-height: 1.5 !important;"> reloadable</span><span style="color: #0000ff; line-height: 1.5 !important;">="true"</span><span style="color: #ff0000; line-height: 1.5 !important;"> crossContext</span><span style="color: #0000ff; line-height: 1.5 !important;">="true"</span><span style="color: #0000ff; line-height: 1.5 !important;">&gt;</span>     　　<span style="color: #0000ff; line-height: 1.5 !important;">&lt;</span><span style="color: #800000; line-height: 1.5 !important;">Manager <br /></span><span style="color: #ff0000; line-height: 1.5 !important;">　　　　className</span><span style="color: #0000ff; line-height: 1.5 !important;">="de.javakaffee.web.msm.MemcachedBackupSessionManager"</span><span style="color: #ff0000; line-height: 1.5 !important;">        memcachedNodes</span><span style="color: #0000ff; line-height: 1.5 !important;">="n1:192.168.2.43:11211"</span><span style="color: #ff0000; line-height: 1.5 !important;"> 　　　　requestUriIgnorePattern</span><span style="color: #0000ff; line-height: 1.5 !important;">=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"</span><span style="color: #ff0000; line-height: 1.5 !important;"> 　　　　sessionBackupAsync</span><span style="color: #0000ff; line-height: 1.5 !important;">="false"</span><span style="color: #ff0000; line-height: 1.5 !important;"> 　　　　sessionBackupTimeout</span><span style="color: #0000ff; line-height: 1.5 !important;">="1800000"</span><span style="color: #ff0000; line-height: 1.5 !important;"> 　　　　copyCollectionsForSerialization</span><span style="color: #0000ff; line-height: 1.5 !important;">="false"</span><span style="color: #ff0000; line-height: 1.5 !important;"> 　　　　transcoderFactoryClass</span><span style="color: #0000ff; line-height: 1.5 !important;">="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"</span> <span style="color: #0000ff; line-height: 1.5 !important;">/&gt;</span> <span style="color: #0000ff; line-height: 1.5 !important;">&lt;/</span><span style="color: #800000; line-height: 1.5 !important;">Context</span><span style="color: #0000ff; line-height: 1.5 !important;">&gt;</span></pre><div style="margin-top: 5px;"><span style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: #444444; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important;" /></a></span></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">2. 添加mem和msm的依赖jar包</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">couchbase-client-1.2.2.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">javolution-5.4.3.1.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">kryo-1.03.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">kryo-serializers-0.10.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">memcached-session-manager-1.6.5.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">memcached-session-manager-tc6-1.6.5.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">minlog-1.2.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">msm-kryo-serializer-1.6.5.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">reflectasm-0.9.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">spymemcached-2.10.2.jar</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">注意点：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">-msm1.6.5依赖了Couchbase，需要添加couchbase-client的jar包，否则启动会报：java.lang.NoClassDefFoundError: com/couchbase/client/CouchbaseClient。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">-tomcat6和7使用不同msm支持包：memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar，只可选一，否则启动报错。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">-msm源码中的lib包版本太低：spymemcached-2.7.jar需要使用2.10.2，否则启动tomcat报错：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">java.lang.NoSuchMethodError: net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;<br />at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">kryo-serializers-0.8.jar需要使用0.10版本，否则报错：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">Caused by: java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer</p><hr style="font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;" /><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">tomcat启动成功后可以去刷新页面，ip端口会变化，session是不会变化的：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><img src="http://images.cnitblog.com/blog/40077/201312/05162859-463451ee1fcc468a84b23e609d889bb9.png" alt="" style="border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;">memcached的状态可以看到同步session的操作日志：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: verdana, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff;"><img src="http://images.cnitblog.com/blog/40077/201312/05162951-1725ed7191b74ae98cd640c3e8bc9c4a.png" alt="" style="border: 0px;" /></p><img src ="http://www.blogjava.net/jlin/aggbug/422636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2015-02-01 23:19 <a href="http://www.blogjava.net/jlin/archive/2015/02/01/422636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx 与Tomcat 实现动静态分离、负载均衡(转)</title><link>http://www.blogjava.net/jlin/archive/2015/02/01/422635.html</link><dc:creator>fly</dc:creator><author>fly</author><pubDate>Sun, 01 Feb 2015 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/jlin/archive/2015/02/01/422635.html</guid><wfw:comment>http://www.blogjava.net/jlin/comments/422635.html</wfw:comment><comments>http://www.blogjava.net/jlin/archive/2015/02/01/422635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jlin/comments/commentRss/422635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jlin/services/trackbacks/422635.html</trackback:ping><description><![CDATA[<h1><a href="http://www.itnose.net/detail/6170126.html" style="text-decoration: none;">Nginx 与Tomcat 实现动静态分离、负载均衡</a></h1><div f-aid=""  mb-10"="" id="ask-info" style="color: #999999; font-size: 12px; margin-bottom: 10px; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px;"><span ask-time"="" style="float: right; display: inline; width: 145px;">2014-12-10 15:54</span></div><div line="" mt-10=""  q-content"="" style="margin-top: 10px; word-wrap: break-word; word-break: break-all; color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; font-size: 13px; padding-top: 10px;"><div style="letter-spacing: 1px; font-size: 14px; margin-bottom: 10px;"><p style="margin: 0px 0px 10px; padding: 0px;"><strong>一．Nginx简介：</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;Nginx一个高性能的HTTP和反向代理服务器，&nbsp;具有很高的稳定性和支持热部署、模块扩展也很容易。当遇到访问的峰值，或者有人恶意发起慢速连接时，也很可能会导致服务器物理内存耗尽频繁交换，失去响应，只能重启服务器，Nginx采取了分阶段资源分配技术，处理静态文件和无缓存的反向代理加速，实现了负载均衡和容错，在这样高并发的访问情况下，能经受起高并发的处理。</p><p style="margin: 0px 0px 10px; padding: 0px;"></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>二．Nginx安装与配置</strong></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp; 第一步：下载Nginx&nbsp;安装包&nbsp;</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a target="_blank" href="http://nginx.org/en/download.html" rel="nofollow" style="text-decoration: none;">http://nginx.org/en/download.html</a></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;<strong>第二步：在linux上安装Nginx&nbsp;</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 1.#tar&nbsp;zxvf&nbsp;nginx-1.7.8.tar.gz&nbsp;&nbsp;//解压</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 2.#cd&nbsp;nginx-1.7.8</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 3.#./configure&nbsp;--with-http_stub_status_module&nbsp;--with-http_ssl_module//启动server状态页和https模块</p><p style="margin: 0px 0px 10px; padding: 0px;">会报缺少PCRE&nbsp;library错误，如图所示：</p><p style="margin: 0px 0px 10px; padding: 0px;"><img src="http://www.itnose.net/img/20141210/10173049.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡0" style="border: 0px; max-width: 720px;" /><br /></p><p style="margin: 0px 0px 10px; padding: 0px;"></p><p style="margin: 0px 0px 10px; padding: 0px;">这时先执行第三步安装PCRE&nbsp;，然后在3执行一下，这就可以了</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;4.make&nbsp;&amp;&amp;&nbsp;make&nbsp;install&nbsp;//编译并安装</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;5.测试一下安装配置是否正确,Nginx安装在/usr/local/nginx</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; #/usr/local/nginx/sbin/nginx&nbsp;-t，如图所示：</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp;&nbsp;<img src="http://www.itnose.net/img/20141210/10173050.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡1" style="border: 0px; max-width: 720px;" /></p><p style="margin: 0px 0px 10px; padding: 0px;"><br /></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;<strong>第三步：在linux上安装PCRE&nbsp;</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 1.#tar&nbsp;zxvf&nbsp;pcre-8.10.tar.gz&nbsp;&nbsp;//解压</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 2.cd&nbsp;pcre-8.10</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 3../configure</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 4.make&nbsp;&amp;&amp;&nbsp;make&nbsp;install//编译并安装</p><p style="margin: 0px 0px 10px; padding: 0px;"></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>三．Nginx&nbsp;+Tomcat&nbsp;实现动静态分离</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;动静态分离就是Nginx处理客户端的请求的静态页面(html页面)或者图片，Tomcat处理客户端请求的动态页面（jsp页面），因为Nginx处理的静态页面的效率高于Tomcat。</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;<strong>第一步：我们要配置Nginx文件</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;#vi&nbsp;/usr/local/nginx/conf/nginx.conf</p><pre name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 10px; margin-bottom: 10px; padding: 5px; font-family: 'Courier New', Arial; font-size: 10pt; border-color: #dddddd #dddddd #dddddd #6ce26c; border-style: solid; border-width: 1px 1px 1px 4px; border-image-source: none; background-image: none; background-attachment: scroll; background-color: #f6f6f6; line-height: 18px; background-position: 0px 0px; background-repeat: repeat repeat;">#user  nobody; worker_processes  1; error_log  logs/error.log; pid       logs/nginx.pid;  events {     use epoll;     worker_connections  1024; }   http {     include       mime.types;     default_type  application/octet-stream;     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';      access_log  logs/access.log  main;     sendfile        on; keepalive_timeout  65; gzip on;   gzip_min_length  1k;   gzip_buffers     4  16k;   gzip_http_version 1.0;   gzip_comp_level 2;   gzip_types  text/plain application/x-javascript text/css application/xml;   gzip_vary on;       server {         listen       80 default;         server_name  localhost;         &lt;span style="color:#ff0000;"&gt; location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx处理静态页面&lt;/span&gt;              {                    root   /usr/tomcat/apache-tomcat-8081/webapps/ROOT;                     expires      30d; //缓存到客户端30天                }          error_page  404              /404.html;          #redirect server error pages to the static page /50x.html                  error_page   500 502 503 504  /50x.html;         location = /50x.html {             root   html;         }          &lt;span style="color:#ff0000;"&gt; location ~  \.(jsp|do)$  {//所有jsp的动态请求都交给Tomcat处理 &lt;/span&gt;            &lt;span style="color:#ff0000;"&gt; proxy_pass http://192.168.74.129:8081;  //来自jsp或者do的后缀的请求交给tomcat处理&lt;/span&gt;             proxy_redirect off;             proxy_set_header Host $host;    //后端的Web服务器可以通过X-Forwarded-For获取用户真实IP             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;   //nginx跟后端服务器连接超时时间              proxy_read_timeout 90;     //连接成功后，后端服务器响应时间              proxy_buffer_size 4k;      //设置代理服务器（nginx）保存用户头信息的缓冲区大小              proxy_buffers  6  32k;       //proxy_buffers缓冲区，网页平均在32k以下的话，这样设置             proxy_busy_buffers_size 64k;//高负荷下缓冲大小（proxy_buffers*2）            proxy_temp_file_write_size 64k; //设定缓存文件夹大小，大于这个值，将从upstream服务器传         }            }    }</pre><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;<strong>第二步：在tomcat&nbsp;下的webapps/ROOT下新建index.html静态页面，如图所示：</strong></p><img src="http://www.itnose.net/img/20141210/10173051.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡2" style="border: 0px; max-width: 720px;" />&nbsp;<br /><p style="margin: 0px 0px 10px; padding: 0px;"></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp; 第三步：启动Nginx服务</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;#sbin/nginx &nbsp; 如图所示：</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp;<img src="http://www.itnose.net/img/20141210/10173052.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡3" style="border: 0px; max-width: 720px;" /></p><p style="margin: 0px 0px 10px; padding: 0px;"><br /></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp;第四步：我们页面访问http://192.168.74.129/index.html&nbsp;能正常显示正常的内容，如图所示：</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;<img src="http://www.itnose.net/img/20141210/10173053.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡4" style="border: 0px; max-width: 720px;" /></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp;第五步：测试Nginx&nbsp;和Tomcat高并发的情况下处理静态页面性能如何？</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 采用了&nbsp;Linux&nbsp;&nbsp;ab网站压力测试命令来测试一下性能</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;1.测试一下Nginx&nbsp;处理静态页面的性能</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ab&nbsp;-c&nbsp;100&nbsp;-n&nbsp;1000&nbsp;http://192.168.74.129/index.html</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个表示同时处理100个请求并运行1000次index.html文件,如图所示：</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; &nbsp;<img src="http://www.itnose.net/img/20141210/10173054.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡5" style="border: 0px; max-width: 720px;" /></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp;2.测试一下Tomcat处理静态页面的性能</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ab&nbsp;-c&nbsp;100&nbsp;-n&nbsp;1000&nbsp;http://192.168.74.129:8081/index.html</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个表示同时处理100个请求并运行1000次index.html文件,如图所示：</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; &nbsp;<img src="http://www.itnose.net/img/20141210/10173055.png" alt="Nginx 与Tomcat 实现动静态分离、负载均衡6" style="border: 0px; max-width: 720px;" /></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp;相同的处理静态文件，Nginx处理的静态性能比Tomcat&nbsp;好。Nginx每秒能请求5388次，而tomcat只请求2609次。</p><p style="margin: 0px 0px 10px; padding: 0px;"><br /></p><p style="margin: 0px 0px 10px; padding: 0px;">总结：我们在Nginx配置文件中，配置静态交给Nginx处理，动态请求交给Tomcat，提供了性能。</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>四．Nginx&nbsp;+Tomcat&nbsp;负载均衡与容错</strong></p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; 我们在高并发的情况下，为了提高服务器的性能，减少了单台服务器的并发压力，我们采用了集群部署，还能解决为了避免单台服务器挂掉，服务不能访问这种情况下，处理容错问题。</p><p style="margin: 0px 0px 10px; padding: 0px;"><br /></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp;第一步：我们这边部署了两天tomcat服务器，192.168.74.129:8081和192.168.74.129:8082</strong></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong><br /></strong></p><p style="margin: 0px 0px 10px; padding: 0px;"><strong>&nbsp;第二步：Nginx作为了代理服务器，客服端请求服务器端时，采用了负载均衡来处理，这样就能平均的把客服端请求分发到每一天服务器，这样减少服务器端的压力。配置Nginx下的nginx.conf文件。</strong></p>&nbsp; &nbsp;<p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; #vi&nbsp;/usr/local/nginx/conf/nginx.conf</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp;&nbsp;</p><pre name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 10px; margin-bottom: 10px; padding: 5px; font-family: 'Courier New', Arial; font-size: 10pt; border-color: #dddddd #dddddd #dddddd #6ce26c; border-style: solid; border-width: 1px 1px 1px 4px; border-image-source: none; background-image: none; background-attachment: scroll; background-color: #f6f6f6; line-height: 18px; background-position: 0px 0px; background-repeat: repeat repeat;">#user  nobody; worker_processes  1; error_log  logs/error.log; pid       logs/nginx.pid;  events {     use epoll;     worker_connections  1024; }   http {     include       mime.types;     default_type  application/octet-stream;     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';      access_log  logs/access.log  main;     sendfile        on; keepalive_timeout  65; gzip on;   gzip_min_length  1k;   gzip_buffers     4  16k;   gzip_http_version 1.0;   gzip_comp_level 2;   gzip_types  text/plain application/x-javascript text/css application/xml;   gzip_vary on;   &lt;span style="color:#ff0000;"&gt;upstream localhost_server {         ip_hash;         server 192.168.74.129:8081;         server 192.168.74.129:8082;     }&lt;/span&gt;      server {         listen       80 default;         server_name  localhost;        &lt;span style="color:#ff0000;"&gt;  location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx处理静态页面&lt;/span&gt;              {                    root   /usr/tomcat/apache-tomcat-8081/webapps/ROOT;                     expires      30d; //缓存到客户端30天                }          error_page  404              /404.html;          #redirect server error pages to the static page /50x.html                  error_page   500 502 503 504  /50x.html;         location = /50x.html {             root   html;         }           &lt;span style="color:#ff0000;"&gt;location ~  \.(jsp|do)$  {//所有jsp的动态请求都交给Tomcat处理 &lt;/span&gt;            &lt;span style="color:#ff0000;"&gt;proxy_pass http://localhost_server;  //来自jsp或者do的后缀的请求交给tomcat处理&lt;/span&gt;             proxy_redirect off;             proxy_set_header Host $host;    //后端的Web服务器可以通过X-Forwarded-For获取用户真实IP             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;   //nginx跟后端服务器连接超时时间              proxy_read_timeout 90;     //连接成功后，后端服务器响应时间              proxy_buffer_size 4k;      //设置代理服务器（nginx）保存用户头信息的缓冲区大小              proxy_buffers  6  32k;       //proxy_buffers缓冲区，网页平均在32k以下的话，这样设置             proxy_busy_buffers_size 64k;//高负荷下缓冲大小（proxy_buffers*2）            proxy_temp_file_write_size 64k; //设定缓存文件夹大小，大于这个值，将从upstream服务器传         }            }    }</pre><p style="margin: 0px 0px 10px; padding: 0px;"></p><p style="margin: 0px 0px 10px; padding: 0px;"><br /></p><p style="margin: 0px 0px 10px; padding: 0px;">说明：</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;&nbsp;&nbsp;1.upstream&nbsp;中的server是指向服务器的IP（域名）和端口，后面还可以带参数</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; &nbsp;1)weight&nbsp;：设置服务器的转发权重&nbsp;默认值是1。</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; &nbsp;2)max_fails&nbsp;：&nbsp;是与fail_timeout配合使用，是指在fail_timeout时间段内，如果服务器转发失败次数超过max_fails设置的值，这台服务器就不 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 可用，max_fails默认值是1</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 3)fail_timeout&nbsp;:表示在该时间段内转发失败多少次就认为这台服务器不能用。</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; 4)down：表示这台服务器不能用。</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; &nbsp; &nbsp;5)backup：表示使ip_hash设置的针对这台服务器无效，只有在所有非备份的服务器都失效后，才会向服务器转发请求。</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp;</p><p style="margin: 0px 0px 10px; padding: 0px;">&nbsp; 2.ip_hash&nbsp;设置是在集群的服务器中，如果同一个客户端请求转发到多个服务器上，每台服务器可能缓存同一份信息，这会造成资源的浪费，采用的ip_hash设置会把同一个客户端第二次请求相同的信息时，会转发到第一次请求的服务器端。但ip_hash不能和weight&nbsp;同时使用。</p></div></div><img src ="http://www.blogjava.net/jlin/aggbug/422635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jlin/" target="_blank">fly</a> 2015-02-01 23:18 <a href="http://www.blogjava.net/jlin/archive/2015/02/01/422635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>