Steps to make an existing JNDI HornetQ service as HA?

JavaJbossJndiHornetq

Java Problem Overview


TL;DR

What are the steps to configure a HA-JNDI service with a HornetQ setup? I believe the documentation is a little scattered. I have read through the docs here but doesn't seem to illustrate in detail.

Longer version:

So we have a HornetQ JMS setup along with JNDI. We have say 5 servers, that run the HornetQ JMS primary instance with JNDI service on each. On each of these 5 servers, we also have a secondary instance running for some other HornetQ primary instance.

To illustrate:

Server A - HornetQa_primary, JNDI, HornetQb_secondary
Server B - HornetQb_primary, JNDI, HornetQc_secondary
Server C - HornetQc_primary, JNDI, HornetQd_secondary
Server D - HornetQd_primary, JNDI, HornetQe_secondary
Server E - HornetQe_primary, JNDI, HornetQa_secondary

Each of these HornetQ servers serve as middleware for our various backend needs, so that means 5 servers, 5 HornetQ primary instances, 5 HornetQ secondary instances and 5 JNDI servers. The problem, however, with this setup is that if a server host (not just the process, the host itself), say A goes down, ideally the service should fallback to the HornetQ running on server E which hosts A's HornetQ secondary. However, to resume as HornetQ primary, the HornetQa_secondary needs to talk to the JNDI process running on server A (I presume to replicate messages). Since the host A is itself down, the HornetQa_secondary running on E has no way to talk to the JNDI on A, and thus, cannot resume as the primary process.

Had the JNDI service been highly available, the secondary HornetQ process could resume as primary as expected. Can anyone point to the docs or illustrate in simple steps how we could convert our existing setup to a HA-JNDI? For what it's worth, I have read multiple sources, but it doesn't seem to illustrate in much detail about how to get going with configuring a HA-JNDI. Please let me know if you need more info about our current setup.

Java Solutions


Solution 1 - Java

With the architecture described it seems difficult to me, because indeed you need to reconfigure the slave as master and then you will have a certain outage.

> HornetQ HA is provided via a live-backup pair and load-balancing is > provided via a cluster. > > If you want both HA and load-balancing then you will need 2 > live-backup pairs clustered together. > > Source: https://developer.jboss.org/thread/254232

You can reference the master not by the hostname but using a virtual IP address, so that in case the master is down, you can reconfigure one of the slaves as master, and start the virtual ip so you don't have to reconfigure the rest of the slaves. (To keep HA even when the master is down, you want to have 2 slaves, so that you can restart one of them as master and still one will be running).

Another way to achieve the same result is with a DNS hostname specific for the master that you can reconfigure to point to a different IP if one host is down. Since DNS is cached, this entries should better be in the 'hosts' file.

If 3 hosts per HA-domain is too much hardware, you can accomplish this easier with virtual servers without the need to purchase more hardware.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongravetiiView Question on Stackoverflow
Solution 1 - JavaJose Manuel Gomez AlvarezView Answer on Stackoverflow