June 13, 2013

Configure High-Availability Clustering using TCP Unicast with JBoss EAP 6, HTTPD, mod_cluster on RHEL 6

In my previous blogs I have written about HA in JBoss EAP 6 with Apache Webserver (httpd) and that is all done with UDP multicast. In this blog I will show you how to do it with TCP unicast.

/etc/httpd/conf.d/mod_cluster.conf

# mod_proxy_balancer should be disabled when mod_cluster is used
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule advertise_module modules/mod_advertise.so

MemManagerFile /var/cache/mod_cluster

<IfModule manager_module>
  #Listen 6666
  <VirtualHost *:80>

    KeepAliveTimeout 300
    MaxKeepAliveRequests 0
    EnableMCPMReceive on
    
    #ServerAdvertise on http://127.0.0.1:6666
    ServerAdvertise off
    AdvertiseFrequency 5
    #AdvertiseSecurityKey secret  
    #AdvertiseGroup 224.0.1.105:23364
 
    #AllowDisplay On
 
    <Location /mod_cluster_manager>
      SetHandler mod_cluster-manager
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1
    </Location>
  </VirtualHost>
</IfModule> 

standalone-ha.xml

In this example we are going to run all JBoss EAP server on the same machine and we are using standalone mode for simplicity reason. But the same apply if you want to run domain mode.

First configure JGroups to use TCP unicast.

        <subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="tcpping">
            ...
            <stack name="tcpping">
                <transport type="TCP" socket-binding="jgroups-tcp"/>
                <protocol type="TCPPING">
                    <property name="initial_hosts">127.0.0.1[7600],127.0.0.1[7800]</property>
                    <property name="port_range">0</property>
                    <property name="timeout">3600</property>
                    <property name="num_initial_members">2</property>
                </protocol>
                <protocol type="MERGE2"/>
                <protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/>
                <protocol type="FD"/>
                <protocol type="VERIFY_SUSPECT"/>
                <protocol type="BARRIER"/>
                <protocol type="pbcast.NAKACK"/>
                <protocol type="UNICAST2"/>
                <protocol type="pbcast.STABLE"/>
                <protocol type="pbcast.GMS"/>
                <protocol type="UFC"/>
                <protocol type="MFC"/>
                <protocol type="FRAG2"/>
                <protocol type="RSVP"/>
            </stack>
        </subsystem>

Secondly we need to configure modcluster subsystem in JBoss EAP 6 and set advertise="false" and proxy-list="127.0.0.1:80".

        <subsystem xmlns="urn:jboss:domain:modcluster:1.1">
            <mod-cluster-config advertise-socket="modcluster" proxy-list="127.0.0.1:80" advertise="false" connector="ajp">
                <dynamic-load-provider>
                    <load-metric type="busyness"/>
                </dynamic-load-provider>
            </mod-cluster-config>
        </subsystem>

Now lets restart Apache Webserver (httpd) and start two JBoss server. And last you must deploy a clusterable application.

$ service httpd restart

$ ./standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=jb1

$ ./standalone.sh --server-config=standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss.node.name=jb2

No comments: