It’s been a while since I wrote the blog post about PostgreSQL 13 and Patroni 2.0. On this blog I received a comment, if it’s possible to explain, how to upgrade from Patroni 1.6 to 2. So let’s make a short blog about the upgrade procedure of Patroni.

For my initial installation is used python pip, not the rpm packages. But the upgrade with pip is also really simple and straight forward. There is no need to stop Patroni. But as usual, be sure you have a backup of you database or a snapshot of your server, if applicable.

In first step, let’s check the current version of Patroni and upgrade pip itself and the setuptools to be sure to have it on the newest version as well.

postgres@patroni1:/u02/pgdata/ [PG1] patronictl version
patronictl version 1.6.4
postgres@patroni1:/u02/pgdata/ [PG1] python3 -m pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Collecting pip
  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)
     |████████████████████████████████| 1.7 MB 2.0 MB/s
Installing collected packages: pip
Successfully installed pip-21.3.1
postgres@patroni1:/u02/pgdata/ [PG1] python3 -m pip install --upgrade --user setuptools
Requirement already satisfied: setuptools in /home/postgres/.local/lib/python3.6/site-packages (45.2.0)
Collecting setuptools
  Downloading setuptools-59.6.0-py3-none-any.whl (952 kB)
     |████████████████████████████████| 952 kB 1.6 MB/s
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 45.2.0
    Uninstalling setuptools-45.2.0:
      Successfully uninstalled setuptools-45.2.0
Successfully installed setuptools-59.6.0
postgres@patroni3:/u01/app/postgres/product/ [PG1]

Afterwards we upgrade Patroni itself. Which is also done using python pip with –upgrade option.

postgres@patroni1:/u02/pgdata/ [PG1]  python3 -m pip install --upgrade  --user patroni[etcd]
Requirement already satisfied: patroni[etcd] in /home/postgres/.local/lib/python3.6/site-packages (1.6.4)
Collecting patroni[etcd]
  Downloading patroni-2.1.3-py3-none-any.whl (222 kB)
     |████████████████████████████████| 222 kB 1.6 MB/s
Requirement already satisfied: psutil>=2.0.0 in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (5.7.0)
Requirement already satisfied: six>=1.7 in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (1.14.0)
Requirement already satisfied: urllib3!=1.21,>=1.19.1 in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (1.25.8)
Collecting ydiff>=1.2.0
  Downloading ydiff-1.2.tar.gz (42 kB)
     |████████████████████████████████| 42 kB 2.1 MB/s
  Preparing metadata (setup.py) ... done
Requirement already satisfied: click>=4.1 in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (7.0)
Requirement already satisfied: PyYAML in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (5.3)
Requirement already satisfied: prettytable>=0.7 in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (0.7.2)
Requirement already satisfied: python-dateutil in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (2.8.1)
Requirement already satisfied: python-etcd=0.4.3 in /home/postgres/.local/lib/python3.6/site-packages (from patroni[etcd]) (0.4.5)
Requirement already satisfied: dnspython>=1.13.0 in /home/postgres/.local/lib/python3.6/site-packages (from python-etcd=0.4.3->patroni[etcd])                                                                                                                                                            (1.16.0)
Using legacy 'setup.py install' for ydiff, since package 'wheel' is not installed.
Installing collected packages: ydiff, patroni
    Running setup.py install for ydiff ... done
  Attempting uninstall: patroni
    Found existing installation: patroni 1.6.4
    Uninstalling patroni-1.6.4:
      Successfully uninstalled patroni-1.6.4
Successfully installed patroni-2.1.3 ydiff-1.2
postgres@patroni3:/u01/app/postgres/product/ [PG1] 

To be sure everything works as expected, check the version in the last step and the cluster itself

postgres@patroni1:/u02/pgdata/ [PG1]  patronictl list
+ Cluster: PG1 (7093128570847303467) -+---------+----+-----------+
| Member   | Host           | Role    | State   | TL | Lag in MB |
+----------+----------------+---------+---------+----+-----------+
| patroni1 | 192.168.22.111 | Leader  | running |  4 |           |
| patroni2 | 192.168.22.112 | Replica | running |  4 |         0 |
| patroni3 | 192.168.22.113 | Replica | running |  4 |         0 |
+----------+----------------+---------+---------+----+-----------+

postgres@patroni1:/u02/pgdata/ [PG1] patroni --version
patroni 2.1.3

Once this this is finished successfully on one node, you can go on with the other nodes in the cluster.