Uploaded image for project: 'JBoss Web Server'
  1. JBoss Web Server
  2. JWS-407

mod_cluster UDP multicast listener does not honour the proper interface

    XMLWordPrintable

Details

    • Bug
    • Resolution: Won't Do
    • Major
    • None
    • JWS 3.0.3 GA, JWS 3.0.3 CR1
    • mod_cluster, tomcat7, tomcat8
    • None

    Description

      Wrong interface

      On a multi-interface systems, it is necessary to pick the right interface the balancer should send to
      and worker should receive from. Merely setting UDP multicast address and port is not enough.

      • With Apache HTTP Server, this is achieved by AdvertiseBindAddress directive (though the default is wrong MODCLUSTER-487)
      • With Undertow mod_cluster proxy in Wildfly, the interface could be set in socket bindings, e.g.:
        <socket-binding name="modcluster-adv" port="7637" multicast-address="224.0.1.105" multicast-port="7637" interface="special-public"/>
      • In the case of Tomcat/JBossWeb, historical mod_cluster 1.x documentation suggests that it is done "automatically": interface on which mod_cluster's internal connection was established.

      The statement from the historical documentation doesn't make much sense to me – which internal connection?

      The actual result is that if you have 2 boxes, 2 interfaces each:

      Balancer (Undertow or Apache HTTP Server)

      Box 1: enp1s0:10.16.88.186, enp2s0:172.17.71.254, all connectors including advertisement bound to enp2s0:172.17.71.254

      Worker (Tomcat)

      Box 2: enp1s0:10.16.88.181, enp2s0:172.17.66.254, HTTP/AJP connectors bound to enp2s0:172.17.66.254

      <Listener className="org.jboss.modcluster.container.catalina.standalone.ModClusterListener" advertise="true"
                loadMetricClass="org.jboss.modcluster.load.metric.impl.BusyConnectorsLoadMetric"
                loadMetricCapacity="1" loadHistory="9" loadDecayFactor="2"
                stickySession="true" stickySessionForce="false" stickySessionRemove="true"
                excludedContexts="ROOT,manager,docs,examples,host-manager"
                autoEnableContexts="true" advertiseGroupAddress="224.0.1.105" advertisePort="7637"
      <Connector address="172.17.66.254" port="8080" protocol="HTTP/1.1" 
                 connectionTimeout="20000" 
                 redirectPort="8443" />
      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" address="172.17.66.254"/>
      <Engine name="Catalina" defaultHost="localhost" jvmRoute="172.17.66.254node">
      

      The worker node is unable to receive balancer's advertising. The tomcat actually listens for advertisements on enp1s0:10.16.88.181, because if I rebind the balancer to enp1s0:10.16.88.186, the whole setup suddenly works. I also verified it with the Advertize.java utility.

      Suggestion

      IMHO, we have to either make it configurable via listener's attribute or fetch the interface from one of the available connectors (sometimes AJP is not configured, sometimes HTTP(S) ain't – but at least one is always present).

      Attachments

        Issue Links

          Activity

            People

              rhn-engineering-rhusar Radoslav Husar
              mbabacek1@redhat.com Michal Karm
              Jean-Frederic Clere
              Michal Karm Michal Karm
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: