0

您好我是集群概念的新手,所以我尝试建立一个有 2 个实例的 Tomcat 集群。我遵循了示例,主要位于http://www.mulesoft.com/tcat/tomcat-clustering和其他一些网络资源。

我的示例设置是在workers.properties

# Define worker names
worker.list=jkstatus, loadbalancer
# Create virtual workers
worker.jkstatus.type=status
worker.loadbalancer.type=lb
# Declare Tomcat server worker 1 
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=7009
# Declare Tomcat server worker 2
worker.worker2.type=ajp13
worker.worker2.port=9009
worker.worker2.host=localhost
# Associate real workers with virtual LoadBalancer worker
worker.loadbalancer.balance_workers=worker1,worker2

和 Apache httpd.conf 一样,

# ADDED CLUSTER CONFIG
# Load module
LoadModule jk_module modules/mod_jk.so
# Specify path to worker configuration file
JkWorkersFile C:/tomcat_clustered/workers.properties
# Configure logging and memory
JkShmFile C:/tomcat_clustered/log/location/mod_jk.shm
JkLogFile C:/tomcat_clustered/log/location/mod_jk.log
JkLogLevel info
# Configure monitoring
JkMount /jkmanager/* jkstatus
<Location /jkmanager>
Order deny,allow
deny from all
allow from localhost
</Location>
# Configure applications
JkMount /* loadbalancer
# END CLUSTER CONFIG

使用每个 tomcat(worker) server.xml 作为,

<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
  <!--For clustering, please take a look at documentation at:
      /docs/cluster-howto.html  (simple how to)
      /docs/config/cluster.html (reference documentation) -->
  <!--
  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
  -->
  <!-- CLUSTER BEGIN -->
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager className="org.apache.catalina.ha.session.DeltaManager"
        expireSessionsOnShutdown="false"
        notifyListenersOnReplication="true"/> 
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <!---->
            <Membership className="org.apache.catalina.tribes.membership.McastService"
            address="239.0.0.1"
            port="45564" frequency="500"
            dropTime="3000"/>       
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
            address="auto" port="4000" autoBind="100"
            selectorTimeout="5000" maxThreads="6"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
        </Channel>
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>
<!-- CLUSTER END -->
  <!-- Use the LockOutRealm to prevent attempts to guess user passwords
       via a brute-force attack -->
  <Realm className="org.apache.catalina.realm.LockOutRealm">

对于工人 1,工人 2。我正在使用 Windows 7。看起来需要一些多播选项,但我不确定。在启动tomcat时,一个启动良好,在启动第二个(比如worker2)时,两个tomcat控制台都抛出错误,

       at org.apache.catalina.tribes.group.ChannelInterceptorBase.heartbeat(Cha
nelInterceptorBase.java:103)
       at org.apache.catalina.tribes.group.GroupChannel.heartbeat(GroupChannel.
ava:155)
       at org.apache.catalina.tribes.group.GroupChannel$HeartbeatThread.run(Gro
pChannel.java:690)

ep 15, 2014 10:11:03 AM org.apache.catalina.tribes.group.interceptors.TcpFailur
Detector memberAlive
EVERE: Unable to perform failure detection check, assuming member down.
ava.net.SocketException: Permission denied: connect
       at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
       at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketI
pl.java:85)
       at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.ja
a:339)
       at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocket
mpl.java:200)
       at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java

不确定是由于我的 Windows 上的某些多播权限还是任何与配置相关的问题。请在这方面提出一些好的建议

4

2 回答 2

1

您需要启用多播。看到这篇文章如何启用多播是 windows,https://serverfault.com/questions/262634/how-do-i-know-if-ip-multicasting-is-enabled-on-my-network-in-windows

在 Linux 环境中,大多数系统内核都能够处理多播地址。但是我们需要在内核路由表中添加路由条目。

sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
于 2014-09-22T12:02:17.947 回答
0

您报告的错误看起来可能与操作系统/网络相关。具体很难说。不过我可以告诉你。

你已经声明了一个 TcpFailureDetector。

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

这是 Tomcat 集群配置的一部分,它的职责是与任何怀疑发生故障的节点建立 TCP 连接。如果侦听器无法连接到节点,它将被标记为关闭。如果它可以连接,则节点保持活动状态。

在这种情况下,侦听器正在尝试与您的一个节点建立连接,但由于来自 JDK 的错误而失败。谷歌搜索该特定错误会出现一些建议,其中之一是使用“-Djava.net.preferIPv4Stack=true”。

我得到 java.net.SocketException: Permission denied: 在 Jenkins 中发送电子邮件时连接

另外,如果您已经注意到有关 Tomcat 集群的官方文档,我强烈建议您检查一下。这是链接。

http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

于 2014-09-15T15:52:58.647 回答