- 可以自行建立 patroni 實驗環境
- 以 Failover 作為環境測試情境
git clone https://github.com/zalando/patroni.git
cd patroni
vi Dockerfile
ARG PG_MAJOR=13
docker build . -t patroni:latest
Successfully built 115083d61216
Successfully tagged patroni:latest
docker-compose up -d
Creating network "patroni_demo" with the default driver
Creating demo-patroni2 ... done
Creating demo-etcd2 ... done
Creating demo-patroni3 ... done
Creating demo-etcd3 ... done
Creating demo-patroni1 ... done
Creating demo-etcd1 ... done
Creating demo-haproxy ... done
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f3df85a5741 patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute demo-etcd1
e172e4458cff patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute 0.0.0.0:5000-5001->5000-5001/tcp demo-haproxy
f8a0e7099f60 patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute demo-patroni1
1f4feb4fef40 patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute demo-etcd3
5bc304582ef9 patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute demo-etcd2
6d88743d3b4a patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute demo-patroni3
d0c9b31510b5 patroni "/bin/sh /entrypoint…" About a minute ago Up About a minute demo-patroni2
- 一共 7 個 container 才是成功
- PORTS 可以瞭解對外服務的開放點 (demo-haproxy)
- demo-etcd1, demo-etcd2, demo-etcd3 儲存服務狀態, 互相為備援
docker exec -it demo-haproxy /bin/bash
- 提示字元會變成 postgres@haproxy
- 檢查 member 狀態 (demo-patroni1, demo-patroni2, demo-patroni3)
patronictl list
- Leader 為 streaming replication 的 Master
+ Cluster: demo (6994598883649245213) ------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------+------------+---------+---------+----+-----------+
| patroni1 | 172.19.0.3 | Replica | running | 1 | 0 |
| patroni2 | 172.19.0.8 | Replica | running | 1 | 0 |
| patroni3 | 172.19.0.7 | Leader | running | 1 | |
+----------+------------+---------+---------+----+-----------+
psql -p 5000 -h demo-haproxy -U postgres -c "select inet_server_addr()"
inet_server_addr
------------------
172.19.0.7
(1 row)
- 確認會被導到 patroni3
- 執行 Failover, 強迫切換 Leader
patronictl failover --candidate=patroni1 --force
Current cluster topology
+ Cluster: demo (6994598883649245213) ------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------+------------+---------+---------+----+-----------+
| patroni1 | 172.19.0.3 | Replica | stopped | | unknown |
| patroni2 | 172.19.0.8 | Replica | running | 4 | 0 |
| patroni3 | 172.19.0.7 | Leader | running | 5 | |
+----------+------------+---------+---------+----+-----------+
2021-08-10 01:25:52.48450 Successfully failed over to "patroni1"
+ Cluster: demo (6994598883649245213) ------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------+------------+---------+---------+----+-----------+
| patroni1 | 172.19.0.3 | Leader | running | 5 | |
| patroni2 | 172.19.0.8 | Replica | running | 5 | 0 |
| patroni3 | 172.19.0.7 | Replica | stopped | | unknown |
+----------+------------+---------+---------+----+-----------+
psql -p 5000 -h demo-haproxy -U postgres -c "select inet_server_addr()"
inet_server_addr
------------------
172.19.0.3
(1 row)
- 目前 Leader 為 patroni1
- 強制停止其服務
- 如在容器內, 請先離開容器
docker stop demo-patroni1
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce130f620cad patroni "/bin/sh /entrypoint…" 40 minutes ago Up 40 minutes demo-etcd2
f1859951ae64 patroni "/bin/sh /entrypoint…" 40 minutes ago Up 40 minutes demo-patroni3
0de396718fec patroni "/bin/sh /entrypoint…" 40 minutes ago Up 40 minutes 0.0.0.0:5000-5001->5000-5001/tcp demo-haproxy
2e1a14ccaba9 patroni "/bin/sh /entrypoint…" 40 minutes ago Up 40 minutes demo-patroni2
46a36ec26c99 patroni "/bin/sh /entrypoint…" 40 minutes ago Up 40 minutes demo-etcd3
1a12bc64fa7e patroni "/bin/sh /entrypoint…" 40 minutes ago Up 40 minutes demo-etcd1
docker exec -it demo-haproxy patronictl list
+ Cluster: demo (6994598883649245213) ------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------+------------+---------+---------+----+-----------+
| patroni2 | 172.19.0.8 | Replica | running | 9 | 0 |
| patroni3 | 172.19.0.7 | Leader | running | 9 | |
+----------+------------+---------+---------+----+-----------+
- 剩 2 台 patroni3 自動接下 Leader
docker exec -it demo-haproxy psql -h demo-haproxy -U postgres -p 5000 -c "select inet_server_addr()"
inet_server_addr
------------------
172.19.0.7
(1 row)
- PostgreSQL 連線正常, 且確認 Master 有切換到 patroni3
- 把 patroni1 啓動
docker start demo-patroni1
docker exec -it demo-haproxy patronictl list
+ Cluster: demo (6994598883649245213) ------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------+------------+---------+---------+----+-----------+
| patroni1 | 172.19.0.3 | Replica | running | 9 | 0 |
| patroni2 | 172.19.0.8 | Replica | running | 9 | 0 |
| patroni3 | 172.19.0.7 | Leader | running | 9 | |
+----------+------------+---------+---------+----+-----------+