Patroni Dynamic Configuration
These parameters are stored in the DCS (etcd) under /service/<scope>/config and
applied to every member of the cluster. Modify them with pg ha edit-config:
Reference: Patroni official docs, Pigsty dynamic config.
bootstrap.dcsis one-time. Thebootstrap.dcsblock inpatroni.ymlonly takes effect when the first member of a scope bootstraps the cluster. Once Patroni writes the config into the DCS, subsequent changes tobootstrap.dcsin the YAML file are completely ignored — even on re-install (pg ha create). Re-runningpg ha createdoes not re-readbootstrap.dcs— Patroni sees the existingconfigkey in the DCS and uses it directly.
| Method | Description |
|---|---|
pg ha edit-config app -- -s key=value |
Recommended — pgcli’s standard way |
pg ha ctl app -- edit-config |
Passthrough to patronictl, same effect |
Patroni REST API (PATCH /config) |
Requires access to a member’s REST API port |
Core timing parameters
| Parameter | Default | Min | Description |
|---|---|---|---|
loop_wait |
10 |
1 | Seconds the main loop sleeps between iterations (lock renewal, DCS updates, state refresh) |
ttl |
30 |
20 | Leader lock TTL in seconds. Effectively the wait time before auto-failover triggers |
retry_timeout |
10 |
3 | DCS and PostgreSQL operation retry timeout. If the DCS or network is down for less than this, Patroni does not demote the leader |
Constraint when changing
loop_wait,retry_timeout, orttl:
Failover parameters
| Parameter | Default | Description |
|---|---|---|
maximum_lag_on_failover |
1048576 |
Maximum replication lag (bytes) for a replica to be eligible for leader promotion |
maximum_lag_on_syncnode |
-1 |
Maximum lag (bytes) before a synchronous standby is replaced by a healthy async one. When ≤ 0, Patroni does not replace unhealthy sync standbys. Set high enough to avoid frequent replacement during high-transaction workloads |
max_timelines_history |
0 |
Max timeline history entries kept in the DCS. 0 = keep all |
primary_start_timeout |
300 |
Seconds the leader has to recover from a failure before failover triggers. 0 = immediate failover on crash detection (may lose transactions with async replication). Max failover time = loop_wait + primary_start_timeout + loop_wait; with 0, just loop_wait |
primary_stop_timeout |
— | Seconds to wait when stopping PostgreSQL (only effective with synchronous_mode). If the stop exceeds this timeout, Patroni sends SIGKILL to the postmaster. ≤ 0 or unset = no effect |
failover_timeout |
0 |
Seconds to wait before triggering failover after the leader is lost. 0 = immediate |
Replication mode
| Parameter | Default | Description |
|---|---|---|
synchronous_mode |
false |
Enable synchronous replication (off / on / quorum). The leader manages synchronous_standby_names; only the last-known leader or a sync standby may run for leader. Guarantees zero data loss at the cost of write unavailability when durability cannot be assured |
synchronous_mode_strict |
false |
When no sync standby is available, refuse to disable sync replication — blocks all client writes to the leader |
synchronous_node_count |
1 |
Number of synchronous standby nodes. Dynamically adjusted as members join/leave. Clamped to the number of eligible nodes |
failsafe_mode |
false |
Enable DCS failsafe mode: when the DCS is unreachable, the leader keeps running instead of demoting itself |
PostgreSQL settings
| Parameter | Default | Description |
|---|---|---|
postgresql.use_pg_rewind |
false |
Use pg_rewind to rejoin a failed leader (faster than full pg_basebackup). Requires data page checksums (--data-checksums at initdb) or wal_log_hints=on |
postgresql.use_slots |
true |
Use replication slots (prevents WAL loss when a replica disconnects). Default on PostgreSQL 9.4+ |
postgresql.pg_hba |
— | Rules for generating pg_hba.conf. Ignored if the PostgreSQL hba_file parameter is set to a non-default value |
postgresql.pg_ident |
— | Rules for generating pg_ident.conf. Ignored if ident_file is non-default |
postgresql.parameters |
— | PostgreSQL GUCs as key-value pairs, e.g. {max_connections: 100, wal_level: "replica", wal_log_hints: "on"}. Many are required for replication to work |
postgresql.recovery_conf |
— | Additional recovery.conf entries for standby configuration (PG12+ handled transparently) |
Set PostgreSQL parameters via the postgresql.parameters key:
Standby cluster
If defined, the cluster bootstraps as a standby cluster that streams from a remote primary.
| Parameter | Description |
|---|---|
standby_cluster.host |
Remote primary address |
standby_cluster.port |
Remote primary port |
standby_cluster.primary_slot_name |
Slot name for replication (optional, defaults to member name) |
standby_cluster.create_replica_methods |
Ordered list of methods to bootstrap the standby leader from the remote primary |
standby_cluster.restore_command |
WAL restore command |
standby_cluster.archive_cleanup_command |
Archive cleanup command for the standby leader |
standby_cluster.recovery_min_apply_delay |
Delay before applying WAL records |
Replication slots
| Parameter | Default | Description |
|---|---|---|
member_slots_ttl |
30min |
How long a replica’s physical replication slot is retained after it shuts down. 0 = delete immediately when the member key expires from the DCS. Only effective on PostgreSQL 11+ |
slots |
— | Permanent replication slots (hash map). Preserved across switchover/failover. Physical slots on PG11+ are created on all nodes and advanced every loop_wait seconds. Logical slots are copied from primary to replicas via restart, then advanced every loop_wait seconds. Requires use_slots: true |
ignore_slots |
— | Slots managed externally that Patroni should not touch (list of attribute sets). Any subset match causes the slot to be ignored |
Permanent slots example
Node-pinned physical slots
For a fixed cluster topology, define a permanent physical slot per node to prevent slot deletion during temporary outages:
Warning: Permanent replication slots are synced from the primary/standby_leader to replicas only. Applications should use them on the leader node. Using permanent slots on replicas causes unbounded
pg_walgrowth across the cluster. Exception: physical slots matching a Patroni member name (created and maintained by Patroni) are synced across all nodes for inter-node replication.
Viewing the current configuration
Or read directly from etcd: