我想在我的VM連接到的幾個網絡中的一個上對羣集Tomcat實例進行羣集。使用默認配置,我在感興趣的網絡上看不到任何多播流量。如何使用McastService綁定進行Tomcat集羣?
因此,我試圖使用McastService
中的bind
屬性告訴Tomcat要使用哪個網絡接口。
當我使用IPv4或IPv6的bind
網絡接口地址,我看到3個包走在了正確的組播地址/端口,但隨後的Tomcat會拋出異常:
Feb 15, 2014 8:22:45 PM org.apache.catalina.ha.tcp.SimpleTcpCluster startInternal
SEVERE: Unable to start cluster.
org.apache.catalina.tribes.ChannelException: java.io.IOException: Invalid argument; No faulty members identified.
at org.apache.catalina.tribes.group.ChannelCoordinator.internalStart(ChannelCoordinator.java:178)
at org.apache.catalina.tribes.group.ChannelCoordinator.start(ChannelCoordinator.java:99)
at org.apache.catalina.tribes.group.ChannelInterceptorBase.start(ChannelInterceptorBase.java:162)
at org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor.start(MessageDispatchInterceptor.java:157)
at org.apache.catalina.tribes.group.ChannelInterceptorBase.start(ChannelInterceptorBase.java:162)
at org.apache.catalina.tribes.group.ChannelInterceptorBase.start(ChannelInterceptorBase.java:162)
at org.apache.catalina.tribes.group.GroupChannel.start(GroupChannel.java:419)
at org.apache.catalina.ha.tcp.SimpleTcpCluster.startInternal(SimpleTcpCluster.java:685)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1106)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.Catalina.start(Catalina.java:691)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
Caused by: java.io.IOException: Invalid argument
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:676)
at org.apache.catalina.tribes.membership.McastServiceImpl.send(McastServiceImpl.java:503)
at org.apache.catalina.tribes.membership.McastServiceImpl.send(McastServiceImpl.java:480)
at org.apache.catalina.tribes.membership.McastServiceImpl.start(McastServiceImpl.java:269)
at org.apache.catalina.tribes.membership.McastService.start(McastService.java:386)
at org.apache.catalina.tribes.group.ChannelCoordinator.internalStart(ChannelCoordinator.java:167)
... 22 more
我知道組播是工作,因爲我能夠看到包含tcpdump
的數據包並使用mcsender
發送數據包。我試圖禁用IPv6,並沒有幫助。
如何將Tomcat連接到正確的網絡接口進行羣集。我需要將它連接到:
eth2 Link encap:Ethernet HWaddr bc:76:4e:05:5b:22
inet addr:192.168.3.4 Bcast:192.168.3.255 Mask:255.255.255.0
inet6 addr: fe80::be76:4eff:fe05:5b22/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:70 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4160 (4.1 KB) TX bytes:648 (648.0 B)
運行Tomcat 7.0.42。我一直在試圖使用的配置(主要是默認+ bind
)是:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="main4">
<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="228.0.0.4"
port="45564"
bind="192.168.3.4"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<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>