Introduction
Patroni introduction, quick start, and core high-availability concepts.
Running Patroni on memory-restricted systems with Python 3.11+
If you run Patroni on a system with strict memory limits, for example with vm.overcommit_memory=2 (recommended for PostgreSQL), and use Python 3.11 or newer, you may observe unexpected behavior:
Exception ignored in thread started by: <object repr() failed>, MemoryErrornot enough memory for the allocationThis behavior is caused by a bug in Python 3.11+. Under strict memory conditions, starting a new thread may hang indefinitely when there is not enough free memory.
Recent Patroni releases (4.1.1+, 4.0.8+) reduce the impact of this issue by starting all required threads early during startup, before the system is under memory pressure.
When running with vm.overcommit_memory=2 (recommended for PostgreSQL), we also recommend starting Patroni with the following environment variables configured:
MALLOC_ARENA_MAX=1 - reduces the amount of virtual memory allocated by glibc for multi-threaded applicationsPG_MALLOC_ARENA_MAX= - resets the value of MALLOC_ARENA_MAX for PostgreSQL processes started by Patroni.In addition, you may tune the following Patroni configuration parameters:
thread_stack_size - stack size used for threads started by Patroni. Lowering this value reduces memory usage of the Patroni process. The default value set by Patroni is 512kB. Increase thread_stack_size if Patroni experiences stack-related crashes; otherwise the default value is sufficient.thread_pool_size - size of the thread pool used by Patroni for asynchronous tasks and REST API communication with other members during leader race or failsafe checks. The default value is 5, which is sufficient for three-node clusters.restapi.thread_pool_size - size of the thread pool used to process REST API requests. The default value is 5, allowing up to five parallel REST API requests. Note that requests involving SQL queries are effectively serialized because a single database connection is used, so increasing this value typically provides no benefit.Patroni is a template for high availability (HA) PostgreSQL solutions using Python. For maximum accessibility, Patroni supports a variety of distributed configuration stores like ZooKeeper, etcd, Consul or Kubernetes. Database engineers, DBAs, DevOps engineers, and SREs who are looking to quickly deploy HA PostgreSQL in datacenters — or anywhere else — will hopefully find it useful.
We call Patroni a “template” because it is far from being a one-size-fits-all or plug-and-play replication system. It will have its own caveats. Use wisely. There are many ways to run high availability with PostgreSQL; for a list, see the PostgreSQL Documentation.
Currently supported PostgreSQL versions: 9.3 to 18.
Note to Citus users: Starting from 3.0 Patroni nicely integrates with the Citus database extension to Postgres. Please check the Citus support page in the Patroni documentation for more info about how to use Patroni high availability together with a Citus distributed cluster.
Note to Kubernetes users: Patroni can run natively on top of Kubernetes. Take a look at the Kubernetes chapter of the Patroni documentation.

Patroni introduction, quick start, and core high-availability concepts.
Installation and upgrade instructions for Patroni across supported platforms.
Patroni configuration model, precedence rules, and validation tooling.
Reference for Patroni REST API endpoints and operational behaviors.
Command reference for patronictl configuration, syntax, and subcommands.
Replica imaging, bootstrap, and custom replica creation workflows.
Asynchronous and synchronous replication modes managed by Patroni.
Standby cluster setup, behavior, and replication from remote primary.
Watchdog integration and fencing considerations for Patroni clusters.
Pause and resume mode behavior for Patroni cluster management.
DCS failsafe mode behavior, requirements, and operational caveats.
Using Patroni with Kubernetes objects, labels, and service discovery.
Patroni integration details for Citus coordinator and worker groups.
Procedure to convert existing PostgreSQL data into a Patroni cluster.
Integrating Patroni with external backup and orchestration tools.
Security considerations for DCS, REST API, and credential handling.
Multi-datacenter high-availability patterns with Patroni replication.
Frequently asked questions about Patroni operation and troubleshooting.
Chronological Patroni release notes and change history.
Contribution workflow, support channels, and development guidelines.
Was this page helpful?
Thanks for the feedback! Please let us know how we can improve.
Sorry to hear that. Please let us know how we can improve.