Load Balancing in ADO.NET

Native Connection Load Balancing

Native connection load balancing helps spread the overhead caused by client connections on the hosts in the Vertica database. Both the server and the client must enable native connection load balancing. If enabled by both, then when the client initially connects to a host in the database, the host picks a host to handle the client connection from a list of the currently up hosts in the database, and informs the client which host it has chosen.If the initially-contacted host does not choose itself to handle the connection, the client disconnects, then opens a second connection to the host selected by the first host. The connection process to this second host proceeds as usual—if SSL is enabled, then SSL negotiations begin, otherwise the client begins the authentication process. See About Native Connection Load Balancing for details.

To enable native load balancing on your client, set the ConnectionLoadBalance connection parameter to true either in the connection string or using the ConnectionStringBuilder(). The following example demonstrates connecting to the database several times with native connection load balancing enabled, and fetching the name of the node handling the connection from the V_MONITOR.CURRENT_SESSION system table.

using System;
using System.Text;
using System.Data;
using Vertica.Data.VerticaClient;

namespace ConsoleApplication1 {
	class Program {
		static void Main(string[] args) {
			VerticaConnectionStringBuilder builder = new VerticaConnectionStringBuilder();
			builder.Host = "v_vmart_node0001.example.com";
			builder.Database = "VMart";
			builder.User = "dbadmin";
			// Enable native client load balancing in the client,
			// must also be enabled on the server!
			builder.ConnectionLoadBalance = true;
			
			// Connect 3 times to verify a new node is connected 
			// for each connection.
			for (int i = 1; i <= 4; i++) {
				try {
					VerticaConnection _conn = new VerticaConnection(builder.ToString());
					_conn.Open();
					if (i == 1) {
						// On the first connection, check the server policy for load balance
						VerticaCommand sqlcom = _conn.CreateCommand();
						sqlcom.CommandText = "SELECT LOAD_BALANCE_POLICY FROM V_CATALOG.DATABASES";
						var returnValue = sqlcom.ExecuteScalar();
						Console.WriteLine("Status of load balancy policy 
			 on server: " + returnValue.ToString() + "\n");
					}
					VerticaCommand command = _conn.CreateCommand();
					command.CommandText = "SELECT node_name FROM V_MONITOR.CURRENT_SESSION";
					VerticaDataReader dr = command.ExecuteReader();
					while (dr.Read()) {
						Console.Write("Connect attempt #" + i + "... ");
						Console.WriteLine("Connected to node " + dr[0]);
					}
					dr.Close();
					_conn.Close();
					Console.WriteLine("Disconnecting.\n");
				}
				catch(Exception e) {
					Console.WriteLine(e.Message);
				}
			}
		}
	}
}

Running the above example produces the following output:

Status of load balancing policy on server: roundrobin

Connect attempt #1... Connected to node v_vmart_node0001
Disconnecting.

Connect attempt #2... Connected to node v_vmart_node0002
Disconnecting.

Connect attempt #3... Connected to node v_vmart_node0003
Disconnecting.

Connect attempt #4... Connected to node v_vmart_node0001
Disconnecting.

Hostname-based Load Balancing

You can also balance workloads by resolving a single hostname to multiple IP addresses. The ADO.NET client driver load balances by automatically resolving the hostname to one of the specified IP addresses at random.

For example, suppose the hostname verticahost.example.com has the following entries in C:\Windows\System32\drivers\etc\hosts:

192.0.2.0 verticahost.example.com
192.0.2.1 verticahost.example.com
192.0.2.2 verticahost.example.com

Specifying the hostname verticahost.example.com randomly resolves to one of the listed IP addresses.