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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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>…