Apache mod_jk负载平衡不起作用但故障转移工作

时间:2012-08-30 08:16:23

标签: apache load-balancing failover mod-jk

我正在尝试使用mod_jk配置Apache负载平衡解决方案。群集工作但不负载平衡。

我的笔记本电脑上运行了Apache httpd 2.2服务器。我有两个VMWare虚拟机客户操作系统。这三个都是窗户。 VMware计算机托管为Web应用程序提供服务的Apache Tomcat Server。我已经使用mod_jk配置了httpd.conf文件,并使用worker信息配置了worker属性文件。我可以使用以下网址访问我的网络应用程序:http://localhost/Web-application。如果我停止一台服务器,那么应​​用程序将从另一台服务器提供。但不是两个在同一时间。一些摘录如下:

httpd.conf文件:

LoadModule jk_module modules/mod_jk.so 
JkWorkersFile conf/workers.properties
JkLogFile "logs/mod_jk.log" 
JkLogLevel info
JkMount /MovieBooking loadbalancer
JkMount /MovieBooking/* loadbalancer

workers.properties文件

workers.tomcat_home=/worker1
workers.java_home=$JAVA_HOME
worker.list=loadbalancer,jkstatus,worker1,worker2

 #Declare Tomcat server workers 1 through n

worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2
worker.loadbalancer.sticky_session=1

worker.worker1.type=ajp13
worker.worker1.host=192.168.200.244
worker.worker1.port=8109
worker.worker1.lbfactor=1

worker.worker2.type=ajp13
worker.worker2.port=8109
worker.worker2.host=192.168.200.243
worker.worker2.lbfactor=1

worker.jkstatus.type=status

我还在这些服务器上的server.xml文件中设置了jvmroute:

的Server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">         
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

如果需要更多提取,我可以上传

2 个答案:

答案 0 :(得分:1)

使用粘性会话配置负载平衡(对我来说没问题)的方式意味着一旦创建了会话,后续请求将被定向到同一个Tomcat实例。您可以通过查看应附加.worker1.worker2的会话Cookie值来识别此问题。 Apache HTTPD使用此后缀来决定将传入请求发送到哪个Tomcat实例。

如果没有会话cookie,请求应以循环方式在可用的Tomcats中分发。因此,为了测试load-balacing,您通常需要几个持有不同会话cookie的浏览器实例。或者尝试设置sticky_session=false以查看转发循环风格的所有请求。

答案 1 :(得分:1)

来自apache的

  • 您的所有会话属性都必须实现java.io.Serializable
  • 取消注释server.xml中的Cluster元素
  • 如果您已定义自定义集群阀门,请确保您具有ReplicationValve - 在server.xml中的Cluster元素下也已被罚款
  • 如果您的Tomcat实例在同一台机器上运行,请确保tcpListenPort属性对于每个实例都是唯一的,在大多数情况下,Tomcat足够聪明,可以通过自动检测4000-4100范围内的可用端口自行解决此问题 确保您的web.xml包含元素
  • 如果您使用的是mod_jk,请确保在您的引擎上设置了jvmRoute属性,并且jvmRoute属性值与workers.properties中的工作者名称匹配
  • 确保所有节点具有相同的时间并与NTP服务同步! 确保您的负载均衡器配置为粘性会话模式。
我会先尝试一下  确保jvmRoute正常

Session stickyness is not implemented using a tracking table for sessions. Instead each Tomcat instance gets an individual name and adds its name at the end of the session id. When the load balancer sees a session id, it finds the name of the Tomcat instance and sends the request via the correct member worker. For this to work you must set the name of the Tomcat instances as the value of the jvmRoute attribute in the Engine element of each Tomcat's server.xml. The name of the Tomcat needs to be equal to the name of the corresponding load balancer member. In the above example, Tomcat on host "myhost1" needs jvmRoute="worker1", Tomcat on host "myhost2" needs jvmRoute="worker2".

你的tomcat 2 jvmRoute应该是“worker2”