1

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

我的笔记本电脑上运行着 Apache httpd 2.2 服务器。我有两个 VMWare 虚拟机客户操作系统。这三个都是窗户。VMware 机器托管服务于 Web 应用程序的 Apache Tomcat 服务器。我已经配置了带有 mod_jk 的 httpd.conf 文件和带有工人信息的工人属性文件。我可以使用 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

worker.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"/>

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

4

2 回答 2

1

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

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

于 2012-08-30T12:15:46.660 回答
1

来自阿帕奇

  • 所有会话属性都必须实现 java.io.Serializable
  • 取消注释 server.xml 中的 Cluster 元素
  • 如果您定义了自定义集群阀,请确保您有 ReplicationValve - 在 server.xml 中的 Cluster 元素下也被罚款
  • 如果您的 Tomcat 实例在同一台机器上运行,请确保每个实例的 tcpListenPort 属性是唯一的,在大多数情况下,Tomcat 足够聪明,可以通过自动检测 4000-4100 范围内的可用端口自行解决此问题。 xml有元素
  • 如果您使用的是 mod_jk,请确保 jvmRoute 属性已在您的 Engine 中设置,并且 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”

于 2014-01-20T10:29:15.903 回答