Patroni 4.1.3 Documentation

Overview of Patroni high-availability documentation for PostgreSQL.

Source: https://patroni.readthedocs.io/en/latest/index.html

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:

  • Patroni appears healthy
  • PostgreSQL continues to run
  • Patroni REST API becomes unresponsive
  • The operating system reports that Patroni is listening on the REST API port
  • Patroni logs look normal; however, following messages may appear once: Exception ignored in thread started by: <object repr() failed>, MemoryError
  • Kernel logs may contain messages such as not enough memory for the allocation

This 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.

Additional recommendations (Linux, glibc)

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 applications
  • PG_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.

image

Introduction

Patroni introduction, quick start, and core high-availability concepts.

Installation

Installation and upgrade instructions for Patroni across supported platforms.

Patroni configuration

Patroni configuration model, precedence rules, and validation tooling.

Patroni REST API

Reference for Patroni REST API endpoints and operational behaviors.

patronictl

Command reference for patronictl configuration, syntax, and subcommands.

Replica imaging and bootstrap

Replica imaging, bootstrap, and custom replica creation workflows.

Replication modes

Asynchronous and synchronous replication modes managed by Patroni.

Standby cluster

Standby cluster setup, behavior, and replication from remote primary.

Watchdog support

Watchdog integration and fencing considerations for Patroni clusters.

Pause/Resume mode for the cluster

Pause and resume mode behavior for Patroni cluster management.

DCS Failsafe Mode

DCS failsafe mode behavior, requirements, and operational caveats.

Using Patroni with Kubernetes

Using Patroni with Kubernetes objects, labels, and service discovery.

Citus support

Patroni integration details for Citus coordinator and worker groups.

Convert a Standalone to a Patroni Cluster

Procedure to convert existing PostgreSQL data into a Patroni cluster.

Integration with other tools

Integrating Patroni with external backup and orchestration tools.

Security Considerations

Security considerations for DCS, REST API, and credential handling.

HA multi datacenter

Multi-datacenter high-availability patterns with Patroni replication.

FAQ

Frequently asked questions about Patroni operation and troubleshooting.

Release notes

Chronological Patroni release notes and change history.

Contributing guidelines

Contribution workflow, support channels, and development guidelines.


Last Modified 2026-07-01: bump patroni docs to 4.1.3 (59a1859)