Wildfly Standalone clustering
To set up a cluster of standalone servers you have two possibilites: nodes running on different machine (horizontal scaling) or running on the same machine (vertical scaling).
To make a wildfly standalone cluster with 2 nodes on the same machine you can follow the steps below:
1) copy the standalone folder and rename it to „standalone1“, „standalone2“
2) create 2 scripts in the /bin folder, to avoid typing all the parameter in the command line each time.
script1.sh
#!/bin/sh ./standalone.sh -Djboss.server.base.dir=$JBOSS_HOME/standalone1 -Djboss.node.name=server1 -c standalone-full-ha.xml
script2.sh
#!/bin/sh ./standalone.sh -Djboss.server.base.dir=$JBOSS_HOME/standalone2 -Djboss.node.name=server2 -c standalone-full-ha.xml -Djboss.socket.binding.port-offset=100
To bind the public interface to a specific address add the IP as parameter like the following :
-b 192.168.1.1
For the management console it´s something like:
-bmanagement=192.168.1.1
To bind to all available IPs set them to „0.0.0.0“ like:
-b 0.0.0.0 -bmanagement=192.168.1.1
The high availability configuration has default multicast addresses set to 230.0.0.4.
They can also be changed in the socket-binding section in the standalone xml file.
Alternatively you can add it as parameter like : -u=230.0.1.2
The port offset must be considered, if you need to run the cli for the second instance specify the port:
./jboss-cli.sh --controller=localhost:10090 --connect
3) Set the hornetQ clustering username and password.
The cluster nodes must have the same user und password otherwise you will get:
ERROR [org.hornetq.core.server] (default I/O-1) HQ224018: Failed to create session: HornetQClusterSecurityException[errorType=CLUSTER_SECURITY_EXCE PTION message=HQ119099: Unable to authenticate cluster user: HORNETQ.CLUSTER.ADMIN.USER]
To fix this add the cluster username and password in the subsystem messaging:2.0 for any standalone xml configuration file under the tag hornet1-server :
<clustered>true</clustered> <cluster-user>clusteruser</cluster-user> <cluster-password>cluster-secret</cluster-password>
Otherwise you can set to false if you don ́t need to cluster the messaging.
4) run the scripts in two different terminals (start with server 1).
5) deploy the app.
The clustering service will be initiated only if a cluster-enabled application is deployed.
In the web.xml of the application you need to add the distributable tag:
<distributable/>
You need to deploy the app in every server instance
You can try it with the app by Arun Gupta called „clustering“, that you can find at https://github.com/arun-gupta/wildfly-samples.
To make it a little simpler you can create a maven simple project and copy the content in the webapp folder (https://github.com/arun-gupta/wildfly-samples/tree/master/clustering/http/src/main/webapp).
Then you can edit the pom.xml like the following:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.demo</groupId> <artifactId>demo-clustered-app</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>Demo_Clustered_App</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
Run mvn package
. In the target folder you will find the .war file, that you can manually deploy in each management console.
At the following urls you will see that the node server names are different for the two urls but the session data is shared:
http://localhost:8080/demo-clustered-app-0.0.1-SNAPSHOT/index.jsp
http://localhost:8180/demo-clustered-app-0.0.1-SNAPSHOT/index.jsp
Once you get your app deployed on both instances in the logging of the server one you will see something like:
INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (Incoming-1,shared=udp) ISPN000094: Received new cluster view: [server1/web|1] (2) [server1/web, server2/web]
Defining a port offset is not the only way to set up a cluster on the same machine.
You can also define multiple IP addresses on the same machine (multihoming).