• 企业——nginx+tomcat+memcache


    MemCache在tomcat中的负载均衡和session交叉存放

      Nginx是一个高性能的 HTTP 和 反向代理 服务器,本文讲述的是简单的 nginx+tomcat+memcache 实现的负载均衡和session共享。其中用memcache来存储session,tomcat作为servlet容器,nginx作为tomcat代理,对外接口。这个时候只要保证memcache服务器不停,tomcat之间可以任意热插拔。实现了session的独立存储,需要的话,还可以存储到数据库或者文件中,也不用考虑是否使用黏性session。

      Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

      诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

     

      使用nginx作为前端服务器来实现tomcat负载均衡及高可用,同时基于jsp的动态特征,我们将引入memcache来保持网页在连接过程中的session保持,利用memcached把多个tomcat的session集中管理。当memcached有两个时可以采用交叉存储,可以更好的避免单点故障。

          

    实验环境:

      172.25.254.1  tomcat服务器(用于负载均衡)

      172.25.254.2  nginx反向代理服务器、tomcat服务器(用于负载均衡)

      172.25.254.3  memcache   server1的 (用来存储session信息,和客户端输入的信息)

      172.25.254.4  memcache   server2的 (用来存储session信息,和客户端输入的信息)

      172.25.254.5  client(用于做测试)

     

    一.java环境的配置

    1.jdk的安装

       注意:tomcat要在java环境下 安装jdk(java必须要的)编写一个test脚本,检测

       tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/  ## tar解压命令中 -C是指解压到指定的路径下

       cd /usr/local/

       ls

       ln -s jdk1.7.0_79/ java  ####做软连接,升级的时候只升级软连接,较为方便

       cd java/

       ls  ##查看软连接

    2.添加java的环境变量

       vim /etc/profile   ## 配置java的环境变量

             export JAVA_HOME=/usr/local/java

             export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

             export PATH=$PATH:$JAVA_HOME/bin

       source /etc/profile   ##重新加载配置文件

    3.检测jdk环境是否正确

       cd ~

       vim test.java

             public class test {

             public static void main(String[] args)

             {

                    System.out.println("Hello World!");

             }

             }

           

       javac test.java      ##编译生成可执行文件

       java test   ##运行编写的java脚本

           

    二.apache-tomcat的安装及其负载均衡的实现

    1.下载安装包并指定解压到相应的路径下

       tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/

       cd /usr/local/

       ln -s apache-tomcat-7.0.37/  tomcat

    2.开启tomcat服务

       cd tomcat/

       bin/startup.sh        ##开启服务

       netstat -antlp | grep 8080

       cd webapps/

       cd ROOT/

       pwd

       /usr/local/tomcat/webapps/ROOT  ##这里是tomcat的发布页面的默认路径

    3.测试页面:

          

      

    4.编译相应的配置文件

      cd /usr/local/openresty/nginx/conf/

      vim nginx.conf
           location ~ .jsp$ {
           proxy_pass http://172.25.254.2:8080;
           }

      pwd
        /usr/local/openresty/nginx/sbin
      ./nginx -s reload

          

    5.进入nginx(用作反向代理)的发布目录,测试tomcat是否安装正确

      pwd
        /usr/local/openresty/nginx/html
      ls
        50x.html example.php index.html index.php
       vim index.jsp
        1 the time is:<%=new java.util.Date() %>

          

    6.打开两台虚拟机,用作负载均衡(这两个虚拟机就是tomcat的两个服务器)

     (1)将已经配置好的服务器上的配置文件 scp到另一台没有配置的服务器上。  tomcat(之间信息不共享)和jdk的压缩包

      scp -r root@172.25.254.1:/usr/local/tomcat  /usr/local    ##tomcat的配置文件

      scp -r root@172.25.254.1:/usr/local/java  /usr/local    ##tomcat需要的Java的环境

      (2)在另一台虚拟机上,配置相应的配置(java的环境变量)。

     cd /usr/local

       ls

       ln -s jdk1.7.0_79/  java

       ln -s apachecd-tomcat-7.0.37/  tomcat

     vim /etc/profile
      80 export JAVA_HOME=/usr/local/java
      81 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
      82 export PATH=$PATH:$JAVA_HOME/bin
     source /etc/profile    ##重新加载环境变量

     

    7.先打开之前的虚拟机,打开nginx,并测试之前的tomcat的测试页面是否能用

       cd /usr/local/ 

       cd tomcat/

       bin/startup.sh      ##开启tomcat服务

    8.测试:

     打开页面 172.25.254.2/test.jsp    ##查看新添加的服务器的tomcat是否能用

           

    9.编辑nginx的配置文件,添加负载均衡的主机

     cd /usr/local/openresty/nginx/conf/
     vim nginx.conf
      17 http {
      18 upstream tomcat{    ## tomcat的负载均衡的配置
      19 server 172.25.254.1:8080;    ##后端服务器之一
      20 server 172.25.254.2:8080;    ##后端服务器之一
      21 }

      72 location ~ .jsp$ {    ##如果访问的页面,是以 .jsp结尾的,就去访问 //tomcat的默认的发布页面
      73 proxy_pass http://tomcat;    ##这个就是上面的那就话的相应的设置
      74 }


      添加相应的注释:
      54 #location /memc {
      55 # internal;
      56 # memc_connect_timeout 100ms;
      57 # memc_send_timeout 100ms;
      58 # memc_read_timeout 100ms;
      59 # set $memc_key $query_string;
      60 # set $memc_exptime 300;
      61 # memc_pass memcache;
      62 #}

      78 location ~ .php$ {
      79 # set $key $uri$args;
      80 # srcache_fetch GET /memc $key;
      81 # srcache_store PUT /memc $key;

     cd /usr/local/openresty/nginx/sbin/
     ./nginx -t    ## nginx进行配置文件的语法检测,查看是否有语法错误
     ./nginx -s reload    ## 重启nginx

    10.编写两个服务器的测试页面的内容

     cd /usr/local/tomcat/webapps/ROOT/  ##server1的测试页面

     vim test.jsp
      server1 the time is:<%=new java.util.Date() %>

     cd /usr/local/tomcat/webapps/ROOT/  ##server2的测试页面
     vim test.jsp
      server2 the time is:<%=new java.util.Date() %>

    11.测试:

      在client输入: 172.25.254.2:8080  ##会出现 tomcat 图形界面

          

      在client输入:172.25.254.2/test.jsp  ##在不断的进行刷新,就会出现负载均衡的效果。

          

          

    三.tomcat下的session共享(通过memcache实现)

    1.什么是session?

     在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

    2.为什么要使用session?

     为了对数据的保存更加牢靠,我们选择交叉存放session的方法,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中,这样存放,当某个tomcat服务断了之后,访问它的客户session并不会消失,而是存放在了对立的memcache,如果存放session的memcache坏了,那么它的数据会立即切换到另一个memcached中

    3.session和cookie的区别是什么?

     (1)session存储在服务器端,而cookie存储在浏览器中。

     (2)session可以存储任何形式的文件,而cookie只能存储ASCII码。

     (3)session因为存储在服务器端,因此安全。cookie因为存储在浏览器中,有的软件或者程序会读取用户的cookie值,有可能会进行cookie欺骗,因此不安全。

     (4)session因为存储在服务器端,当处在并发量大的时候,因为服务器上的session存储太多,会占用大量的内存,会影响服务器的性能。因为cookie存储在浏览器中,不会占用服务器中的内存,在高并发的情况下,也不会影响服务器的性能。

     (5)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

     (6)服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。

     注意: nginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式,所谓 sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。

    4.重新编写 tomcat 默认的发布页面的文件信息

       cd /usr/local/tomcat/webapps/ROOT/

       ls

       vim test.jsp

             vge contentType="text/html; charset=GBK" %>

             <%@ page import="java.util.*" %>

             <html><head><title>Cluster App Test</title></head>

             <body>

             Server Info:

             <%

             out.println(request.getLocalAddr() + " : " +                request.getLocalPort()+"<br>");%>

             <%

             out.println("<br> ID " + session.getId()+"<br>");

             String dataName = request.getParameter("dataName");

             if (dataName != null && dataName.length() > 0) {

             String dataValue = request.getParameter                    ("dataValue");

             session.setAttribute(dataName, dataValue);

             }

             out.print("<b>Session list</b>");

             Enumeration e = session.getAttributeNames();

             while (e.hasMoreElements()) {

             String name = (String)e.nextElement();

             String value = session.getAttribute(name).toString();

             out.println( name + " = " + value+"<br>");

             System.out.println( name + " = " + value);

             }

             %>

             <form action="test.jsp" method="POST">

             name:<input type=text size=20 name="dataName">

             <br>

             key:<input type=text size=20 name="dataValue">

             <br>

             <input type=submit>

             </form>

             </body>

             </html>

           

          

       scp test.jsp root@172.25.11.1:/usr/local/tomcat/webapps/ROOT     ## 两个 tomcat 服务器上都做相应的更改

    5.测试:

       在浏览器中分别输入:172.25.254.2/test.jsp   

          

     注意:测试的时候发现,每次提交新的用户信息,server info 和 ID 都会改变,且新的数据就会覆盖旧的数据内容。

    6.同一个web界面(同一个用户)存储的数据,存储在同一个服务器上,不会在两个服务器之间跳转 

    (1)安装sticky粘滞

     tar zxf nginx-1.10.1.tar.gz

     tar zxf nginx-sticky-module-ng.tar.gz

    (2)编辑nginx的配置信息,和上面的配置信息相同,只是在 upstream 内添加 sticky; 即可。

     cd  /usr/local/nginx/conf

     vim nginx.conf

      17 http {
      18 upstream tomcat{
      19 sticky;      ##与之前的 nginx 的配置文件不同之处是:添加了这一行
      20 server 172.25.254.1:8080;
      21 server 172.25.254.2:8080;
      22 }
      23 include mime.types;
      24 default_type application/octet-stream;

    (3)重启服务

     cd /usr/local/lnmp/nginx/sbin/

     ./nginx -t
     ./nginx

    (4)测试:

     在网页页面输入:172.25.254.2/test.jsp  ##在同一个页面(不刷新的情况下),用户存入服务器的信息不会像上面一样,提交一次换一个服务器,保存在了同一个服务器上。

    7.实现memcache的交叉存储的功能

    ####   先查看没有配置交叉存储时,memcache的工作方式:####

    (1)为了查看清楚将 server2 的日志文件先清空

     cd /usr/local/tomcat/logs/
     > catalina.out

    (2)先测试一下没有实现交叉存储的实验结果

      在网页的页面上输入:172.25.254.2/index.jsp

      在测试页面输入需要存储的用户信息,如:user1/2/3/4    123/234/345/456

    (3)人为的将 server1 的服务器down掉

     pwd

       /usr/local/tomcat/bin
     ./shutdown.sh

    (4)查看 server2 上的日志文件

     首先,先关闭 server1 的服务器,防止在查看数据信息的时候用户的写入导致用户存储的信息丢失。

     然后,查看日志信息  cat  /usr/local/tomcat/logs/catalina.out  tail -f catalina.out   ##发现2中没有将之前的信息缓存过来

     最后,得出结论是,在没有修改memcache的配置文件的情况下,memcache没有实现交叉存储,而是将自己的信息存在了自己的memcache上。当某一个tomcat服务器down机之后,另一台服务器是拿不到down机的服务器保存的信息的,这样的情况在生产中是不可以的。

    ####   然后现在开始配置memcache的相关的配置文件:####

    (1)给负载均衡上安装memcache  (给两个服务器都配置一个memcache)

      yum install memcached -y

    (2)在两个虚拟机上都开启memcache

        /etc/init.d/memcached start

    (3)编译tomcat和memcache有关的文件

       cd /usr/local/tomcat/conf

       vim context.xml

      <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"

                                     ##需要添加一些jar包,库函数的包

      memcachedNodes="n1:172.25.254.1:11211,n2:172.25.254.2:11211"

                                   ##两个服务器的 IP 分别设置为n1,n2

      failoverNodes="n1"       ##出现故障访问n1,就相当于默认将数据存在n2上(这里设置应该是非本机的另一个服务器)

                               ##在 node2 上此项设置为“n1”

      requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"

      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

      />

          

      

     注意:在配置文件中不要写多余的注释,在此仅为效果演示,否则配置文件检测是会报错的

     mv jar/ /usr/local/tomcat/lib

     rm -fr memcached-session-manager-tc6-1.6.3.jar

        ls

        netstat -antlp      ##查看端口,出现了11211端口信息

        bin/startup.sh      ##开启tomcat服务

    (4)查看日志的信息

       pwd

       /usr/local/tomcat/

       cd logs/

       cat catalina.out

             出现memcached就算正确

     

    (5)测试:

       在网页上输入: 172.25.254.2/test.jsp

     客户端存入一些数据:如 wf1/2  111/222等

          

          

     查看 serve2 上的缓存记录:查看到了 server2上缓存到了server1 提交的信息

     即,memcache 交叉存储配置完成。

    ============================================================================================

    memcache的存储方式是:交叉存储的

       也就是说,vm1将信息存储在vm2的memcache中,vm2将信息存储在vm1的memcache中。注意:本身tomcat里就存在缓存,也就是说,本身就存在缓存,再将缓存复制一份,存到另一个虚拟机的memcache中。

       这样如果vm1的memcache挂掉了,vm2接管工作,不会丢失信息。

       vm1在vm2中的memcache中存入数据,如果数据写到一半,vm1挂掉了,那么vm2会接管工作,接着在vm2的memcache中继续写入数据,而不会重新写入到vm1的memcache。

       如果是新打开一个链接的话,会存到vm1的缓存

    =============================================================================================

  • 相关阅读:
    初学Google Code,Subversion和TortoiseSVN
    成长,真有你想象的那样迫切?
    Java中十个常见的违规编码
    Eclipse打包工具Fatjar
    “旁观者效应”是如何毁掉我们的代码的
    java设计模式—分类
    java中的关键字static(静态变量)和final定义常量
    JAVA UDP打洞必备知识点NAT
    [Struts]在jsp里处理比较复杂的内容?
    反向链接referrer的原理
  • 原文地址:https://www.cnblogs.com/wf-aiyouwei/p/9812723.html
Copyright © 2020-2023  润新知