High availability and read replicas
Keep Plexivo Postgres serving through a failure with a standby, and spread reads across replicas.
A standby keeps your database serving when its server fails. Read replicas take read traffic off the primary. You can have both.
Standby and automatic failover#
A standby is a second, up-to-date copy of your database. If the primary fails, Plexivo promotes the standby automatically, at the same address and with the same user and password, so your app reconnects without a change.
The standby confirms every committed transaction before your app hears that it committed, so a failover loses no committed data.
- Business: every database includes a standby.
- Developer, Startup and Enterprise: tick Standby with automatic failover when you create the database.
A standby is one more instance of your database, shown in the price before you create it.
Read replicas#
Read replicas are live, read-only copies that can lag slightly behind the primary. Send reports, dashboards and other heavy reads to them, and keep the primary for writes.
- Open the Replicas tab. It shows how many your plan allows.
- Set Read replicas with the stepper and check the new monthly price.
- Apply it. Choose Add 1 replica (or as many as you added). New replicas join once they have copied the data. Remove works the same way.
| Plan | Read replicas per database |
|---|---|
| Developer | Not included |
| Startup | 1 |
| Business | 2 |
| Enterprise | Up to 5 |
Each replica is one more instance of the database at its size, charged by the day.
The read-only address#
Once a database has replicas, the Replicas tab shows its Read-only address (this project). It spreads connections across the replicas and takes the same user, password and CA certificate as the primary. It is a private address, for apps and Plexivo Kubernetes workloads in the same project. Apps you connect to the database receive it as DATABASE_READ_URL.
import pg from 'pg';
const primary = new pg.Pool({ connectionString: process.env.DATABASE_URL });
const reads = new pg.Pool({ connectionString: process.env.DATABASE_READ_URL ?? process.env.DATABASE_URL });
await primary.query('insert into orders (total) values ($1)', [1299]);
const { rows } = await reads.query('select count(*) from orders');Until you send reads to the read-only address, your apps keep using the primary.
Maintenance with a standby#
Updates are applied to replicas first. A database with a standby then switches over to an updated copy in seconds, instead of stopping; a database without one restarts once, for about a minute. An update that does not come up healthy is rolled back automatically. See Maintenance and patches.
Next steps#
Updated 27 October 2026