說明:本系列文章僅用于共享我的學習成果,未經過生產系統考驗,對于知識點和一些組件的使用會不定時更新,僅供參考,如有錯誤的地方,歡迎留言共同學習。
本高可用系列測試不說理論知識,如有需要自行百度,因生產環境大多數是內網環境,無法連接互聯網,為模擬生產環境安裝,PostgreSQL高可用測試均采用離線部署。
所需軟件包均以打包上傳百度網盤,如有需要自行下載:https://pan.baidu.com/s/1Tb7GPMvj4kfKEIh8iyvdbA 提取碼:n9w2 文件名:PostgreSQL_HA.tar.gz
第一章: 介紹測試環境
第二章: PostgreSQL + replication 部署
第三章: Etcd 部署和管理
第四章: Patroni 部署和管理
第五章: HAProxy + Keepalived 部署和管理
第六章: 高可用模擬故障測試用例
第七章: Prometheus + Grafana 監控部署
第八章: 高可用管理

第六章: 高可用模擬故障測試用例
借用Patroni官方文檔的一句話:
??Testing an HA solution is a time consuming process, with many variables. This is particularly true considering a cross-platform application. You need a trained system administrator or a consultant to do this work. It is not something we can cover in depth in the documentation.
??測試 HA 高可用是一個耗時的過程,有很多變數,不能面面測試到,以下只列出部分測試類型,如果有其他測試場景,歡迎留言評論,本文也會不定期更新其他測試場景,測試代碼較多,這里不寫了。
1. 高可用測試 Keepalived
| 測試類型 | 測試方式 | 測試命令 | 測試結果 |
|---|---|---|---|
| 進程故障 | 1. 主端killall進程 | killall keepalived | VIP從主端自動轉移到備端,5000端口和5001端口連接正常 |
| - | - | systemctl start keepalived | VIP從備端自動轉移到主端,5000端口和5001端口連接正常 |
| - | 2. 備端killall進程 | systemctl stop keepalived | VIP在主端正常運行,5000端口和5001端口連接正常 |
| - | - | systemctl start keepalived | VIP在主端正常運行,5000端口和5001端口連接正常 |
| - | 3. 主端同時kill所有進程 | - | 主端VIP未卸掉,備端也啟動VIP,此時主備端均存在VIP(異常現象),5000端口和5001端口連接正常 |
| - | - | systemctl start keepalived | VIP轉移到主端正常運行,備端無VIP,5000端口和5001端口連接正常 |
| - | 4. 主端只kill主進程 | kill -9 | VIP從主端自動轉移到備端,VIP只在備端啟動,5000端口和5001端口連接正常 |
| - | - | systemctl start keepalived | VIP轉移到主端正常運行,備端無VIP,5000端口和5001端口連接正常 |
| - | 5. 主端只kill子進程 | - | VIP從主端自動轉移到備端,等待主進程自動生成子進程后,VIP從備端自動轉移到主端,5000端口和5001端口連接正常 |
| - | 6. 備端kill 進程 | - | IP在主端正常運行,5000端口和5001端口連接正常 |
| 網卡故障 | 1. 主端down網卡 | ifdown ens33 | VIP從主端自動轉移到備端,PostgreSQL發生故障轉移到其中一個備庫,5000端口和5001端口連接正常,patroni和etcd均不顯示故障節點 |
| - | 2. 主端up網卡 | ifup ens33 | VIP從備端自動轉移到主端,故障節點以備庫角色添加到集群,patroni和etcd節點狀態顯示正常,5000端口和5001端口連接正常 |
| - | 3. 備端down網卡 | ifdown ens32 | VIP在主端正常運行,5000端口和5001端口連接正常,patroni和etcd均不顯示故障節點,故障節點上的各個進程還在運行 |
| - | 4. 備端up網卡 | ifup ens32 | patroni和etcd節點狀態顯示正常 |
2. 高可用測試 HAProxy
| 測試類型 | 測試方式 | 測試命令 | 測試結果 |
|---|---|---|---|
| 進程故障 | 1. 主端killall進程 | killall haproxy | keepalived 未檢測 haproxy 進程,自動將VIP從主端轉移到備端,5000端口和5001端口連接正常 |
| - | - | systemctl start haproxy | keepalived 檢測到 haproxy 進程,自動將VIP從備端轉移到主端,5000端口和5001端口連接正常 |
| - | 2. 備端killall進程 | killall haproxy | VIP在主端正常運行,5000端口和5001端口連接正常 |
| - | - | systemctl start haproxy | VIP在主端正常運行,5000端口和5001端口連接正常 |
| - | 3. 主端同時kill所有進程 | - | keepalived 未檢測 haproxy 進程,自動將VIP從主端轉移到備端,5000端口和5001端口連接正常 |
| - | - | systemctl start haproxy | keepalived 檢測到 haproxy 進程,自動將VIP從備端轉移到主端,5000端口和5001端口連接正常 |
| - | 4. 主端只kill主進程 | - | keepalived 未檢測 haproxy 進程,自動將VIP從主端轉移到備端,5000端口和5001端口連接正常 |
| - | - | systemctl start haproxy | keepalived 檢測到 haproxy 進程,自動將VIP從備端轉移到主端,5000端口和5001端口連接正常 |
| - | 5. 主端只kill子進程 | - | haproxy 的所有進程都死了,keepalived 未檢測 haproxy 進程,自動將VIP從主端轉移到備端,5000端口和5001端口連接正常 |
| - | - | systemctl start haproxy | keepalived 檢測到 haproxy 進程,自動將VIP從備端轉移到主端,5000端口和5001端口連接正常 |
3. 高可用測試 Patroni
以下是在Patroni開啟了auto failover的情況下進行測試
[root@pgtest3 ~]# patronictl resume
| 測試類型 | 測試方式 | 測試命令 | 測試結果 |
|---|---|---|---|
| 進程故障 | 1. 主端killall進程 | killall patroni | 1. 觸發故障切換到備庫其中一個節點,備庫另一個節點同步新主庫,切換時間在30秒內 2. 原主庫(pgtest1)的 PostgreSQL 被關閉 3. etcd haproxy keepalived 在原主庫正常運行,VIP 運行在原主庫 4. VIP + 5000端口連接切換后的新主庫,VIP + 5001端口連接另一個備庫 |
| - | - | systemctl start patroni | 原主庫(pgtest1)變成新主庫(pgtest2)的備庫 |
| - | 2. 主庫kill patroni 進程 | kill -9 | 1. 觸發故障切換到備庫其中一個節點,備庫另一個節點同步新主庫,切換時間在30秒內 2. 原主庫(pgtest1)的 PostgreSQL 還在運行,并且是讀寫模式 3. etcd haproxy keepalived 在原主庫正常運行,VIP 運行在原主庫 4. VIP + 5000端口連接切換后的新主庫,VIP + 5001端口連接另一個備庫 |
| - | - | systemctl start patroni | 原主庫(pgtest1)被 pg_rewind 成新主庫(pgtest2)的備庫 |
| - | 3. 一個備庫kill patroni 進程 | - | 1. 使用killall,將會同時關閉備庫,使用kill,此備庫的 PostgreSQL 還在以只讀模式運行,且與主庫正常同步數據 2. VIP + 5000端口正常連接主庫,VIP+5001端口不能連接此備庫,可以連接另一個備庫 3. 主庫與另一個備庫不受影響 4. 此備庫上的 etcd haproxy keepalived 正常運行 |
| - | - | systemctl start patroni | 自動恢復正常狀態,與主庫保持同步 |
| - | 4. 兩個備庫kill patroni 進程 | - | 1. 使用killall,將會同時關閉備庫,使用kill,兩個備庫的 PostgreSQL 還在以只讀模式運行,且與主庫正常同步數據 2. VIP + 5000端口只連接主庫,VIP + 5001端口連接失敗 3. 主庫不受影響 4. 備庫上的 etcd haproxy keepalived 正常運行 |
| - | - | systemctl start patroni | 自動恢復正常狀態,與主庫保持同步 |
4. 高可用測試 etcd
| 測試類型 | 測試方式 | 測試命令 | 測試結果 |
|---|---|---|---|
| 進程故障 | 1. 主庫kill etcd 進程 | - | 不影響主庫和備庫, patroni 會連接其它節點上的etcd,VIP+5000/5001端口連接正常 |
| - | 2. 一個備庫停止 etcd 進程 | - | 不影響主庫和備庫, patroni 會連接其它節點上的etcd,VIP+5000/5001端口連接正常 |
| - | 3. 兩個備庫停止 etcd 進程 | - | 此時超過了etcd的最大允許故障節點數,主備庫3個節點均以只讀模式運行,VIP + 5000端口連接失敗,VIP + 5001端口輪詢連接主備庫3個節點 |
| - | - | 先啟動第一個備庫的 etcd 進程 | 主庫從只讀模式切換成讀寫模式,主從數據同步恢復正常,VIP + 5000/5001端口連接正常 |
| - | - | 再啟動第二個備庫的 etcd 進程 | 自動恢復正常狀態,與主庫保持同步 |
5. 高可用測試 PostgreSQL
| 測試類型 | 測試方式 | 測試命令 | 測試結果 |
|---|---|---|---|
| - | 停主庫PostgreSQL實例 | - | 主庫被Patroni自動拉起,VIP + 5000/5001端口連接正常 |
| - | 停備庫PostgreSQL實例 | - | 備庫被Patroni自動拉起,VIP + 5000/5001端口連接正常 |
6. 高可用測試 操作系統
| 測試類型 | 測試方式 | 測試命令 | 測試結果 |
|---|---|---|---|
| - | 停PostgreSQL主庫主機(同時是haproxy + keepalived 的主機) | reboot | 1. 觸發故障切換到備庫其中一個節點,備庫另一個節點同步新主庫,切換時間在30秒內 2. VIP漂移到備庫 3. VIP + 5000端口連接切換后的新主庫,VIP + 5001端口連接另一個備庫 |
| - | - | 啟動 | 原主庫(pgtest1)變成新主庫(pgtest2)的備庫,VIP從keepalived的備端自動轉移到主端,5000端口和5001端口連接正常 |
| - | 停備庫的主機就不測試了 | - | - |
最后修改時間:2021-11-04 09:04:11
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




