Postgresql通過pgpool進行高可用部署主從,災備(單機版)

1、bitnami/postgresql-repmgr:15 (鏡像名)

Bitnami 的?PostgreSQL-Repmgr?鏡像是一個預配置的 Docker 鏡像,集成了?PostgreSQL?數據庫和?repmgr(Replication Manager)工具,用于快速搭建高可用(HA)的 PostgreSQL 集群。

1. 核心組件

  • PostgreSQL:開源關系型數據庫,支持主從復制。

  • repmgr:用于管理 PostgreSQL 復制和自動故障轉移的工具,提供:

    • 自動主從切換(failover)

    • 節點監控

    • 集群狀態管理


2. 鏡像特點

  • 開箱即用:預配置主從復制和 repmgr 管理。

  • 基于 Bitnami 標準化鏡像

    • 非 root 用戶運行(UID 1001),增強安全性。

    • 數據卷掛載到?/bitnami/postgresql

    • 日志輸出到標準輸出(方便 Docker 日志收集)。

  • 環境變量驅動:通過環境變量配置數據庫、復制和用戶權限。

docker-compose.yml (同機部署)

配置電腦的hosts文件,pg-0 和pg-1的ip地址

services:pg-0:image: bitnami/postgresql-repmgr:15container_name: pg-0environment:POSTGRESQL_POSTGRES_PASSWORD: 123***POSTGRESQL_USERNAME: frankPOSTGRESQL_PASSWORD: 123***POSTGRESQL_DATABASE: frank-devPOSTGRESQL_NUM_SYNCHRONOUS_REPLICAS: 0REPMGR_USERNAME: repmgrREPMGR_PASSWORD: 123***REPMGR_DATABASE: repmgrREPMGR_PRIMARY_HOST: pg-0REPMGR_PRIMARY_PORT: 5432REPMGR_PARTNER_NODES: "pg-0:5432,pg-1:5432"  # 關鍵:使用容器內部端口REPMGR_NODE_NAME: pg-0REPMGR_NODE_NETWORK_NAME: pg-0REPMGR_PORT_NUMBER: 5432POSTGRESQL_INITDB_ARGS: "--data-checksums"REPMGR_GENERATE_PGHBA_CONF: "yes"REPMGR_PGHBA_TRUST_ALL: "yes"REPMGR_CREATE_DB: "yes"REPMGR_FAILOVER_MODE: automaticREPMGR_RECONNECT_ATTEMPTS: 10REPMGR_RECONNECT_INTERVAL: 5volumes:- postgres_data_pg0:/bitnami/postgresqlports:- "5432:5432"networks:- docker_postgres15_networkhealthcheck:  # 可選:健康檢查test: ["CMD-SHELL", "pg_isready -U postgres -d repmgr"]  # 直接檢測 repmgr 數據庫interval: 5stimeout: 3sretries: 3pg-1:image: bitnami/postgresql-repmgr:15container_name: pg-1environment:POSTGRESQL_POSTGRES_PASSWORD: 123***POSTGRESQL_USERNAME: frankPOSTGRESQL_PASSWORD: 123***POSTGRESQL_DATABASE: frank-devPOSTGRESQL_NUM_SYNCHRONOUS_REPLICAS: 0REPMGR_USERNAME: repmgrREPMGR_PASSWORD: 123***REPMGR_DATABASE: repmgrREPMGR_PRIMARY_HOST: pg-0REPMGR_PRIMARY_PORT: 5432REPMGR_PARTNER_NODES: "pg-0:5432,pg-1:5432"  # 關鍵:使用容器內部端口REPMGR_NODE_NAME: pg-1REPMGR_NODE_NETWORK_NAME: pg-1REPMGR_PORT_NUMBER: 5432REPMGR_ROLE: standby  # 明確聲明為備用節點POSTGRESQL_INITDB_ARGS: "--data-checksums"REPMGR_GENERATE_PGHBA_CONF: "yes"REPMGR_PGHBA_TRUST_ALL: "yes"REPMGR_CREATE_DB: "yes"REPMGR_FAILOVER_MODE: automaticREPMGR_RECONNECT_ATTEMPTS: 10REPMGR_RECONNECT_INTERVAL: 5volumes:- postgres_data_pg1:/bitnami/postgresqlports:- "15432:5432"networks:- docker_postgres15_networkdepends_on:  # 確保 pg-0 先啟動pg-0:condition: service_healthynetworks:docker_postgres15_network:ipam:config:- subnet: 172.72.10.0/28driver: bridgevolumes:postgres_data_pg0:postgres_data_pg1:

2、bitnami/pgpool:4 (鏡像名)

1. 核心組件

  • Pgpool-II:高性能中間件,為 PostgreSQL 提供連接池、負載均衡、自動故障轉移等功能。

  • 關鍵特性

    • 連接池:減少頻繁連接開銷。

    • 負載均衡:讀操作分散到多個從節點。

    • 自動故障轉移:主節點故障時提升從節點為新主。

    • Watchdog:多 Pgpool 節點間高可用(防止單點故障)。


2. 鏡像特點

  • 版本:基于 Pgpool-II 4.x(支持 PostgreSQL 10+)。

  • 安全:以非 root 用戶(UID 1001)運行。

  • 配置驅動:通過環境變量或配置文件(/opt/bitnami/pgpool/conf/)管理。

  • 集成健康檢查:內置對后端 PostgreSQL 節點的監控。

docker-compose.yml

創建掛載的目錄和文件

services:pgpool:image: bitnami/pgpool:4container_name: "my-pgpool"networks:- docker_postgres15_network  # 與 PostgreSQL 容器同網絡ports:- 9999:5432volumes:- ./conf/myconf.conf:/config/myconf.confenvironment:- PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5432  # 使用容器內部端口 定義后端節點(主節點必須排在第一個)- PGPOOL_SR_CHECK_USER=repmgr- PGPOOL_SR_CHECK_PASSWORD=123***- PGPOOL_ENABLE_LDAP=no- PGPOOL_POSTGRES_USERNAME=postgres- PGPOOL_POSTGRES_PASSWORD=123***- PGPOOL_ADMIN_USERNAME=admin- PGPOOL_ADMIN_PASSWORD=123***- PGPOOL_ENABLE_LOAD_BALANCING=yes # 啟用讀寫分離- PGPOOL_POSTGRES_CUSTOM_USERS=frank- PGPOOL_POSTGRES_CUSTOM_PASSWORDS=123***- PGPOOL_HEALTH_CHECK_TIMEOUT=10- PGPOOL_HEALTH_CHECK_PERIOD=5- PGPOOL_FAILOVER_ON_BACKEND_ERROR=yesrestart: alwayshealthcheck:test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]interval: 10stimeout: 5sretries: 5
networks:docker_postgres15_network:ipam:config:- subnet: 172.72.10.0/28driver: bridge

3、實驗主從

1)鏈接pgpool,創建數據表和數據,數據會自動同步到pg-0和pg-1
2)操作pg-1從數據庫,只讀不可操作。

3)模擬pg-0故障

docker compose -f docker-compose-pg.yml down pg-0? (指定關閉對應的服務)

a)從日志中可以看到當pg-0掛掉后會再重試5次,如果還訪問不了會執行find_primary_node方法查找可以作為主節點的節點,然后把找到節點設置為新的主節點,所以現在pg-1是主節點,這個時候我們訪問pgpoll還是能訪問的,現在在users表里面再添加一行數據:?

?

?b)pgpool加了數據之后,pg-1已經成為了主節點,去pg-1把王五的年紀改完25成功,pgpool數據也同步修改

c)現在將pg-0啟動起來,也會自動加入集群,會發現就算pg-0重新啟動器來了,但是pg-1還是主節點不變,pg-0又會成為副節點。數據也會同步進去。

4、but:存在的問題:

1、pg-0 和 pg-1竟然都是主節點了!!!

注意,容器內部的端口問題,以上的配置都需要使用容器內部的5432端口,而非暴露出來的15432端口,后續驗證正常。pg-1還是主節點,pg-0成為了從節點,符合預期。

?2、第二次模擬失敗

[NOTICE] TERM signal received pg-0 | 2025-06-30 08:42:28.609 GMT [233] FATAL: could not receive data from WAL stream: server closed the connection unexpectedly pg-0 | This probably means the server terminated abnormally pg-0 | before or while processing the request. pg-0 | 2025-06-30 08:42:28.609 GMT [232] LOG: invalid record length at 0/8000FC0: wanted 24, got 0 pg-0 | 2025-06-30 08:42:28.613 GMT [403] FATAL: could not connect to the primary server: connection to server at "pg-1" (172.72.10.3), port 5432 failed: Connection refused pg-0 | Is the server running on that host and accepting TCP/IP connections? pg-0 | 2025-06-30 08:42:28.613 GMT [232] LOG: waiting for WAL to become available at 0/8000FD8 pg-1 exited with code 0 pg-0 | [2025-06-30 08:42:30] [ERROR] unable to determine if server is in recovery pg-0 | [2025-06-30 08:42:30] [DETAIL] pg-0 | server closed the connection unexpectedly pg-0 | This probably means the server terminated abnormally pg-0 | before or while processing the request. pg-0 | pg-0 | [2025-06-30 08:42:30] [DETAIL] query text is: pg-0 | SELECT pg_catalog.pg_is_in_recovery() pg-0 | [2025-06-30 08:42:32] [NOTICE] upstream is available but upstream connection has gone away, resetting pg-0 | [2025-06-30 08:42:32] [NOTICE] current upstream node "pg-1" (ID: 1001) is not primary, restarting monitoring pg-0 | [2025-06-30 08:42:32] [ERROR] unable to determine an active primary for this cluster, terminating pg-0

第一次啟動是主節點,pg-1是備份節點。模擬實驗pg-0故障,pgpool會自動將pg-1作為主節點。pg-0節點恢復后會成為備份節點。后續再將pg-1節點關閉掉,此時pgpool在處理事時,直接報上面的錯誤

原因:自從節點自我修復時,需要耗時3-5分鐘,等待修復好,再次down pg-1就可以了!!!

大功告成!?

彩蛋:多機版主需要將pg-0和pg-1的docker-compose分成兩個,保證他們在同一個網絡中間即可,注意也要配置hosts文件。還有端口問題,都使用外部暴露的端口,不使用內部容器的端口。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87250.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink-1.19.0源碼詳解-番外補充3-StreamGraph圖

1.StreamGraph圖: StreamGraph是Flink流處理作業的第一個計算調度流圖,它是從用戶編寫的 DataStream API程序轉換而來的邏輯圖。StreamGraph由StreamNode與StreamEdge組成,StreamNode為記錄數據處理的節點,StreamEdge為連接兩個StreamNode的邊…

linux系統---Nginx反向代理與緩存功能

目錄 正向代理和反向代理 正向代理的作用 反向代理可實現的功能 反向代理客戶端ip透傳 1.初始訪問192.168.235.139 結果 2.編輯代理服務器的配置文件 3、重載nginx服務 4、訪問代理服務器 實現反向代理負載均衡 1.先啟用已用另一臺服務端 2.使用192.168.235.140 …

U+平臺配置免密登錄、安裝Hadoop配置集群、Spark配置

文章目錄 1、免密登錄2、安裝hadoop3、Spark配置 具體詳細報告見資源部分,全部實驗內容已經上傳,如有需要請自行下載。 1、免密登錄 使用的配置命令: cd ~/.ssh/ssh-keygen -t rsaEnter鍵回車y回車回車出現如上所示 cat ./id_rsa.pub >…

GitHub vs GitLab 全面對比報告(2025版)

從技術架構到金融估值,深度解析兩大代碼托管平臺的差異化競爭策略 一、技術架構對比 維度GitHub (Microsoft旗下)GitLab (獨立上市公司)關鍵差異核心架構- 分布式Git倉庫 Issues/Projects- 全棧DevSecOps平臺GitLab集成CI/CD、安全、監控部署模式- SaaS為主 - Git…

Python 數據分析與可視化 Day 14 - 建模復盤 + 多模型評估對比(邏輯回歸 vs 決策樹)

? 今日目標 回顧整個本周數據分析 & 建模流程學會訓練第二種模型:決策樹(Decision Tree)掌握多模型對比評估的方法與實踐輸出綜合對比報告:準確率、精確率、召回率、F1 等指標為后續模型調優與擴展打下基礎 🪜 一…

本周大模型新動向:KV緩存混合精度量化、個體時空行為生成、個性化問答

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入! 01 KVmix: Gradient-Based Layer Importance-Aware Mixed-Precision Quantization for KV Cache 大型語言模型(LLMs)在推理過程中,鍵值(KV)緩存的高內…

在 Spring Boot 中使用 WebMvcConfigurer

WebMvcConfigurer 是 Spring MVC 提供的一個擴展接口,用于配置 Spring MVC 的各種功能。在 Spring Boot 應用中,通過實現 WebMvcConfigurer 接口,可以定制和擴展默認的 Spring MVC 配置。以下是對 WebMvcConfigurer 的詳細解析及其常見用法。…

w-筆記:uni-app的H5平臺和非H5平臺的拍照識別功能:

uni-app的H5平臺和非H5平臺的拍照識別功能&#xff1a; <template><view class"humanVehicleBinding"><view v-if"warn" class"shadow"></view><view class"header"><uni-nav-bar left-icon"l…

TCP 半連接隊列和全連接隊列(結合 Linux 2.6.32 內核源碼分析)

文章目錄 一、什么是 TCP 半連接隊列和全連接隊列二、TCP 全連接隊列1、如何查看進程的 TCP 全連接隊列大小&#xff1f;注意 2、TCP 全連接隊列溢出問題注意 3、TCP 全連接隊列最大長度 三、TCP 半連接隊列1、TCP 半連接隊列溢出問題2、TCP 半連接隊列最大長度3、引申問題 一、…

linux下fabric環境搭建

參考教程&#xff1a; https://devpress.csdn.net/cloudnative/66d58e702045de334a569db3.html?dp_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MjA2MzY4NywiZXhwIjoxNzQwMzY4MDc0LCJpYXQiOjE3Mzk3NjMyNzQsInVzZXJuYW1lIjoiaHVhbmd0dXBpIn0.oh8e4F6Sw_A4SV2ODQ5W0pYK0…

Redis Pipeline介紹:提高操作Redis數據庫的執行效率

Redis Pipeline是一種用于提高Redis執行效率的技術&#xff0c;通過減少客戶端與服務器之間的通信開銷&#xff0c;顯著提升批量操作的性能。本文將詳細介紹Redis Pipeline的概念、使用場景、實現方式及其優勢。 一、Redis Pipeline的概念 Redis Pipeline是一種批處理機制&am…

linux長時間鎖屏無法喚醒

是的&#xff0c;您這么理解很直接&#xff0c;抓住了要點。 簡單來說&#xff0c;就是這樣&#xff1a; 電腦睡覺有兩種方式&#xff1a; 打個盹&#xff08;掛起/Suspend&#xff09;&#xff1a; 把工作狀態保存在內存里。這個一般和 Swap 分區沒關系。睡死過去&#xff…

STM32F103_Bootloader程序開發11 - 實現 App 安全跳轉至 Bootloader

導言 想象一下&#xff0c;我們的單片機 App 正在穩定地運行著&#xff0c;突然我們想給它升級一下&#xff0c;添加個新功能。我們該如何安全地通知它&#xff1a;“嘿&#xff0c;準備好接收新固件了” ? 這就需要 App 和 Bootloader 之間建立一個可靠的"秘密握手"…

Explain解釋

參考官方文檔&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html explain關鍵字可以分析你的查詢語句的結構和性能。 explain select查詢&#xff0c; 執行會返回執行計劃的信息。 注意&#xff1a;如果from中有子查詢&#xff0c;仍然會執行該子查詢…

選擇 PDF 轉 HTML 轉換器的 5 個關鍵特性

市面上有很多 PDF 轉 HTML 的轉換器&#xff0c;每一款產品都有不同的功能組合。要理清并理解每個功能可能會讓人感到困惑。那么&#xff0c;真正重要的是什么呢&#xff1f; 這篇文章將介紹我們認為在選擇最佳 PDF 轉 HTML 轉換器時最重要的 5 個關鍵特性&#xff1a; 1. 轉換…

使用堡塔在服務器上部署寶塔面板-linux版

使用堡塔在服務器上部署寶塔面板-linux版 使用堡塔多機管理登錄服務器 進入寶塔官網&#xff0c;獲取安裝腳本 wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec3. 在堡塔多機管理中&#xff0c;…

【Unity高級】Unity多界面游戲場景管理方案詳解

引言&#xff1a;游戲界面管理的挑戰 在Unity游戲開發中&#xff0c;尤其是包含多個功能界面&#xff08;如主菜單、關卡選擇、游戲頁面、設置和商城&#xff09;的游戲&#xff0c;如何高效管理場景與界面是架構設計的核心挑戰。本文將深入探討三種主流實現方案&#xff1a;單…

WINDOWS最快布署WEB服務器:apache2

安裝JDK下載 https://tomcat.apache.org/ Index of /dist/tomcat/tomcat-9 安裝測試 http://localhost:8080/ 替換自己的文件 把自己的文件復制到&#xff1a; C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT

Microsoft Edge 打開無反應、打開后顯示兼容性問題、卸載重裝 解決方案。一鍵卸載Microsoft Edge 。

背景&#xff1a;網絡上的瀏覽器修復、重裝、恢復默認應用測試后無用&#xff0c;以下卸載重裝方案經實測可以正常使用Microsoft Edg。 卸載軟件在資源里&#xff0c;請自取。 一、卸載軟件&#xff1a;Remove-Edge_GUI.exe 雙擊卸載等待即可。 二、在微軟商店重新安裝Micro…

Spring Boot - 參數校驗:分組校驗、自定義注解、嵌套對象全解析

01 依賴配置 在構建高效的校驗體系前&#xff0c;需先完善項目依賴配置。 以下是優化后的依賴示例&#xff1a; <dependencies><!-- Web 依賴&#xff0c;提供 RESTful 接口支持 --><dependency><groupId>org.springframework.boot</groupId>…