负载均衡之Apache

  • 测试环境
Apache:2.4.25
web server:apache-tomcat-8.0.18
Jdk:1.8
操作系统:Windows7

  • Apache下载及配置(免安装版)
官网下载: http://httpd.apache.org/
找到Apache下conf目录中httpd.conf文件,进行以下调整:
#Define SRVROOT "/Apache24" 》Define SRVROOT "D:/MyTest/tomcat_cluster/Apache24"  #指向安装目录

安装Apache主服务,管理员权限打开cmd,执行:httpd.exe -k install -n Apache24 ,Apache24为服务名可自定义

安装位置bin目录下双击ApacheMonitor.exe,打开界面窗口,选择服务,点击start开启服务

浏览器访问http://localhost,出现“IT WORKS”界面。 默认监听80端口,被占用无法启动

服务卸载,管理员权限打开cmd,执行:sc delete Apache24

  • tomcat集群配置
</web-app>上面添加<distributable/>,表明集群下某一结点生成或改变session,将广播到集群下的其它节点

单机测试需要更改tomcat端口号,避免端口冲突

在Engine标签内添加jvmRoute属性,自定义节点名称,例如:tomcat1
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
将Cluster标签注释打开
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

  • Apache与tomcat集成
mod_proxy_balancer、mod_jk两种方式,mod_jk的设置项更多。具体比较可参考:
引用

首先要在httpd.conf引入配置文件:
#include conf/mod_proxy_balancer.conf
include conf/mod_jk.conf

mod_proxy_balancer.conf
#AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#AH02432: Cannot find LB Method: byrequests
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

LoadModule proxy_module modules/mod_proxy.so  
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so  
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so  
LoadModule proxy_connect_module modules/mod_proxy_connect.so    
LoadModule proxy_http_module modules/mod_proxy_http.so

<Proxy balancer://testCluster>
  BalancerMember ajp://127.0.0.1:6009 loadfactor=3
  BalancerMember ajp://127.0.0.1:7009 loadfactor=1
  #BalancerMember http://127.0.0.1:6080 loadfactor=3
  #BalancerMember http://127.0.0.1:7080 loadfactor=1
</Proxy>
ProxyPass / balancer://testCluster/
以上为mod_proxy_balancer方式的配置文件,需要加载所需的.so支持模块。前两个模块的注释为测试时遇到的错误发现需要增加的模块支持。Proxy balancer中支持ajp、http两种方式,建议ajp,两者对比分析:
引用

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
mod_jk.so为依赖的模块,都说在Apache官网上下载,没有找到。网上下了个,见附件。
JKMount /* 分流所有请求,可调整通配符分流指定请求,例如:/*.action

workers.properties
worker.list=controller,tomcat1,tomcat2

worker.tomcat1.port=6009 #ajp13 端口号
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址 
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的请求越多

worker.tomcat2.port=7009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1

worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2 #指定分担请求的tomcat 
worker.controller.sticky_session=false
配置了两个tomcat节点,节点名称分别为tomcat1、tomcat2,对应tomcat陪住中的jvmRoute。

sticky_session设置注意点,未验证
引用
worker.controller.sticky_session,设置为1或true使用粘着session,设置为0或false不使用粘着session。如果sticky_session设为true时,建议sticky_session_force设为false,此参数表明如果集群中某台服务器在多次请求没有响应后,将转发当前的请求到其它服务器上处理;sticky_session=false时,影响比较大,会导致转发到其它服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。sticky_session、sticky_session_force的默认值分别为true,false。

sticky_session   sticky_session_force             含义
     true             false            SESSION会复制,有粘性
     true             true             SESSION不复制,有粘性
     false            false            SESSION会复制,无粘性
     false            true             SESSION会复制,无粘性

原文地址: http://www.linuxidc.com/Linux/2012-02/53270.htm


  • jeesite项目集成测试
jeesite使用shiro,自定义sessionid,因此不依赖tomcat的session同步机制,只需要开启负载功能即可,即web.xml中不需要添加<distributable/>

分布式环境下需要实现session共享,jeesite自身提供ecache共享方案,切换ehcache-local为ehcache-rmi,只需要更改配置文件jeesite.properties中参数ehcache.configFile的路径为cache/ehcache-rmi.xml

ecache集群同步方案有Terracotta、RMI、JMS、JGroups、EhCache Server,本文中使用RMI,实际生产环境下可以使用EhCache Server搭建独立的缓存服务器

在实际测试时,每次切换节点shiro自定义的sessionid都会变好,花费了我很多时间,快奔溃了,各种查资料、看shiro源码。也猜测过可能是cache同步的问题,简单做了下测试,发现有进行同步。又去查其它的问题,走了很多弯路,最后发现还是cache的问题。jeesite下默认的ehcache-rmi.xml配置是需要进行调整的,activeSessionCache监听工厂的参数replicateAsynchronously=true、replicateUpdatesViaCopy=false需要调整,调整replicateAsynchronously=false、replicateUpdatesViaCopy=true,或者replicateUpdatesViaCopy=true、asynchronousReplicationIntervalMillis=200。原因在于cache节点间异步复制有时间间隔,切换节点时可能复制未完成。因此,应根据cache实际应用场景采用同步复制或者异步复制,异步复制时应注意间隔时间。

但在实际测试时,不关是同步,还是调整复制间隔时间,都存在登录瞬间切换节点获取不到cache的情况。但是使用nginx没有问题,没发现与apache的差异在哪里。当然,现在nginx用的比较多,ehcache也有更好的替换方案

  • 参考资料
深入探讨在集群环境中使用 EhCache 缓存系统
引用

一个项目两个web模块会导致shiro的session污染
引用

Shiro用ehcache缓存session,关于JSESSIONID失效报错问题
引用

Tomcat集群配置
引用

猜你喜欢

转载自sheungxin.iteye.com/blog/2349012