Tomcat群集多播会引发错误 - 无法执行故障检测检查,假设成员已关闭

时间:2014-09-15 08:34:16

标签: apache tomcat7 load-balancing session-replication

您好我是群集概念的新手,所以我尝试建立一个包含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 as,

# 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">

对于worker1,worker2。我正在使用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上的某些多播权限或任何配置相关问题。请在这方面提出一些好的建议

2 个答案:

答案 0 :(得分:0)

您报告的错误看起来可能与操作系统/网络相关。很难说准确。我可以告诉你这个。

您已声明了TcpFailureDetector。

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

这是Tomcat群集配置的一部分,它的责任是与任何怀疑失败的节点建立TCP连接。如果收听者无法连接到节点,则将其标记为关闭。如果它可以连接,则节点保持活动状态。

在这种情况下,侦听器正在尝试与您的某个节点建立连接,并且它因JDK的错误而失败。谷歌搜索该特定错误会提出一些建议,其中一个建议是使用&#34; -Djava.net.preferIPv4Stack = true&#34;。

I get java.net.SocketException: Permission denied: connect when sending an email in Jenkins

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

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

答案 1 :(得分:0)

您需要启用多播。看这篇文章如何启用多播是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