RDBMS : Failover

In the majority of production situations it is desirable to have a level of failover between the underlying datastores used for persistence. You have at least 2 options available to you here. These are shown below

Sequoia

Sequoia is a transparent middleware solution offering clustering, load balancing and failover services for any database. Sequoia is the continuation of the C-JDBC project. The database is distributed and replicated among several nodes and Sequoia balances the queries among these nodes. Sequoia handles node and network failures with transparent failover. It also provides support for hot recovery, online maintenance operations and online upgrades.

Sequoia can be used with DataNucleus by just providing the Sequoia datastore URLs as input to DataNucleus. There is a problem outstanding in Sequoia itself in that its JDBC driver doesnt provide DataNucleus with the correct major/minor versions of the underlying datastore. Until Sequoia fix this issue, use of Sequoia will be unreliable



DataNucleus Failover capability

DataNucleus has the capability to switch to between DataSources upon failure of one while obtaining a datastore connection. The failover mechanism is useful for applications with multiple database nodes when the data is actually replicated/synchronized by the underlying database. There are 2 things to be aware of before utilising this functionality.

  • DataNucleus doesn't replicate changes to all database nodes, and for this reason, this feature is suggested to be used only for reading objects or if the database is capable to replicate the changes to all nodes.
  • If a connection breaks while in use the failover mechanism will not handle it, thus the user application must take care of restarting the transaction and execute the operations.

Several failover algorithm are allowed to be used, one at time, as for example round-robin , ordered list or random . The default algorithm, ordered list, is described below and is provided by DataNucleus. You can also implement and plug your own algorithm. See Connection Provider.

To use failover, each datastore connection must be provided through DataSources. The datanucleus.ConnectionFactoryName property must be declared with a list of JNDI names pointing to DataSources, in the form of <JNDINAME> [,<JNDINAME>] . See the example:

datanucleus.ConnectionFactoryName=JNDINAME1,JNDINAME2

At least one least one JNDI name must be declared.



The Ordered List Algorithm (default) allows you to switch to slave DataSources upon failure of a master DataSource while obtaining a datastore connection. This is shown below.

Each time DataNucleus needs to obtain a connection to the datastore, it takes the first DataSource, the Master, and tries, on failure to obtain the connection goes to the next on the list until it obtains a connection to the datastore or the end of the list is reached.

The first JNDI name in the datanucleus.ConnectionFactoryName property is the Master DataSource and the following JNDI names are the Slave DataSources.