How to Set Up a High Available PostgreSQL Cluster Using Patroni

Neslisah Ay
4 min readMar 18, 2019

--

Patroni is an open source tool which can be used for creating and managing customized high available PostgreSQL cluster. It is coded by Zalando Tech with Python.

Also, it can be used for backup ,replication and restore tasks with some configuration parameters. It is providing high availability with ETCD and HaProxy (which gives to application a single endpoint to connect cluster’s leader).

For further information : https://github.com/zalando/patroni

ETCD Installation

ETCD is an open source distributed key value store and provides a reliable system for cluster-wide coordination and state management.It is using to store the state of PostgreSQL clusters .

yum install gcc python-devel
yum install etcd

It uses consensus algorithm ,during leader election, the first node to become a candidate, all the other nodes have to vote for.The algorithm claims that the distributed systems need an odd number of nodes.

For futher information ; https://github.com/etcd-io/etcd

ETCD Configuration

ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://IP:2379" ETCD_ADVERTISE_CLIENT_URLS="http://IP_A:2379"
ETCD_INITIAL_CLUSTER_TOKEN="cluster1"
ETCD_INITIAL_CLUSTER_STATE="new"
systemctl start etcd
systemctl status etcd

Result ;

etcd.service - etcd - highly-available key value store
Loaded: loaded (/lib/systemd/system/etcd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2019-02-28 22:27:47 IST; 5s ago
Docs: https://github.com/coreos/etcd
man:etcd
Main PID: 4504 (etcd)
CGroup: /system.slice/etcd.service
└─4504 /usr/bin/etcd
Sep 21 22:27:47 Node2 etcd[4504]: starting server... [version: 2.2.5, cluster version: to_be_decided]
Sep 21 22:27:47 Node2 systemd[1]: Started etcd - highly-available key value store.
Sep 21 22:27:47 Node2 etcd[4504]: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
Sep 21 22:27:47 Node2 etcd[4504]: set the initial cluster version to 2.2
Sep 21 22:27:48 Node2 etcd[4504]: ce2a822cea30bfca is starting a new election at term 5
Sep 21 22:27:48 Node2 etcd[4504]: ce2a822cea30bfca became candidate at term 6
Sep 21 22:27:48 Node2 etcd[4504]: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 6
Sep 21 22:27:48 Node2 etcd[4504]: ce2a822cea30bfca became leader at term 6
Sep 21 22:27:48 Node2 etcd[4504]: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 6
Sep 21 22:27:48 Node2 etcd[4504]: published {Name:hostname ClientURLs:[http://IP_A:2379]} to cluster 7e27652122e8b2ae

HaProxy Installation

HAProxy, which stands for High Availability Proxy, is a popular open source software TCP/HTTP Load Balancer and proxying solution.

yum install haproxy

HaProxy Configuration

You can configure editing this file etc/haproxy/haproxy.cfg as below :

global
maxconn 100

defaults
log global
mode tcp
retries 5
timeout client 30m
timeout connect 4s
timeout server 30m
timeout check 5s

listen stats
mode http
bind *:7000
stats enable
stats uri /

listen postgres
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server postgresql_pg01_5432 IP:5432 maxconn 100 check port 8008
server postgresql_pg02_5432 IP:5432 maxconn 100 check port 8008

server postgresql_pg03_5432 IP:5432 maxconn 100 check port 8008

systemctl start haproxy && systemctl status haproxy

For further information ; http://www.haproxy.org

Patroni Installation

yum install gcc python-devel
yum install python-psycopg2 python-pip PyYAML
yum install python2-pip
pip install — upgrade pip
pip install — upgrade setuptools
pip install patroni
pip install python-etcd
pip install psycopg2-binary

Patroni uses YAML file to store its configuration.

! It is really important before using Patroni to install PostgreSQL’s RPM repository , client and server packages.

You can use this link to configure your YAML file; https://github.com/zalando/patroni/blob/master/postgres1.yml

!! Another important part is ; if the new Postgres setups are done it won’t be necessary to initialize(initdb) the PostgreSQL , initdb can be done with appropriate configuration by Patroni.

!!! On operating system , you need to set environment variable like this ;

export PATH=/usr/pgsql-$postgres_version/bin/$PATH

Now , you can start patroni process with command ; “patroni postgres0.yml” or you can start patroni process with patroni.service file as below :

Patroni service file ;

[Unit]

Description=Runners to orchestrate a high-availability PostgreSQL

After=syslog.target network.target

[Service]

Type=simple

User=postgres

Group=postgres

# Read in configuration file if it exists, otherwise proceed

EnvironmentFile=-/etc/patroni_env.conf

WorkingDirectory=~

# Where to send early-startup messages from the server

# This is normally controlled by the global default set by systemd

#StandardOutput=syslog

# Pre-commands to start watchdog device

# Uncomment if watchdog is part of your patroni setup

#ExecStartPre=-/usr/bin/sudo /sbin/modprobe softdog

#ExecStartPre=-/usr/bin/sudo /bin/chown postgres /dev/watchdog

# Start the patroni process

ExecStart= /bin/patroni postgres0.yml

# Send HUP to reload from patroni.yml

ExecReload=/bin/kill -s HUP $MAINPID

# only kill the patroni process, not it’s children, so it will gracefully stop postgres

KillMode=process

#Give a reasonable amount of time for the server to start up/shut down

TimeoutSec=30

# Do not restart the service if it crashes, we want to manually inspect database on failure

Restart=no

[Install]

WantedBy=multi-user.target

systemctl daemon-reload && service patroni start

That’s it.

master server’s patroni service output

Note that ;

Every server in cluster you need to install epel repo.

Need to set environment variable to postgres’ binary file path on Postgres servers .

You can create a highly available and scalable PostgreSQL database cluster with Patroni as above. In this way, it is possible to scale your read requests on HAProxy with a proper configuration by expanding to the horizontal under heavy load with zero downtime.

--

--