提问者:小点点

Apachemod_jk负载平衡不起作用,但故障转移有效


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

我的笔记本电脑上运行着Apache httpd 2.2服务器。我有两个VMWare虚拟机访客操作系统。这三个都是windows。威睿机器托管了为Web应用程序提供服务的Apache Tomcat服务器。我已经配置了带有mod_jk的httpd. conf文件和带有worker信息的Worker属性文件。我可以使用URL访问我的Web应用程序: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:

服务器. xml

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

如果需要更多的摘录,我可以上传


共2个答案

匿名用户

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

如果没有会话cookie,请求应该以循环方式在可用的Tomcat之间分发。因此,为了测试负载平衡,您通常需要多个浏览器实例保存不同的会话cookie。或者尝试设置sticky_session=false以查看所有以循环方式转发的请求。

匿名用户

来自apache:

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

我将首先尝试确保jvmRoute正常

会话粘性不是使用会话跟踪表来实现的。相反,每个Tomcat实例都有一个单独的名称,并在会话id的末尾添加其名称。当负载均衡器看到会话id时,它会找到Tomcat实例的名称并通过正确的成员工作人员发送请求。为此,您必须将Tomcat实例的名称设置为每个Tomcat服务器. xml的Engine元素中的jvmRoute属性的值。Tomcat的名称需要等于相应负载均衡器成员的名称。在上面的示例中,主机“myhost1”上的Tomcat需要jvmRoute="worker1",主机“myhost2”上的Tomcat需要jvmRoute="worker2"。

你的tomcat 2 jvmRoute应该是“worker2”