Loading... <h1 id="apache-httpd负载均衡tomcat并实现session-sticky和session-cluster" style="font-size: 2.6em;margin: 1.2em 0px 0.6em;font-family: inherit;line-height: 1.1;color: inherit">Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster</h1> <hr /> <p></p> <ul class=" list-paddingleft-2"> <li> <p></p> </li> <li> <p>前言</p> </li> <li> <p>实验拓扑</p> </li> <li> <p>实验步骤</p> </li> <ul class=" list-paddingleft-2"> <li> <p>安装配置tomcat</p> </li> <li> <p>安装配置Apache Httpd并测试</p> </li> <li> <p>实现session sticky</p> </li> <li> <p>实现Session Cluster</p> </li> </ul> <li> <p>总结</p> </li> </ul> <h2 id="前言" style="font-family: inherit;line-height: 1.1;color: inherit;margin: 1.2em 0px 0.6em;font-size: 2.15em">前言</h2> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">上篇文章我们介绍如何构建一个</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">LANMT</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">平台并搭建一个</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">jspxcms</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">, 这次我们介绍使用</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">apache httpd</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">负载均衡</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Tomcat</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">并实现</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Session Sticky</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">和</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Session Cluster</span></code></p> </blockquote> <h2 id="实验拓扑" style="font-family: inherit;line-height: 1.1;color: inherit;margin: 1.2em 0px 0.6em;font-size: 2.15em">实验拓扑</h2> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><img src="//cto.wang/usr/uploads/2016/07/20160703161833-64.png" title="1461310744502495.png" alt="blob.png" /></p> <h2 id="实验步骤" style="font-family: inherit;line-height: 1.1;color: inherit;margin: 1.2em 0px 0.6em;font-size: 2.15em">实验步骤</h2> <h3 id="安装配置tomcat" style="font-family: inherit;line-height: 1.6;color: inherit;margin: 1.2em 0px 0.6em;font-size: 1.7em">安装配置tomcat</h3> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">我们首先配置</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Tomcat</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">, 安装过程这里不做叙述, 不明白的可以看我上篇博客: </span><span style="font-family: 黑体, SimHei;font-size: 16px">tomcat基础进阶</span></p> </blockquote> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">安装<code>Tomcat</code>,<code>node2,3</code>都要操作</strong></p> <pre class="prettyprint hljs-light"><code class="hljs crystal">[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># [root@node1 ~]# wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.33/bin/apache-tomcat-8.0.33.tar.gz</span><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># tar xf apache-tomcat-8.0.33.tar.gz -C /usr/local/</span><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># cd /usr/local ; ln -sv apache-tomcat-8.0.33 tomcat ; cd ~</span><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># wget http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-linux-x64.rpm #如果下载出错, 使用浏览器下载</span><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># rpm -ivh jdk-8u77-linux-x64.rpm #安装JDK</span><br /><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># vim /etc/profile.d/java.sh #定义JAVA_HOME</span><br />export <span class="hljs-constant">JAVA_HOME</span>=<span class="hljs-regexp">/usr/java</span><span class="hljs-regexp">/latest<br />export PATH=$JAVA_HOME/bin</span>:<span class="hljs-variable" style="line-height: 1.6">$PATH</span><br /><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># vim /etc/profile.d/tomcat.sh #配置tomcat的环境变量</span><br />export <span class="hljs-constant">CATALINA_BASE</span>=<span class="hljs-regexp">/usr/local</span><span class="hljs-regexp">/tomcat<br />export PATH=$CATALINA_BASE/bin</span>:<span class="hljs-variable" style="line-height: 1.6">$PATH</span><br /><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># source /etc/profile.d/tomcat.sh</span><br />[root<span class="hljs-variable" style="line-height: 1.6">@node1</span> ~]<span class="hljs-comment"># source /etc/profile.d/java.sh</span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">配置虚拟主机</strong></p> <pre class="prettyprint hljs-light"><code class="hljs perl">[root<span class="hljs-variable" style="line-height: 1.6">@node2</span> ~]<span class="hljs-comment"># vim /usr/local/tomcat/conf/server.xml </span><br /><br /><span class="hljs-comment">#设置默认虚拟主机为web1.anyisalin.com #node3的jvmRoute设置为TomcatB</span><br /><Engine name=<span class="hljs-string">"Catalina"</span> defaultHost=<span class="hljs-string">"web1.anyisalin.com"</span> jvmRoute=<span class="hljs-string">"TomcatA"</span>> <br /><br /><br /><span class="hljs-comment">#添加虚拟主机</span><br /><Host name=<span class="hljs-string">"web1.anyisalin.com"</span> appBase=<span class="hljs-string">"/data/webapps/"</span> unpackWARS=<span class="hljs-string">"true"</span> autoDeploy=<span class="hljs-string">"true"</span>><br /> <Context path=<span class="hljs-string">""</span> docBase=<span class="hljs-string">"/data/webapps"</span> reloadable=<span class="hljs-string">"true"</span> /><br /> <Valve className=<span class="hljs-string">"org.apache.catalina.valves.AccessLogValve"</span> directory=<span class="hljs-string">"/data/logs"</span><br /> prefix=<span class="hljs-string">"web1_access_log."</span> suffix=<span class="hljs-string">".txt"</span><br /> pattern=<span class="hljs-string">"<span class="hljs-variable" style="line-height: 1.6">%h</span> <span class="hljs-variable" style="line-height: 1.6">%l</span> <span class="hljs-variable" style="line-height: 1.6">%u</span> <span class="hljs-variable" style="line-height: 1.6">%t</span> &quot;<span class="hljs-variable" style="line-height: 1.6">%r</span>&quot; <span class="hljs-variable" style="line-height: 1.6">%s</span> <span class="hljs-variable" style="line-height: 1.6">%b</span>"</span> /><br /><<span class="hljs-regexp">/Host><br /><br />[root@node2 ~]# mkdir -PV /data</span><span class="hljs-regexp">/webapps/</span>{WEB-INF,META-INF,classes,lib} <span class="hljs-comment">#创建目录</span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6"><code>node2</code>创建网页文件</strong></p> <pre class="prettyprint hljs-light"><code class="hljs erb"><span class="xml" style="line-height: 1.6">[root@node2 ~]# cd /data/webapps/<br /><br />[root@node2 ~]# vim index.jsp #创建网页文件<br /></span><%<span class="ruby" style="line-height: 1.6">@ page language=<span class="hljs-string">"java"</span> </span>%><span class="xml" style="line-height: 1.6"><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">html</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">head</span>></span><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">title</span>></span>TomcatA<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">title</span>></span><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">head</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">body</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">h1</span>></span><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">font</span> <span class="hljs-attribute" style="line-height: 1.6">color</span>=<span class="hljs-value">"red"</span>></span>TomcatA.magedu.com<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">font</span>></span><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">h1</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">table</span> <span class="hljs-attribute" style="line-height: 1.6">align</span>=<span class="hljs-value">"centre"</span> <span class="hljs-attribute" style="line-height: 1.6">border</span>=<span class="hljs-value">"1"</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span>Session ID<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> </span><%<span class="ruby" style="line-height: 1.6"> session.setAttribute(<span class="hljs-string">"magedu.com"</span>,<span class="hljs-string">"magedu.com"</span>); </span>%><span class="xml" style="line-height: 1.6"><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span></span><%=<span class="ruby" style="line-height: 1.6"> session.getId() </span>%><span class="xml" style="line-height: 1.6"><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span>Created on<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span></span><%=<span class="ruby" style="line-height: 1.6"> session.getCreationTime() </span>%><span class="xml" style="line-height: 1.6"><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">table</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">body</span>></span><br /><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">html</span>></span><br /><br />[root@node2 webapps]# catalina.sh start #启动tomcat</span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6"><code>node3</code>创建网页文件</strong></p> <pre class="prettyprint hljs-light"><code class="hljs erb"><span class="xml" style="line-height: 1.6">[root@node3 ~]# cd /data/webapps/<br /><br />[root@node3 ~]# vim index.jsp #创建网页文件<br /></span><%<span class="ruby" style="line-height: 1.6">@ page language=<span class="hljs-string">"java"</span> </span>%><span class="xml" style="line-height: 1.6"><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">html</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">head</span>></span><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">title</span>></span>TomcatB<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">title</span>></span><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">head</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">body</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">h1</span>></span><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">font</span> <span class="hljs-attribute" style="line-height: 1.6">color</span>=<span class="hljs-value">"blue"</span>></span>TomcatB.magedu.com<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">font</span>></span><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">h1</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">table</span> <span class="hljs-attribute" style="line-height: 1.6">align</span>=<span class="hljs-value">"centre"</span> <span class="hljs-attribute" style="line-height: 1.6">border</span>=<span class="hljs-value">"1"</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span>Session ID<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> </span><%<span class="ruby" style="line-height: 1.6"> session.setAttribute(<span class="hljs-string">"magedu.com"</span>,<span class="hljs-string">"magedu.com"</span>); </span>%><span class="xml" style="line-height: 1.6"><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span></span><%=<span class="ruby" style="line-height: 1.6"> session.getId() </span>%><span class="xml" style="line-height: 1.6"><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span>Created on<span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span></span><%=<span class="ruby" style="line-height: 1.6"> session.getCreationTime() </span>%><span class="xml" style="line-height: 1.6"><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">td</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">tr</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">table</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">body</span>></span><br /><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">html</span>></span><br /><br />[root@node3 webapps]# catalina.sh start #启动tomcat</span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">访问测试</strong></p> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><img src="//cto.wang/usr/uploads/2016/07/20160703161834-9.png" title="1461310753102538.png" alt="blob.png" /></p> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><img src="//cto.wang/usr/uploads/2016/07/20160703161834-78.png" title="1461310757338635.png" alt="blob.png" /></p> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"></p> <h3 id="安装配置apache-httpd并测试" style="font-family: inherit;line-height: 1.6;color: inherit;margin: 1.2em 0px 0.6em;font-size: 1.7em">安装配置Apache Httpd并测试</h3> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">安装<code>httpd</code> 在<code>node1</code></strong></p> <pre class="prettyprint hljs-light"><code class="hljs autoit">[root<span class="hljs-constant">@node1</span> ~]<span class="hljs-preprocessor"># yum install httpd -y</span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">配置<code>httpd</code></strong> <br /><code>mod_Proxy_balancer</code>模块文档</p> <pre class="prettyprint hljs-light"><code class="hljs stata">[root@node1 ~]# <span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">cd</span> /etc/httpd/<span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">conf</span>.<span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">d</span>/<br /><br />[root@node1 <span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">conf</span>.<span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">d</span>]# vim virt.<span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">conf</span> <br /><Proxy balancer:<span class="hljs-comment">//lbcluster></span><br /> BalancerMember ajp:<span class="hljs-comment">//172.16.1.3:8009 loadfactor=1 route=TomcatA</span><br /> BalancerMember ajp:<span class="hljs-comment">//172.16.1.4:8009 loadfactor=1 route=TomcatB</span><br /></Proxy><br /><br /><VirtualHost *:80><br /> ServerName www.anyisalin.com<br /> ProxyVia <span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">On</span><br /> ProxyRequests Off<br /> ProxyPassReverse / balancer:<span class="hljs-comment">//lbcluster/</span><br /> ProxyPass / balancer:<span class="hljs-comment">//lbcluster/</span><br /></VirtualHost><br /><br />[root@node1 <span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">conf</span>.<span class="hljs-keyword" style="line-height: 1.6;font-weight: bold">d</span>]# service httpd start #启动httpd<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">测试负载均衡效果</strong></p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703161834-34.gif" title="1461310792874371.gif" /></p> <p></p> <p></p> <h3 id="实现session-sticky" style="font-family: inherit;line-height: 1.6;color: inherit;margin: 1.2em 0px 0.6em;font-size: 1.7em">实现session sticky</h3> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">如果</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">tomcat</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">运行着一个动态站点, 那么上面这种</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">byrequest</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的负载均衡调度算法就有很大问题了, 可能刚登录站点再刷新又回到没有登录的状态了, 所以我们就要实现</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session sticky</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">, 其实</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session sticky</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">就是我们之前</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">lvs</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的sh算法, 和</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">nginx</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">ip_hash</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">实现的效果</span></p> </blockquote> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">编辑<code>httpd</code>配置文件</strong></p> <pre class="prettyprint hljs-light"><code class="hljs sqf">[root@node1 ~]<span class="hljs-preprocessor"># vim /etc/httpd/conf.d/virt.conf </span><br /><span class="hljs-preprocessor">## 主要添加两段参数</span><br /><span class="hljs-preprocessor">##Header add Set-Cookie <span class="hljs-string" style="line-height: 1.6">"ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"</span> env=BALANCER_ROUTE_CHANGED</span><br /><span class="hljs-preprocessor">##ProxySet stickysession=ROUTEID </span><br /><br />Header add <span class="hljs-built_in" style="line-height: 1.6;font-weight: bold">Set</span>-Cookie <span class="hljs-string">"ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"</span> env=BALANCER_ROUTE_CHANGED <span class="hljs-preprocessor">#新添加的</span><br /><Proxy balancer:<span class="hljs-comment">//lbcluster></span><br /> BalancerMember ajp:<span class="hljs-comment">//172.16.1.3:8009 loadfactor=1 route=TomcatA</span><br /> BalancerMember ajp:<span class="hljs-comment">//172.16.1.4:8009 loadfactor=1 route=TomcatB</span><br /> ProxySet stickysession=ROUTEID <span class="hljs-preprocessor">#新添加的</span><br /></Proxy><br /><br /><VirtualHost *:<span class="hljs-number">80</span>><br /> <span class="hljs-built_in" style="line-height: 1.6;font-weight: bold">ServerName</span> www.anyisalin.com<br /> ProxyVia On<br /> ProxyRequests Off<br /> ProxyPassReverse / balancer:<span class="hljs-comment">//lbcluster/</span><br /> ProxyPass / balancer:<span class="hljs-comment">//lbcluster/</span><br /></VirtualHost><br /><br />[root@node1 conf.d]<span class="hljs-preprocessor"># service httpd restart #重启httpd</span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">测试<code>session sticky</code>效果</strong> <br /><strong>如下图, 我们成功的将session绑定在了</strong><code>TomcatA(Node2)</code><strong>主机上</strong></p> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><img src="//cto.wang/usr/uploads/2016/07/20160703161834-32.gif" title="1461310792920498.gif" /></p> <h3 id="实现session-cluster" style="font-family: inherit;line-height: 1.6;color: inherit;margin: 1.2em 0px 0.6em;font-size: 1.7em">实现Session Cluster</h3> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">我们使用</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session sticky</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">会有很多问题, 如果某台主机宕机了, 那么用户的session就丢失了, 所以我们还可以通过</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session cluster</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">保存用户会话</span></p> </blockquote> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">什么是<code>Session Cluster</code></strong></p> <blockquote><p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-size: 16px;font-family: 黑体, SimHei">正常情况下</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">session</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">信息是保存在用户所访问的服务器上,服务器宕机, 用户的</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">session</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">就丢失了, 但是我们可以通过</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">session cluster</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">的方式来实现将用户的</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">session</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">信息保存在后端所有的服务器上, 这样来, 无论用户在访问哪一台服务器,</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">session</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">都不会丢失</span></p> </blockquote> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">四种常见的<code>session manager</code></strong></p> <blockquote><ul style="line-height: 1.6" class=" list-paddingleft-2"> <li> <p><span style="font-family: 黑体, SimHei;font-size: 16px">StandardManager</span></p> </li> <li> <p><span style="font-family: 黑体, SimHei;font-size: 16px">PersistentManager: 可以将</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">信息保存在持久存储中</span></p> </li> <li> <p><span style="font-family: 黑体, SimHei;font-size: 16px">DeltaManager: 将</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">信息通过多播的形式共享到其他节点</span></p> </li> <li> <p><span style="font-family: 黑体, SimHei;font-size: 16px">BackupManager: 将</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">信息共享到特定的一个节点上</span></p> </li> </ul> </blockquote> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">注意: 我们要删掉刚才对<code>session sticky</code>的配置</strong></p> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">编辑<code>tomcat</code>作配置文件</strong></p> <pre class="prettyprint hljs-light"><code class="hljs xml">[root@node2 conf]# vim server.xml<br />下列内容放在<span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Host</span> /></span>内<br /><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Cluster</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.ha.tcp.SimpleTcpCluster"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">channelSendOptions</span>=<span class="hljs-value">"8"</span>></span><br /><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Manager</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.ha.session.DeltaManager"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">expireSessionsOnShutdown</span>=<span class="hljs-value">"false"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">notifyListenersOnReplication</span>=<span class="hljs-value">"true"</span>/></span><br /><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Channel</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.group.GroupChannel"</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Membership</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.membership.McastService"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">address</span>=<span class="hljs-value">"228.0.1.7"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">port</span>=<span class="hljs-value">"45564"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">frequency</span>=<span class="hljs-value">"500"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">dropTime</span>=<span class="hljs-value">"3000"</span>/></span><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Receiver</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.transport.nio.NioReceiver"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">address</span>=<span class="hljs-value">"auto"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">port</span>=<span class="hljs-value">"4000"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">autoBind</span>=<span class="hljs-value">"100"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">selectorTimeout</span>=<span class="hljs-value">"5000"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">maxThreads</span>=<span class="hljs-value">"6"</span>/></span><br /><br /><span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Sender</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.transport.ReplicationTransmitter"</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Transport</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.transport.nio.PooledParallelSender"</span>/></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Sender</span>></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Interceptor</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"</span>/></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Interceptor</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"</span>/></span><br /> <span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Channel</span>></span><br /><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Valve</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.ha.tcp.ReplicationValve"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">filter</span>=<span class="hljs-value">""</span>/></span><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Valve</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.ha.session.JvmRouteBinderValve"</span>/></span><br /><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Deployer</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.ha.deploy.FarmWarDeployer"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">tempDir</span>=<span class="hljs-value">"/tmp/war-temp/"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">deployDir</span>=<span class="hljs-value">"/tmp/war-deploy/"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">watchDir</span>=<span class="hljs-value">"/tmp/war-listen/"</span><br /> <span class="hljs-attribute" style="line-height: 1.6">watchEnabled</span>=<span class="hljs-value">"false"</span>/></span><br /><br /> <span class="hljs-tag" style="line-height: 1.6"><<span class="hljs-title" style="line-height: 1.6;font-weight: bold">ClusterListener</span> <span class="hljs-attribute" style="line-height: 1.6">className</span>=<span class="hljs-value">"org.apache.catalina.ha.session.ClusterSessionListener"</span>/></span><br /><span class="hljs-tag" style="line-height: 1.6"></<span class="hljs-title" style="line-height: 1.6;font-weight: bold">Cluster</span>></span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6">配置<code>WEB-INF</code>中的<code>web.xml</code>文件</strong></p> <pre class="prettyprint hljs-light"><code class="hljs autoit">[root<span class="hljs-constant">@node2</span> conf]<span class="hljs-preprocessor"># cd /data/webapps/</span><br />[root<span class="hljs-constant">@node2</span> webapps]<span class="hljs-preprocessor"># cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml WEB-INF/ #拷贝一份模板</span><br />[root<span class="hljs-constant">@node2</span> webapps]<span class="hljs-preprocessor"># vim WEB-INF/web.xml</span><br /><span class="hljs-preprocessor">#添加下面这一行,在</web-app>内</span><br /><distributable/><br /><br /><span class="hljs-preprocessor">##注意: 这里是node3</span><br />[root<span class="hljs-constant">@node3</span> webapps]<span class="hljs-preprocessor"># scp node2.anyisalin.com:/usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml #复制node2配置文件</span><br />[root<span class="hljs-constant">@node3</span> webapps]<span class="hljs-preprocessor"># scp node2.anyisalin.com:/data/webapps/WEB-INF/web.xml /data/webapps/WEB-INF/ </span><br /><br />[root<span class="hljs-constant">@node2</span> webapps]<span class="hljs-preprocessor"># catalina.sh stop #重启tomcat</span><br />[root<span class="hljs-constant">@node2</span> webapps]<span class="hljs-preprocessor"># catalina.sh start </span><br /><br />[root<span class="hljs-constant">@node3</span> webapps]<span class="hljs-preprocessor"># catalina.sh stop #重启tomcat</span><br />[root<span class="hljs-constant">@node3</span> webapps]<span class="hljs-preprocessor"># catalina.sh start </span><br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><strong style="line-height: 1.6"><code>session cluster</code>测试</strong> <br /><strong>如下图, 现在我们即使使用</strong><code>byrequests</code><strong>算法也不会丢失</strong><code>sesssion</code></p> <p style="margin-top: 0px;margin-bottom: 1.1em;line-height: 1.6"><img src="//cto.wang/usr/uploads/2016/07/20160703161834-90.gif" title="1461310792997334.gif" /></p> <h2 id="总结" style="font-family: inherit;line-height: 1.1;color: inherit;margin: 1.2em 0px 0.6em;font-size: 2.15em">总结</h2> <blockquote><p style="margin-top: 0px;margin-bottom: 1.1em;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">我们本文实现了</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">tomcat</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的负载均衡和</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">保持的各种方法, 但是还是有很大问题, 我们试想在用户并发高的场景下, 多台</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">tomcat</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">服务器一直在多播, 很可能造成网络拥塞, 所以我们还有一种解决方案</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session server</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">, 使用单台服务器保存用户的</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">session</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">信息, 我们会在下篇文章向大家介绍!</span></p> <p style="margin-top: 0px;margin-bottom: 0px;font-size: 1em;line-height: 1.6"><span style="font-family: 黑体, SimHei;font-size: 16px">作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~ <br />作者: AnyISaIln QQ: 1449472454 <br />感谢: MageEdu</span></p> </blockquote> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信