Skip to content

Instantly share code, notes, and snippets.

@ycku
Last active August 11, 2023 03:19
Show Gist options
  • Save ycku/76e3d3991a414af4e93b8dc8d50e078c to your computer and use it in GitHub Desktop.
Save ycku/76e3d3991a414af4e93b8dc8d50e078c to your computer and use it in GitHub Desktop.
Demo patroni on docker

Demo patroni on docker

  • 可以自行建立 patroni 實驗環境
  • 以 Failover 作為環境測試情境

1. Docker Environment

2. git clone

git clone https://github.com/zalando/patroni.git
cd patroni
vi Dockerfile 
ARG PG_MAJOR=13

3. Build Docker Image

  • tag 先不要自行變更
docker build . -t patroni:latest
Successfully built 115083d61216
Successfully tagged patroni:latest
  • 最後有 Successfully 字樣為成功

4. Start Demo Cluster

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 儲存服務狀態, 互相為備援

5. 進入入口容器

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 |           |
+----------+------------+---------+---------+----+-----------+
  • 連線 PostgreSQL
psql -p 5000 -h demo-haproxy -U postgres -c "select inet_server_addr()"
  • 預設密碼為 postgres
 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 |
+----------+------------+---------+---------+----+-----------+
  • 連線 PostgreSQL 來確認
psql -p 5000 -h demo-haproxy -U postgres -c "select inet_server_addr()"
 inet_server_addr 
------------------
 172.19.0.3
(1 row)
  • 的確切換到 patroni1 了

Auto-failover 模擬主機失效

  • 目前 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
  • 看不到 demo-patroni1 了
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 |           |
+----------+------------+---------+---------+----+-----------+
  • patroni1 自動加回來了
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment