The scope of this document to to define how Apache TomEE can be configured for HA (High Availability) clustering.  

The configuration will focus on two local instances, with a view to an open ended remote configuration.  

It is beyond the scope of this documentation to discuss Tomcat CLustering in depth.
Please read the [Apache Tomcat Clustering Howto](http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html) for more information.

###Local cluster
To test clustering locally (on the same physical machine) the default ports need to be modified on the second TomEE server.
You do not need to do this if the second TomEE instance is to run on different machine or virtual host.

Note: You cannot test load balancing on a local cluster as they will be running of different ports.
This configuration is only useful for testing Session Replication and application deployment.

In the [TomEE]/conf/server.xml look for and change the following port definitions to something like:

	<Server port="9005" shutdown="SHUTDOWN">

	<Connector port="9080" protocol="HTTP/1.1"
				   connectionTimeout="20000"
				   redirectPort="9443" />
				   
	<!--
	<Connector port="9443" protocol="HTTP/1.1" SSLEnabled="true"
			   maxThreads="150" scheme="https" secure="true"
			   clientAuth="false" sslProtocol="TLS" />
	-->

	<Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />

###Test Startup	
Start both TomEE servers together and check for and resolve any errors before proceeding any further.

Once you are sure both servers can run without error add the following to the **<Host>** section of both server.xml files:

	...
	<Engine name="Catalina" defaultHost="localhost">
		...
		<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
			
			<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 

Start both TomEE servers together and again check for and resolve any errors before proceeding any further.
Basically look in both [TomEE]/logs/catalina.[date].log and search for *"SimpleTcpCluster memberAdded"*.
This lets us know that the cluster added a new member.

Stop both the servers, as we will need to add some more configuration to the *server.xml*.

First create the following directory structure within the TomEE installation (You can change the names later to suit your needs if required).

	[TomEE]/cluster
	[TomEE]/cluster/temp
	[TomEE]/cluster/watch
	[TomEE]/cluster/webapps

We now need to add these paths to the **Host** section of the configuration file:
	
	...
	<Engine name="Catalina" defaultHost="localhost">
		...
		<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
			
			<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> 	
				<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
					tempDir="cluster/temp"
					deployDir="cluster/webapps"
					watchDir="cluster/watch"
					watchEnabled="true"/>
			</Cluster>
		...