8244 发表于 2017-1-12 11:29:23

利用apache+tomcat+jk+terracotta实现负载均衡和session共享

  今天尝试了一下在本机上用apache+tomcat+JK+Terracotta 实现负载均衡、session共享(一台机器两个tomcat),注意jk一定要和apache版本相对应。
  一、负载均衡设置
  安装完成后首先将mod_jk.so复制到apache\modules\中,然后在apache\conf\目录下面找到httpd.conf文件。修改文件的最后一行在最后面加上一句:
  include "D:\apache\conf\mod_jk.conf"
  然后在apache\conf目录下面新建mod_jk.conf文件。文件内容如下: 
  #加载mod_jk Module 
  LoadModule jk_module modules/mod_jk.so 
  #指定 workers.properties文件路径 
  JkWorkersFile conf/workers.properties 
  #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器 
  JkMount /* controller  
  在http.conf同目录下新建 workers.properties文件,内容如下: 
  worker.list = controller,tomcat,tomcat2  #server 列表 
  #======== tomcat======== 
  worker.tomcat.port=8009       #ajp13 端口号,在tomcat下server.xml配置,默认8009 
  worker.tomcat.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址 
  worker.tomcat.type=ajp13 
  worker.tomcat.lbfactor = 1    #server的加权比重,值越高,分得的请求越多 
  #======== tomcat2======== 
  worker.tomcat2.port=9009       #ajp13 端口号,在tomcat下server.xml配置,默认8009 
  worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址 
  worker.tomcat2.type=ajp13 
  worker.tomcat2.lbfactor = 1    #server的加权比重,值越高,分得的请求越多 
  #========controller,负载均衡控制器======== 
  worker.controller.type=lb 
  worker.controller.balanced_workers=tomcat,tomcat2  #指定分担请求的tomcat 
  worker.controller.sticky_session=1 
  因为我是一台电脑上配置,所以最后还要修改第二个tomcat服务器的配置端口。如果在两台电脑上就不用修改端口了。
  <Server port="9005" shutdown="SHUTDOWN">将关闭端口改为9005。 
  <Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />将连接端口改为9080。 
  <!-- Define an AJP 1.3 Connector on port 8009 --> 
  <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />将ajp1.3端口改为9009 
  至此负载均衡的配置完成。直接将手上的项目拷贝到两个tomcat目录下。即可进行负载均衡测试。打开多个ie窗口,观察两个tomcat后面的输出。
  二、session共享
  1、 tomcat自带session复制机制
  在tomcat1里面的server.xml 增加 
  <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat"> 
  tomcat2里面增加: 
  <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"> 
  对于Cluster元素的配置。将以下内容 粘贴到两个tomcat的sever.xml
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
  channelSendOptions="8">   
  <Manager className="org.apache.catalina.ha.session.DeltaManager"  
  expireSessionsOnShutdown="false"  
  notifyListenersOnReplication="true"/>   
  <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="4000"  
  autoBind="100"  
  selectorTimeout="5000"  
  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"/>   
  </Channel>   
  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  filter=""/>   
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>   
  <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.JvmRouteSessionIDBinderListener"/>   
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>   
  </Cluster>  
  因为是在同一台电脑上,所以在粘贴第二个时。微做修改将tomcat将端口改为4002;
  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
  address="auto"  
  port="4002"  
  autoBind="100"  
  selectorTimeout="5000"  
  maxThreads="6"/>  
  最后要tomcat支持session复制,必须在web.xml里面加上一个标签。<distributable/>在你工程的web.xml最后面加上这一句即可。
  这种方式是通过组播的方式进行集群间的共享,优点是web容器自身支持,配置简单,适合小型网站。缺点是当一台机器的上的session变更后会将变更的数据以组播的形式分发给集群间的所有节点,对网络和所有的web容器都是存在开销。集群越大浪费越严重。不能做到线性的扩展。
  2、利用Terracotta 实现
  在Terracotta目录中找到这个两个jar包:terracotta-session-1.3.5.jar terracotta-toolkit-1.6-runtime-5.5.0.jar,复制到各个tomcat的lib中
  修改tomcat中conf/context.xml配置文件,在Context中添加一段
  <Valve className="org.terracotta.session.TerracottaTomcat60xSessionValve" tcConfigUrl="localhost:9510"/>
  启动Terracotta即start-tc-server.bat,启动多个tomcat进行session共享测试。
  3.Memcache
  1,准备文件
  memcached windows版
  下载地址:http://download.csdn.net/detail/yangwei19680827/6026309
  相关jar包
  直载地址:http://download.csdn.net/detail/yangwei19680827/6026323
  Tomcat
  去官网下载http://tomcat.apache.org/download-60.cgi 注意版本下载的是6.x的
  2,安装Memcached
  将下载的memcached解压到C盘根目录,如想解压到其它盘请修改文件夹中的install.bat
  解压后的目录为C:\memcached\
  执行目录中的install.bat(win7需要以管理员身份运行,否则服务安装失败)
  安装好后看服务中是不是已安装的服务名memcached_11211
  启动服务
  3,配置Tomcat
  修改Tomcat端口,此处不做讲解,自行百度
  将相关jar包中的jar包全部复制到二个tomcat的lib目录
  修改Tomcat\conf\content.xml
  在content中增加如下代码:


<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"
/>
二个Tomcat都要加哦。 





  当然还可以利用cookie、数据库和来实现,这里就不在赘述了。
  本人也处于学习阶段,很多东西可能还不完善,希望大家批评指正。
页: [1]
查看完整版本: 利用apache+tomcat+jk+terracotta实现负载均衡和session共享