In the case of unexpected errors on the primary for longer than the
.spec.failoverDelay (by default
0 seconds), the cluster will go into
failover mode. This may happen, for example, when:
- The primary pod has a disk failure
- The primary pod is deleted
postgrescontainer on the primary has any kind of sustained failure
In the failover scenario, the primary cannot be assumed to be working properly.
After cases like the ones above, the readiness probe for the primary pod will start failing. This will be picked up in the controller's reconciliation loop. The controller will initiate the failover process, in two steps:
- First, it will mark the
pending. This change of state will force the primary pod to shutdown, to ensure the WAL receivers on the replicas will stop. The cluster will be marked in failover phase ("Failing over").
- Once all WAL receivers are stopped, there will be a leader election, and a new primary will be named. The chosen instance will initiate promotion to primary, and, after this is completed, the cluster will resume normal operations. Meanwhile, the former primary pod will restart, detect that it is no longer the primary, and become a replica node.
The two-phase procedure helps ensure the WAL receivers can stop in an orderly fashion, and that the failing primary will not start streaming WALs again upon restart. These safeguards prevent timeline discrepancies between the new primary and the replicas.
During the time the failing primary is being shut down:
- It will first try a PostgreSQL's fast shutdown with
.spec.switchoverDelayseconds as timeout. This graceful shutdown will attempt to archive pending WALs.
- If the fast shutdown fails, or its timeout is exceeded, a PostgreSQL's immediate shutdown is initiated.
"Fast" mode does not wait for PostgreSQL clients to disconnect and will terminate an online backup in progress. All active transactions are rolled back and clients are forcibly disconnected, then the server is shut down. "Immediate" mode will abort all PostgreSQL server processes immediately, without a clean shutdown.
RTO and RPO impact
Failover may result in the service being impacted and/or data being lost:
- During the time when the primary has started to fail, and before the controller starts failover procedures, queries in transit, WAL writes, checkpoints and similar operations, may fail.
- Once the fast shutdown command has been issued, the cluster will no longer accept connections, so service will be impacted but no data will be lost.
- If the fast shutdown fails, the immediate shutdown will stop any pending processes, including WAL writing. Data may be lost.
- During the time the primary is shutting down and a new primary hasn't yet started, the cluster will operate without a primary and thus be impaired - but with no data loss.
The timeout that controls fast shutdown is set by
as in the case of a switchover. Increasing the time for fast shutdown is safer
from an RPO point of view, but possibly delays the return to normal operation -
negatively affecting RTO.
As already mentioned in the "Instance Manager" section
when explaining the switchover process, the
affects the RPO and RTO of your PostgreSQL database. Setting it to a low value,
might favor RTO over RPO but lead to data loss at cluster level and/or backup
level. On the contrary, setting it to a high value, might remove the risk of
data loss while leaving the cluster without an active primary for a longer time
during the switchover.
As anticipated above, the
.spec.failoverDelay option allows you to delay the start
of the failover procedure by a number of seconds after the primary has been
detected to be unhealthy. By default, this setting is set to
0, triggering the
failover procedure immediately.
Sometimes failing over to a new primary can be more disruptive than waiting for the primary to come back online. This is especially true of network disruptions where multiple tiers are affected (i.e., downstream logical subscribers) or when the time to perform the failover is longer than the expected outage.
Enabling a new configuration option to delay failover provides a mechanism to prevent premature failover for short-lived network or node instability.