Introduction
A common use case for Neo4j HA clusters is to direct all write requests to the master while using slaves for read operations, distributing the read load across the cluster and and gain failover capabilities for your deployment. The most common way to achieve this is to place a load balancer in front of the HA cluster, an example being shown with HA Proxy. As you can see in that guide, it makes use of a REST endpoint to discover which instance is the master and direct write load to it. In this section, we’ll deal with this REST endpoint and explain its semantics.
The endpoints
Each HA instance comes with 3 endpoints regarding its HA status. They are complimentary but each may be used depending on your load balancing needs and your production setup. Those are:
-
/db/manage/server/ha/master -
/db/manage/server/ha/slave -
/db/manage/server/ha/available
The /master and /slave endpoints can be used to direct write and non-write traffic respectively to specific
instances. This is the optimal way to take advantage of Neo4j’s scaling characteristics. The /available endpoint
exists for the general case of directing arbitrary request types to instances that are available for transaction
processing.
To use the endpoints, perform an HTTP GET operation on either and the following will be returned:
HA REST endpoint responses
| Endpoint | Instance State | Returned Code | Body text |
|---|---|---|---|
| Master |
|
|
Slave |
|
| |
Unknown |
|
| |
| Master |
|
|
Slave |
|
| |
Unknown |
|
| |
| Master |
|
|
Slave |
|
| |
Unknown |
|
|
Examples
From the command line, a common way to ask those endpoints is to use curl.
With no arguments, curl will do an HTTP GET on the URI provided and will output the body text, if any.
If you also want to get the response code, just add the -v flag for verbose output. Here are some examples:
-
Requesting
masterendpoint on a running master with verbose output
#> curl -v localhost:7474/db/manage/server/ha/master * About to connect() to localhost port 7474 (#0) * Trying ::1... * connected * Connected to localhost (::1) port 7474 (#0) > GET /db/manage/server/ha/master HTTP/1.1 > User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5 > Host: localhost:7474 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: text/plain < Access-Control-Allow-Origin: * < Transfer-Encoding: chunked < Server: Jetty(6.1.25) < * Connection #0 to host localhost left intact true* Closing connection #0
-
Requesting
slaveendpoint on a running master without verbose output:
#> curl localhost:7474/db/manage/server/ha/slave false
-
Finally, requesting the
masterendpoint on a slave with verbose output
#> curl -v localhost:7475/db/manage/server/ha/master * About to connect() to localhost port 7475 (#0) * Trying ::1... * connected * Connected to localhost (::1) port 7475 (#0) > GET /db/manage/server/ha/master HTTP/1.1 > User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5 > Host: localhost:7475 > Accept: */* > < HTTP/1.1 404 Not Found < Content-Type: text/plain < Access-Control-Allow-Origin: * < Transfer-Encoding: chunked < Server: Jetty(6.1.25) < * Connection #0 to host localhost left intact false* Closing connection #0
| Unknown status
The |