1 前言
1.1概述
Patroni + etcd + vipmanager 是cybertec推出的postgresql 高可用方案。其中, Etcd 用於存放集群狀態信息。Patroni 負責為PostgreSQL 集群提供故障轉移和高可用服務。vipmanager 根據etcd或Consul中保存的狀態管理虛擬IP用於提供和管理虛擬ip,用於對外提供訪問地址。
3 方案驗證
3.1 驗證數據庫主備功能
1. 在主數據庫上的操作
1.1 創建表 man:
create table man
(
id int,
name varchar(32),
constraint pk_man primary key (id)
);
結果如下:
1.2 插入數據到表man:
insert into man (id, name) values (1, 'Amy');
結果如下:
1.3 查詢表 man:
select * from man;
2. 后備數據庫上的操作
2.1 從表man 中查詢數據
可以看出,發現主數據庫中的數據已經同步到后備數據庫。
2.2 嘗試向后備數據庫插入數據
insert into man (id, name) values (2, 'Bob');
結果如下:
可以看出,無法向后備數據庫插入數據。
3.2 通過虛擬 ip 訪問數據庫
1. 通過虛擬ip 10.19.134.140 連接數據庫
[root@node134 bin]# cd /opt/postgresql-12/bin
[root@node134 bin]# su postgres
[postgres@node135 bin]$ ./psql -h 10.19.134.140 -U postgres -p 5432 -d testdb
2. 執行如下查詢:
select * from man;
3. 查看流復制狀態,可以確定虛擬ip映射到了主數據庫所在的節點上。
select * from pg_stat_replication;
3.3 驗證PostgreSQL的高可用
1. 手動關閉主數據庫。在postgresql 的bin 目錄中,以用戶postgres 執行如下命令:
[postgres@node134 bin]# ./pg_ctl stop -D ../data/
2. 過10秒后,再查看主數據庫上PostgreSQL的狀態
[postgres@node134 bin]$ ./pg_ctl status -D ../data/
發現 PostgreSQL 已經啟動:
3. 在主數據庫中查詢流復制狀態:
select * from pg_stat_replication;
如圖所示,流復制正常。
3.4 驗證停止和啟動patroni的影響
3.4.1 在后備服務器上停止 patroni
1. 在后備服務器上停止patroni
[root@node135 bin]# systemctl stop patroni
之后,查看postgresql 服務的狀態:
[root@node135 bin]# cd /opt/postgresql-12/bin
[root@node135 bin]# su postgres
[postgres@node135 bin]$ ./pg_ctl status -D ../data/
pg_ctl: no server running
可以看出,PostgreSQL 跟隨patroni停止。
2. 通過虛擬IP 10.19.134.140 訪問數據庫
[postgres@node134 bin]$ ./psql -h 10.19.134.140 -U postgres -p 5432 -d testdb
查看復制狀態
select * from pg_stat_replication;
可以發現,流復制已經斷開。
3. 后備服務器上啟動patroni
[root@node135 bin]# systemctl start patroni
之后查看PostgreSQL 的狀態,發現它已經啟動:
[postgres@node135 bin]$ ./pg_ctl status -D ../data/
4. 再次在主數據庫上查看復制狀態:
select * from pg_stat_replication;
可以發現,流復制恢復正常。
3.4.2 在主服務器上停止 patroni
1. 在主服務器上停止patroni
[root@node134 bin]# systemctl stop patroni
之后,查看postgresql 服務的狀態:
[root@node134 bin]# cd /opt/postgresql-12/bin
[root@node134 bin]# su postgres
[postgres@node134 bin]$ ./pg_ctl status -D ../data/
pg_ctl: no server running
可以看出,PostgreSQL 跟隨patroni停止。
2. 在這台服務器上重啟patroni
[root@node134 bin]# systemctl start patroni
3. 在原后備服務器的數據庫上查看復制狀態
select pg_is_in_recovery();
它現在不是后備數據庫了。
4. 通過虛擬IP 10.19.134.140 訪問數據庫
[postgres@node134 bin]$ ./psql -h 10.19.134.140 -U postgres -p 5432 -d testdb
5. 查看流復制狀態
select * from pg_stat_replication;
可以看出,位於 10.19.134.135 上的原后備數據庫提升為了新的主數據庫,而位於10.19.134.135的原主數據庫則降級為后備數據庫。虛擬ip則漂移到了 10.19.134.135 ,新主數據庫所在的節點上。
3.5 手工切換PostgreSQL 主節點
1. 在切換之前,查看Patroni 集群的狀態信息。
[postgres@node135 ~]$ patronictl -c /etc/patroni/patroni_postgresql.yml list
可以看出,此時,node135 是數據庫集群的主結點,而 node134是數據庫集群的備節點。
2. 我們將node 135 降級為備節點,將node134 提升為主結點。執行下面的命令:
[postgres@node135 ~]$ patronictl -c /etc/patroni/patroni_postgresql.yml switchover postgresql12
3. 再查看切換后的結果:
[postgres@node135 root]$ patronictl -c /etc/patroni/patroni_postgresql.yml list
如圖所示,此時,node134 已經提升為數據庫集群的主結點,而時間線TL 則增加了1。
3.6 重新初始化后備數據庫
1. 在備節點node135上,刪除postgresql的 data目錄。
[postgres@node135 ~]$ cd /opt/postgresql-12
[postgres@node135 postgresql-12]$ rm -rf data
現在,node135上的數據庫無法正常訪問。我們可以使用如下命令來重新初始化數據庫:
patronictl reinit [OPTIONS] CLUSTER_NAME [MEMBER_NAMES]...
這里,CLUSTER_NAME 是patroni_postgresql.yml 中 scope的值,而 MEMBER_NAME,集群的成員名,是patroni_postgresql.yml 中 name的值。
2. 為了重新初始化 node135 節點,我們執行如下命令:
[postgres@node135 postgresql-12]$ patronictl -c /etc/patroni/patroni_postgresql.yml reinit postgresql12 node135
如上圖所示,數據庫重新初始化成功。
參考
[1] 你離開我真會死. PostgreSQL-11.3+etcd+patroni構建高可用數據庫集群. 2019-11-29
[2] 學無止境. centos7部署postgresql集群高可用 patroni + etcd 之patroni篇. 2019-08-25
[3] How to Set Up a Highly Available PostgreSQL Cluster Using Patroni and HAProxy on Ubuntu?November 16, 2020
[4] Cybertec. patroni
[5] Cybertec. vip-manager