Address resolution

The driver auto-detects new Cassandra nodes when they are added to the cluster by means of server-side push notifications and checking the system tables.

For each node, the address the driver receives the address set as rpc_address in the node’s cassandra.yaml file (or broadcast_rpc_address when defined). In most cases, this is the correct value, however, sometimes the addresses received in this manner are either not reachable directly by the driver or are not the preferred address to use. A common such scenario is a multi-datacenter deployment with a client connecting using the private IP address to the local datacenter (to reduce network costs) and the public IP address for the remote datacenter nodes.

The AddressTranslator interface

The AddressTranslator interface allows you to deal with such cases, by transforming the address sent by a Cassandra node to another address to be used by the driver for connection.

class MyAddressTranslator extends AddressTranslator {
  translate(address, port, callback) {
    // Your custom translation logic
  }
}

You then configure the driver to use your AddressTranslator implementation in the client options.

const client = new Client({
  contactPoints,
  localDataCenter,
  policies: { 
    addressResolution: new MyAddressTranslator() 
  }
});

Note: The contact points provided while creating the Client are not translated, only addresses retrieved from or sent by Cassandra nodes are.

EC2 multi-region

The EC2MultiRegionTranslator class is provided out of the box. It helps optimize network costs when your infrastructure (both Cassandra nodes and clients) is distributed across multiple Amazon EC2 regions:

  • a client communicating with a Cassandra node in the same EC2 region should use the node’s private IP address (which is less expensive);
  • a client communicating with a node in a different region should use the public IP address.

To use this implementation, provide an instance when initializing the Client object.

const dse = require('dse-driver');
const addressResolution = dse.policies.addressResolution;

const client = new dse.Client({
  contactPoints,
  localDataCenter,
  policies: { 
    addressResolution: new addressResolution.EC2MultiRegionTranslator() 
  }
});

The Client class performs a reverse DNS lookup of the origin address to find the domain name of the target instance. Then it performs a forward DNS lookup of the domain name; the EC2 DNS does the private to public switch automatically based on location.