Chapter 29. Using Red Hat JBoss Data Grid with Microsoft Azure

While JBoss Data Grid is fully supported on Microsoft Azure, the default discovery mechanism, UDP multicasting, is not supported in this environment. If the cluster needs to dynamically add or remove members one of the following protocols should be used:
  • JDBC_PING - Discovery protocol that utilizes a shared database.
  • TCPGOSSIP - Discovery protocol that utilizes shared GossipRouter processes.
Alternatively, if there is a fixed set of nodes in the cluster then TCPPING may be used instead. An example configuration using TCPPING is found in Section 26.1.3, “Configure JGroups Socket Binding”.

29.1. The JDBC_PING JGroups Protocol

The JDBC_PING discovery protocol uses a shared database to store information about the nodes in the cluster. With Microsoft Azure this should be a SQL database, and once the database has been created the JDBC connection URL may be performing the following steps:
  1. Select the properties of the SQL Database to be used.
  2. Navigate to the Connection Propertiessection and click the Show database connection strings link
  3. Click JDBC Connection URL. This value will be used for the connection_url property when configuring JDBC_PING.
Once the connection_url has been retrieved, the SQL Driver may be obtained from Microsoft JDBC Drivers for SQL Server. This driver will be used in the following steps.
JDBC_PING Parameters

The following parameters must be defined, and are used to connect to the SQL database:

  • connection_url - the JDBC Connection URL obtained in the above steps.
  • connection_username - The database username, obtained from the connection_url.
  • connection_password - The database password, obtained from the connection_url.
  • connection_driver - The driver used to connect to the database. The application or server must include the JDBC driver JAR file on the classpath.

Configuring JBoss Data Grid to use JDBC_PING (Library Mode)

In Library Mode the JGroups xml file should be used to configure JDBC_PING; however, there is no JDBC_PING configuration included by default. It is recommended to use one of the preexisting files specified in Section 26.2.2, “Pre-Configured JGroups Files” and then adjust the configuration to include JDBC_PING. For instance, default-configs/default-jgroups-ec2.xml could be selected and the S3_PING protocol removed, and then the following block added in its place:

<JDBC_PING connection_url="${jboss.jgroups.jdbc_ping.connection_url:}"  
   connection_username="${jboss.jgroups.jdbc_ping.connection_username:}"  
   connection_password="${jboss.jgroups.jdbc_ping.connection_password:}"  
   connection_driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"  
/>

Configuring JBoss Data Grid to use JDBC_PING (Remote Client-Server Mode)

In Remote Client-Server Mode a stack may be defined for JDBC_PING in the jgroups subsystem of the server's configuration file. The following configuration snippet contains an example of this:

<subsystem xmlns="urn:infinispan:server:jgroups:6.1" default-stack="${jboss.default.jgroups.stack:jdbc_ping}">
[...]
    <stack name="jdbc_ping">
        <transport type="TCP" socket-binding="jgroups-tcp"/>
        <protocol type="JDBC_PING">
            <property name="connection_url">
                ${jboss.jgroups.jdbc_ping.connection_url:}
            </property>
            <property name="connection_username">${jboss.jgroups.jdbc_ping.connection_username:}</property>
            <property name="connection_password">${jboss.jgroups.jdbc_ping.connection_password:}</property>
            <property name="connection_driver">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        </protocol>
        <protocol type="MERGE3"/>
        <protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/>
        <protocol type="FD_ALL"/>
        <protocol type="VERIFY_SUSPECT"/>
        <protocol type="pbcast.NAKACK2">
            <property name="use_mcast_xmit">false</property>
        </protocol>
        <protocol type="UNICAST3"/>
        <protocol type="pbcast.STABLE"/>
        <protocol type="pbcast.GMS"/>
        <protocol type="MFC"/>
        <protocol type="FRAG2"/>
    </stack>
[...]
</subsystem>