Farm Deployer 在 Tomcat 集群中不起作用

Farm Deployer 在 Tomcat 集群中不起作用

我已经设置了 apache-tomcat 集群(Ubuntu Server),并使用了 tomcat 支持的集群技术和 mod_jk,如下所示关联。我已经设置了一个负载均衡器和两个 Web 服务器。

主要问题是部署 WAR 文件以及部署到哪个 Web 服务器?我了解 Farmed Deployment,它可以将 war 文件部署到集群中的其他 tomcat 服务器,但我还没有让它工作。我在两个 Web 服务器的元素中以以下方式使用了 farm 部署器。

Web 服务器 1(192.168.1.101)

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/usr/share/tomcat/temp/"
                    deployDir="/usr/share/tomcat/webapps/"
                    watchDir="/usr/share/tomcat/watch/"
                    watchEnabled="true"/>

Web 服务器 2(192.168.1.102)

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/usr/share/tomcat/temp/"
                    deployDir="/usr/share/tomcat/webapps/"
                    watchDir="/usr/share/tomcat/webapps/"
                    watchEnabled="false"/>

我将 WAR 放在 Web 服务器 1 上的监视目录中,但它没有部署到其他服务器。有人成功了吗?我做错了什么吗?请告诉我!

谢谢你!

更新:1

我可以在 catalina.out 日志中的任意一台机器上看到以下信息,

14 Aug, 2011 9:12:11 PM org.apache.catalina.ha.deploy.FarmWarDeployer start
SEVERE: FarmWarDeployer can only work as host cluster subelement!

它甚至没有部署到 webserver1,也没有部署到 webserver2。访问网站时出现 404 错误。还有其他帮助吗?还有一件事,我没有从 apt 存储库安装 tomcat,而是从源代码构建的,它对我们的 java 应用程序来说运行良好。

答案1

您应该查看的第一个位置是catalina.out,它会告诉您可能出现了什么问题。

如果你无法让它与多播一起工作,请尝试静态成员资格 (我认为它会更简单)

以下是我的配置:

<Cluster节点放入元素内<Host

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">         
  <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="192.168.5.149"
                  port="4000"
                  selectorTimeout="100"
                  maxThreads="6"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
                <Member className="org.apache.catalina.tribes.membership.StaticMember"
                      port="4001"
                      securePort="-1"
                      host="192.168.5.199"
                      domain="staging-cluster"
                      uniqueId="{0,1,2,3,4,5,6,7,8,9}"/>
            </Interceptor>
        </Channel>
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/usr/share/tomcat6/tempdir/"
            deployDir="/usr/share/tomcat6/webapps/"
            watchDir="/usr/share/tomcat6/watchdir/"
            watchEnabled="true"/>
    </Cluster>
  </Host>
</Engine>
  • address元素中的属性是<Receiver节点 1 的 IP 地址。(在您的情况下是 .101)
  • 正在port侦听复制消息在节点 1 上(4000-4100)
  • 正在Member's port监听<Interceptor集群消息在节点 2 上
  • Member's host是节点 2 的 IP 地址 (.102)

server.xml在节点 2 上:

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="192.168.5.199"
                  port="4001"
                  selectorTimeout="100"
                  maxThreads="6"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
                <Member className="org.apache.catalina.tribes.membership.StaticMember"
                      port="4000"
                      securePort="-1"
                      host="192.168.5.149"
                      domain="staging-cluster"
                      uniqueId="{0,1,2,3,4,5,6,7,8,9}"/>
            </Interceptor>
        </Channel>
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/usr/share/tomcat6/tempdir/"
            deployDir="/usr/share/tomcat6/webapps/"
            watchDir="/usr/share/tomcat6/watchdir/"
            watchEnabled="false"/>
    </Cluster>

确保 Tomcat 可以写入文件tempDirwatchDir

chmod g+w tempDir watchDir
chgrp tomcat tempDir watchDir

如果不这样做,您将收到以下错误:

Aug 13, 2011 10:28:33 PM org.apache.catalina.ha.deploy.FarmWarDeployer messageReceived
SEVERE: Unable to read farm deploy file message.
java.io.IOException: Permission denied

记得添加<distributable/>webapps/ROOT/WEB-INF/web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  ...
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  <distributable/>
</web-app>

每当您将.war文件复制到watchdir节点 1 上的文件夹中时,您将看到类似以下内容catalina.out

Aug 14, 2011 1:40:58 AM org.apache.catalina.ha.deploy.WarWatcher check
INFO: check cluster wars at /usr/share/tomcat6/watchdir
Aug 14, 2011 1:40:59 AM org.apache.catalina.ha.deploy.FarmWarDeployer fileModified
INFO: Installing webapp[/cas] from /usr/share/tomcat6/webapps/cas.war
Aug 14, 2011 1:40:59 AM org.apache.catalina.ha.deploy.FarmWarDeployer remove
INFO: Cluster wide remove of web app /cas
Aug 14, 2011 1:40:59 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive cas.war

在节点 2 上:

Aug 14, 2011 1:40:59 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive cas.war

祝你好运!

答案2

如果您的 /etc/hosts 文件包含实际的 NIC IP 地址而不是环回地址 127.0.0.1,则多播地址有效。Tomcat 会获取由以下因素决定的 Receiver.address 属性:

 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"

多播服务将广播与服务器主机名关联的 IP 地址。Catalina.out 应显示其在启动期间拾取的 IP 地址。如果检测到环回地址,则集群节点将无法相互通信。catalina.out 日志文件中的一个错误地址拾取示例导致节点之间无法通信:

INFO: Cluster is about to start
09/08/2013 7:38:14 PM org.apache.catalina.tribes.transport.ReceiverBase bind
INFO: Receiver Server Socket bound to:/127.0.1.1:5000

相关内容