Read replicas

Introduction

Hasura Cloud can load balance queries and subscriptions across read replicas while sending all mutations and metadata API calls to the primary.

Adding read replica urls

Postgres

Head to Data -> Manage -> <db-name> -> Edit

Connect database with read replica

You can add read replicas for a database by adding their config to the /metadata/databases/database.yaml file:

- name: <db-name>
  kind: postgres
  configuration:
    connection_info:
      database_url:
        from_env: <DATABASE_URL_ENV>
      pool_settings:
        idle_timeout: 180
        max_connections: 50
        retries: 1
    read_replicas:
    - database_url:
        from_env: <DATABASE_REPLICA_URL_ENV>
      pool_settings:
        idle_timeout: 180
        max_connections: 50
        retries: 1

Apply the metadata by running:

hasura metadata apply

You can add read replicas for a database using the pg_add_source metadata API

POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin

{
  "type": "pg_add_source",
  "args": {
    "name": "<db_name>",
    "replace_configuration": true,
    "configuration": {
      "connection_info": {
        "database_url": {
          "from_env": "<DATABASE_URL_ENV>"
        }
      },
    "read_replicas": [
      {
        "database_url": {
          "from_env": "<DATABASE_REPLICA_URL_ENV>"
        },
        "pool_settings": {
          "retries": 1,
          "idle_timeout": 180,
          "max_connections": 50
        }
      }
    ]
  }
}

For existing v1.3 projects

If you have configured your Postgres instances with replicas, the replica URLs can be added to Hasura using the following environment variable in your project ENV Vars tab:

HASURA_GRAPHQL_READ_REPLICA_URLS=postgres://user:password@replica-host:5432/db

If you have multiple replicas, their urls can be added as comma separated values.

Additional environment variables for read replicas specifically:

HASURA_GRAPHQL_CONNECTIONS_PER_READ_REPLICA

HASURA_GRAPHQL_STRIPES_PER_READ_REPLICA

MS SQL Server

Support will be added soon

You can add read replicas for a database by adding their config to the /metadata/databases/database.yaml file:

- name: <db-name>
  kind: mssql
  configuration:
     connection_info:
       connection_string: <DATABASE_URL>
       pool_settings:
         idle_timeout: 180
         max_connections: 50
     read_replicas:
       - connection_string: <DATABASE_REPLICA_URL>
         pool_settings:
           idle_timeout: 25,
           max_connections: 100

Apply the metadata by running:

hasura metadata apply

You can add read replicas for a database using the using the mssql_add_source metadata API

POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin

{
  "type":"mssql_add_source",
  "args":{
      "name":"<db_name>",
      "replace_configuration": true,
      "configuration":{
        "connection_info":{
            "connection_string":{
              "from_env":"<DATABASE_URL>"
            },
            "pool_settings":{
              "max_connections":50,
              "idle_timeout":180
            },
            "read_replicas":[
              {
                  "connection_string":"<DATABASE_REPLICA_URL>",
                  "pool_settings":{
                    "idle_timeout":180,
                    "max_connections":50
                  }
              }
            ]
        }
      }
  }
}