HARP Proxy

HARP Proxy is a daemon which acts as an abstraction layer between the client application and Postgres. It interfaces with the Consensus Layer to obtain the identity of the current Lead Master node and directs traffic to that location. In the event of a planned switchover or unplanned failover, it will automatically redirect to the new Lead Master node as dictated by the DCS.

You may select between pgbouncer or builtin for HARP Proxy. When using pgbouncer, HARP Proxy is an interface layer between the DCS and PgBouncer. As such, PgBouncer is a prerequisite and should be installed in addition, in order for HARP Proxy to fully manage its activity.

The builtin proxy does not require any additional software. When using builtin, HARP Proxy functions as a level 4 pass-through proxy.

PgBouncer

How it Works

Upon starting, HARP Proxy will launch PgBouncer if it is not already running, and leave client connections in a paused state. Afterwards, it will contact the DCS to determine the identity of the Lead Master, configure PgBouncer to use this as the target for database connections, and resume connection activity. All application client traffic will then pass through PgBouncer into the current Lead Master node for the Location where this proxy is operating.

While PgBouncer is running, HARP Proxy will check its status based on the monitor_interval configuration setting within the DCS, and store it in the DCS for monitoring purposes. This will allow interrogation with harpctl to retrieve status of all configured proxies, or any one proxy in particular.

In the event the Lead Master lease is not set, HARP Proxy will pause all connection traffic until a new Lead Master is established. This also applies to circumstances when harpctl promote is used to invoke a planned transition to a new Lead Master. It uses a PgBouncer PAUSE command for this, so existing sessions are allowed to complete any pending transactions before they are held in stasis.

Configuration

HARP Proxy expects the dcs, cluster, and proxy configuration stanzas. The following is a functional example:

cluster:
  name: mycluster

dcs:
  driver: etcd
  endpoints:
    - host1:2379
    - host2:2379
    - host3:2379

proxy:
  name: proxy1

Usage

This is the basic usage for HARP Proxy:

Usage of ./harp-proxy:
  -f string
        Optional path to config file (shorthand)
  --config string
        Optional path to config file

Note that there are no arguments to launch harp-proxy as a forked daemon. This software is designed to be launched through systemd or within a container as a top-level process. This also means output is directed to STDOUT and STDERR for capture and access through journald or an attached container terminal.

PgBouncer Configuration File

Since HARP Proxy currently utilizes PgBouncer for connection management and redirection, a pgbouncer.ini file must exist. HARP Manager builds this file based on various run-time directives as defined in the

Proxy Directives documentation.

This file will be located in the same folder as the config.yml used by HARP Proxy. Any PgBouncer process launched by HARP Proxy will use this configuration file, and it may be used for debugging or information purposes. Modifications to this automatically generated pgbouncer.ini file will be lost any time HARP Proxy is restarted, so use harpctl set proxy to alter these settings instead. Calling harpctl set proxy does not update the pgbouncer.ini file until the proxy has been restarted.

Disabling and Re-enabling HARP Proxy Node Management

It is possible to temporarily pause HARP Proxy control of PgBouncer. This results in a state where the daemon continues running but does not perform any operations that could affect existing behavior of the cluster. Re-enabling management causes it to resume operation.

An example of temporarily disabling management of a specific proxy would be:

harpctl unmanage proxy proxy1

See the harpctl Command-line Tool documentation for more details.

Proxy node management is enabled by default.

Passthrough User Authentication

We strongly recommend configuring HARP Proxy to use the auth_user and auth_query run-time directives. If these are not set, the PgBouncer userlist.txt file must include username and password hash combinations for every user PgBouncer needs to authenticate on Postgres’ behalf.

this should not be the pgbouncer user itself, as this is utilized by HARP Proxy as an admin-level user in order to operate the underlying PgBouncer service.

In clusters administered by TPAexec, a function will be created and installed in the pg_catalog schema in the template1 database during provisioning. This means any subsequently created databases will also include the function, and it will be available to PgBouncer regardless of which database the user is attempting to contact.

If TPAexec is not used, we still recommend this function definition:

CREATE OR REPLACE FUNCTION pg_catalog.pgbouncer_get_auth(p_usename TEXT)
RETURNS TABLE(username TEXT, password TEXT) AS $$
BEGIN
  RETURN QUERY
  SELECT usename::TEXT, passwd::TEXT FROM pg_catalog.pg_shadow
   WHERE usename = p_usename;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER

REVOKE ALL ON FUNCTION pg_catalog.pgbouncer_get_auth(p_usename TEXT)
  FROM PUBLIC

GRANT EXECUTE ON FUNCTION pg_catalog.pgbouncer_get_auth(p_usename TEXT)
   TO <auth_user>;

Don’t forget to substitute <auth_user> for the auth_user field supplied to HARP Proxy.

Then in the Bootstrap file, the following will complete the configuration:

cluster:
  name: mycluster

proxies:
  monitor_interval: 5
  default_pool_size: 20
  max_client_conn: 1000
  auth_user: pgb_auth
  auth_query: "SELECT * FROM pg_catalog.pgbouncer_get_auth($1)"
  database_name: bdrdb
  instances:
    - name: proxy1
    - name: proxy2

It is also possible to define these fields with harpctl set proxy:

harpctl set proxy global auth_user=pgb_auth

Note

This means the postgres or enterprisedb OS user that launches HARP Proxy will need a .pgpass file so that auth_user can authenticate against Postgres.

Builtin Proxy

How it Works

Upon starting, HARP Proxy will listen for incoming connections on the listening address and listening port specified in the bootstrap file per proxy instance. All application client traffic will then pass through Builtin Proxy into the current Lead Master node for the Location where this proxy is operating.

In the event the Lead Master lease is not set, HARP Proxy will disconnect all connection traffic until a new Lead Master is established. This also applies to circumstances when harpctl promote is used to invoke a planned transition to a new Lead Master. The disconnect is immediate.

Configuration

HARP Proxy expects the dcs, cluster, and proxy configuration stanzas. The following is a functional example:

cluster:
  name: mycluster

dcs:
  driver: etcd
  endpoints:
    - host1:2379
    - host2:2379
    - host3:2379

proxy:
  name: proxy1

Usage

This is the basic usage for HARP Proxy:

Usage of ./harp-proxy:
  -f string
        Optional path to config file (shorthand)
  --config string
        Optional path to config file

Note that there are no arguments to launch harp-proxy as a forked daemon. This software is designed to be launched through systemd or within a container as a top-level process. This also means output is directed to STDOUT and STDERR for capture and access through journald or an attached container terminal.