PostgreSQL高可用方案-patroni+etcd+vipmanager(二)


1 前言

1.1概述

Patroni + etcd + vipmanager cybertec推出的postgresql 高可用方案。其中, Etcd 用於存放集群狀態信息。Patroni 負責為PostgreSQL 集群提供故障轉移和高可用服務。vipmanager 根據etcdConsul中保存的狀態管理虛擬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上,刪除postgresqldata目錄。

     [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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM