JMS clustering in Geronimo is handled by ActiveMQ component using blueprint services. you can configure brokers to be clustered, and a JMS request can failover to another broker if the JMS broker goes down using Master Slave functionality.
Prerequisite
Make sure the system module org/apache/geronimo/activemq-ra/3.0/car
is loaded during server startup. And then update config-substitutions.properties
file under the /var/config
directory to specify IP address or host name for each ActiveMQ node when the server is stopped.
ActiveMQHostname=hostname/IP
JMS clustering scenarios
There are different kinds of Master/Slave configurations available according to ActiveMQ documentation:
In Geronimo server, all those configurations are handled using blueprint services. You need to update the content of activemq.xml
within activemq-broker-blueprint-3.0.car
under /repository/org/apache/geronimo/configs/activemq-broker-blueprint/3.0
directory in accordance with the scenario you choose. The easier way would be to unzip activemq-broker-blueprint-3.0.car
and repack them after modification.
See the following configuration for each scenario in Geronimo
Pure Master Slave
With this scenario, you must specify the master and slave node explicitly and manually restart a failed master.
Master node
On the master node, you just need to specify that the current node is a master by using the brokerName attribute as follows.
... <cm:property name="serverHostname" value="masterIP"/> ...
Slave node
Because each master has only one slave in the Pure Master/Slave scenario, the slave node must know the URI of the master node and also be tagged as a slave node by using the brokerName attribute.
... <cm:property name="serverHostname" value="slaveIP"/> ...
Client connection
JMS clients use the failover:// protocol to locate brokers in a cluster. See the following example:
failover://(tcp://masterIP:61616,tcp://slaveIP:61616)?randomize=false
Shared File System
In this scenario, you must use a shared file system to provide high availability of brokers and automatic discovery of master/slave nodes. The shared folder must allow different slaves to have write permission.
Each node
On each node, configure a shared directory as the place where brokers are using the persistenceAdapter
element as follows:
... <cm:property name="serverHostname" value="broker1"/> ... <amq:persistenceAdapter> <amq:amqPersistenceAdapter directory="/sharedFileSystem/sharedBrokerData"/> </amq:persistenceAdapter> ...
Note that:
- For the shared file system on a Linux node, you must mount the shared directory first.
- For the shared file system on a Windows node, you can use the path such as
//ipAddress/sharedFolder
in the configuration. - On each node, broker1 should be replaced with the exact IP address of current node.
Client connection
JMS clients use the failover:// protocol to locate brokers in a cluster. See the following example:
failover://(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)?randomize=false
JDBC Master Slave
In this scenario, you must use a shared database as the persistence enginee and automatic recovery.
Each node
On each node, configure a shared database pool by using the jdbcPersistenceAdapter
element as follows. We use a remote Oracle database server as an example:
... <cm:property name="serverHostname" value="broker1"/> ... <amq:persistenceAdapter> <amq:jdbcPersistenceAdapter dataSource="#oracle-ds"/> </amq:persistenceAdapter> ... <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@dbServer:1521:AMQDB"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> <property name="maxActive" value="200"/> <property name="poolPreparedStatements" value="true"/> </bean> ...
Note that:
- For the database server, dbServer should be replaced with actual IP address of the database server.
- On each node, broker1 should be replaced with the exact IP address of current node.
Client connection
JMS clients use the failover:// protocol to locate brokers in a cluster. See the following example:
failover://(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)?randomize=false