上次搞了Apache 2.2的集群方案,但是现在自己的机器和客户的服务器一般都是64位的,而且tomcat已经到8了。重新做Apache 2.4.12 64位+Tomcat-8.0.32-windows-x64负载集群方案。

知其然知其所以然,先看下一些关键术语:

1、负载均衡(load balance)
在互联网高速发展的时代,大数据量、高并发等是互联网网站提及最多的。如何处理高并发带来的系统性能问题,最终大家都会使用负载均衡机制。它是根据某种负载策略把请求分发到集群中的每一台服务器上,让整个服务器群来处理网站的请求。
对于大部分公司,会选择廉价有效的方法扩展整个系统的架构,来增加服务器的吞吐量和处理能力,以及承载能力,或者一些客户不想继续投入,典型啥事扔给研发人员的。

2、集群(Cluster)
 用N台服务器构成一个松耦合的多处理器系统(对外来说,他们就是一个服务器),它们之间通过网络实现通信。让N台服务器之间相互协作,共同承载一个网站的请求压力。

3、高可用(HA)
 在集群服务器架构中,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。

4、session复制/共享
 在访问系统的会话过程中,用户登录系统后,不管访问系统的任何资源地址都不需要重复登录,这里面servlet容易保存了该用户的会话(session)。如果两个tomcat(A、B)提供集群服务时候,用户在A-tomcat上登录,接下来的请求web服务器根据策略分发到B-tomcat,因为B-tomcat没有保存用户的会话(session)信息,不知道其登录,会跳转到登录界面。
这时候我们需要让B-tomcat也保存有A-tomcat的会话,我们可以使用tomcat的session复制实现或者通过其他手段让session共享。

Apache +tomcat也有一些不足的地方,或者本博文有配置不对的地方,希望批评指正。以下为个人亲测:

本次全部为64位系统,希望大家配置时版本一致,免得出问题。本次依然使用mod_jk方式。

配置出错:一般有这几种:

1、路径错误;

2、版本错误,尤其jk版本和Apache版本,当大家把mod_jk.so已加载就报错,不加载Apache正常启动的时候就知道是版本不匹配错误;

3、昨天自己配置的时候一个网络问题,在家的内网配置,配置3个tomcat,有一个tomcat部署到了阿里云的一台服务器上,死活tomcat启动不了,启动成功后死活session不共享,后来把这个tomcat挪到内网的一台机器上什么事都没有,这个问题以后再想。

软件架构:

JDK  jdk1.7.0_80 64位 tomcat8需要jdk7及以上支持;

Apache:Apache_HTTP_Server_2.4.12  

tomcat :apache-tomcat-8.0.32-windows-x64

mod_jk:  tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x

网络环境:win7,64位,8G内存,一台机器装apache和两个tomcat

软件安装:

在磁盘根目录下安装Apache,安装JDK,复制tomcat81 ,apache82,两个tomcat 都能单独启动;

mod_jk解压出来以后so文件之后,重命名为mod_jk.so,并放到Apache2.4/modules 目录下;

配置:

1、Apache 配置 负载均衡:

    1. 在apache安装目录下conf目录中找到http.conf,在文件最后加上下面一句话就可以了:include "E:\Apache24\conf\mod_jk.conf"
    2. conf同目录新建mod_jk.conf,内容如下:
      1. # 加载jk 模块
        LoadModule jk_module modules/mod_jk.so
        # 设置 worker.properties 文件位置
        JkWorkersFile conf/workers.properties
        # 设置 日志文件文职
        JkLogFile logs/mod_jk.log
        # 设置 日志输出级别 可选项[debug/error/info]
        JkLogLevel debug
        # 转发.jsp 所有的请求到名字为controller的 worker
        JkMount /*.jsp controller

          

    3. conf同目录新建worker.properties,内容如下:
      1. #server列表
        worker.list = controller
        #========tomcat81========
        worker.tomcat81.port=8009 #ajp13端口号
        worker.tomcat81.host=localhost
        worker.tomcat81.type=ajp13
        #server的加权比重,值越高,分得的请求越多
        worker.tomcat81.lbfactor=1 #========tomcat82========
        worker.tomcat82.port=9009
        worker.tomcat82.host=localhost
        worker.tomcat82.type=ajp13
        worker.tomcat82.lbfactor=1 #========controller,负载均衡控制器========
        worker.controller.type=lb
        worker.controller.retries=3
        #指定分担请求的tomcat
        worker.controller.balance_workers=tomcat81,tomcat82
        worker.controller.sticky_session=false
        worker.controller.sticky_session_force=1

        Apache 配置完成,启动Apache,一般来说应该没有问题了,apache 能够正常启动。

  1. 集群配置

    1. 如果是tomcat在不同的两台计算机上,则不用修改,但是要注意原来 的机器上是否在运行着tomcat,防止不改参数做实验你给人家同时给关闭了;
    2. 如果一台机器上两个tomcat,则需要修改一个,我们修改tomcat82:
    3. <Server port="8005" shutdown="SHUTDOWN">改为:
      <Server port="9005" shutdown="SHUTDOWN">
      
    4. <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />改为:

          <Connector port="9090" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />
    5. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />改为:
       <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
      
    6. Engine节点, 增加jvmRoute,jvmRoute属性要和worker.properties中balance_workers属性一致,两个tomcat要不同,tomcat81:
        <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat81">
      

        tomcat82:

        <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat82">
      
    7. 集群设置:
      Cluster 节点修改:
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="6">
      <Manager className="org.apache.catalina.ha.session.BackupManager"
      expireSessionsOnShutdown="false"
      notifyListenersOnReplication="true"
      mapSendOptions="6"/>
      <Channel className="org.apache.catalina.tribes.group.GroupChannel">
      <Membership className="org.apache.catalina.tribes.membership.McastService"
      address="228.0.0.4"
      port="45564"
      frequency="500"
      dropTime="3000"/>
      <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
      address="auto"
      port="5000"
      selectorTimeout="100"
      maxThreads="6"/>
      <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
      </Sender>
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
      <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
      </Channel>
      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
      filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
      tempDir="/tmp/war-temp/"
      deployDir="/tmp/war-deploy/"
      watchDir="/tmp/war-listen/"
      watchEnabled="false"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      Receiver 节点中的port端口,两台tomcat要不同。
    8. 分别启动tomcat81,tomcat82。
  2. session复制

    1. tomcat/webApps下新建项目test,新建test2.jsp文件,

      <%@ page 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>");
      // 如果有新的 Session 属性设置
      String dataName = request.getParameter("dataName");
      if (dataName != null && dataName.length() > 0) {
      String dataValue = request.getParameter("dataValue");
      session.setAttribute(dataName, dataValue);
      }
      out.println("<b>Session 列表</b><br>");
      System.out.println("============================");
      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="test2.jsp" method="POST">
      名称:<input type=text size=20 name="dataName">
      <br>
      值:<input type=text size=20 name="dataValue">
      <br>
      <input type=submit>
      </form>
      </body>
      </html>
    2. 实现session共享,还需要在context.xml添加属性distributable="true",或者像下面的方法
    3. 新建WEB-INF文件夹,文件夹下新建web.xml,内容:
      <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
      <display-name>test</display-name>
      <distributable/>
      </web-app>

        插入<distributable/>

    4. 分别启动tomcat81,tomcat82,分别访问http://localhost:8080/test/test2.jsp,http://localhost:9090/test/test2.jsp
    5. apache 启动,通过 http://localhost/test/test2.jsp 访问,多刷新几次页面,在控制台打印的 session 值都是一致的。可以看到tocmat控制器打印出来的东西,多找几个客户端试试,或者用手机访问下就可以看出来。
  3. 配置完成。

Apache 2.4.12 64位+Tomcat-8.0.32-windows-x64负载集群方案的更多相关文章

  1. win2003 64位系统IIS6.0 32位与64位间切换

    ASP.NET 1.1,32 位版本 要运行 32 位版本的 ASP.NET 1.1,按照以下步骤操作: 1.单击“开始”,单击“运行”,键入 cmd,然后单击“确定”. 2.键入以下命令启用 32 ...

  2. tomcat优化-有改protocol 和 缓存 集群方案

    tomcat优化 在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验. 1. 服务器资源 服务器所能提供CPU.内存.硬 ...

  3. 【转】tomcat优化-有改protocol 和 缓存 集群方案

    tomcat优化 在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验. 1. 服务器资源 服务器所能提供CPU.内存.硬 ...

  4. 64位tomcat不能配32位的JDK使用

    警告: The APR based Apache Tomcat Native library failed to load. The error reported was [D:\apache-tom ...

  5. 64位系统VBS调用32位COM组件

    64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件作者: Demon链接: ht ...

  6. 如何在64位windows7上同时使用32位和64位的Eclipse

    我用的是64位的windows7旗舰版,jdk1.7 64位机器上可以同时运行32位和64位的Eclipse,但是电脑中必须有相应的jdk.Eclipse虽然不需要安装,但是在启动时会检查系统中固定文 ...

  7. CLR调试报错“Visual Studio远程调试监视器 (MSVSMON.EXE) 的 64 位版本无法调试 32 位进程或 32 位转储。请改用 32 位版本”的解决

    Win7 64位电脑上进行visual studio的数据库项目的CLR存储过程进行调试时,报错: ---------------------------Microsoft Visual Studio ...

  8. 64位系统下注册32位dll文件

    64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...

  9. 64位系统下注册32位dll、ax文件

    64位系统下注册32位dll.ax文件. 换了64位系统遇到的新问题,目前常用的影音处理软件多数为32位. 注册这些32的滤镜会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以 ...

随机推荐

  1. 安装第三方包&查看python版本/第三方包版本

    安装第三方包时,经常需要查看python版本,以及是否安装第三方包及版本,每次都要百度下指令. 故小编整理了下安装/卸载第三方包,查看python/第三包的指令,具体如下: 一.python安装/卸载 ...

  2. Git 内部原理

    首先要弄明白一点,从根本上来讲 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面. 马上你就会学到这意味着什么. git objec ...

  3. USACO 6.1 章节

    Postal Vans 题目大意 4*n的网格,要经过所有点的有向有环,不重复经过点的路径总数 n<=1000 题解 显然 插头dp 以4为切面 问题是,会发现 超精度 解决呢要么实现高精度,要 ...

  4. MSF——基本使用和Exploit模块(一)

    MSF系列: MSF——基本使用和Exploit模块(一) MSF——Payload模块(二) MSF——Meterpreter(三) MSF——信息收集(四) MSF——Metasploit Fra ...

  5. vue学习 ---- 使用vue-router 进行跳转

    前提说明,在学习vue的时候,尽量的以官网的为主,而且框架本身与官方文档都是在不断迭代更新的. 在vue的框架中,目前都是使用vue-router 来进行页面跳转的,而不是<a>.先贴一个 ...

  6. 37.Sort Colors(颜色排序)

    Level:   Medium 题目描述: Given an array with n objects colored red, white or blue, sort them in-place s ...

  7. Python基础篇(is和==)

    python基础篇(is,==,): 一.is和==的区别 1.id() 通过id()我们可以查看到一个变量表示的值在内存中的地址. s = 'alex' s = "alex" l ...

  8. DB2实例

    实例是逻辑数据库管理环境,可以在此环境中对数据库进行编目和设置配置参数.根据需要, 可以在一台服务器上创建多个实例,该服务器为每个实例提供唯一的数据库服务器环境.   默认实例:DB2   显示实例: ...

  9. 图片查看器(类似于QQ,另外又加了JARA的下方的图片缩略导航图)

    源码地址:https://gitee.com/yolanda624/coffer/tree/master/src/components/a-photo-view

  10. 高逼格企业级MySQL数据库备份方案,原来是这样....

    很多人,这里说的是运维工程师们,一提到写某某方案,很是头疼.不是上某度一统搜索,就是同样一句话在N个群全部群发一遍:“有没有某某方案,可以共享一下的吗??求助,各位大佬们”,估计十有八九,全部石沉大海 ...