利用 Patroni + etcd + HAProxy 搭建高可用 PostgreSQL 集群

在生产环境中,数据库的高可用性是系统稳定运行的关键。本文将详细讲解如何利用 Docker 部署一个由 etcd、Patroni 和 HAProxy 组成的 PostgreSQL 高可用集群,实现自动故障转移和负载均衡。

架构概述

本架构主要包括三部分:

  1. etcd 集群
    etcd 作为分布式键值存储,为 Patroni 提供集群状态、元数据存储与服务发现功能。本例中,我们使用 3 个 etcd 节点构建一个高可用的 etcd 集群。

  2. Patroni 管理的 PostgreSQL 集群
    Patroni 通过监控 PostgreSQL 实例的状态,并利用 etcd 作为一致性存储,实现主从切换与故障恢复。这里我们部署 3 个 Patroni 节点,每个节点内嵌一个 PostgreSQL 实例。

  3. HAProxy 负载均衡器
    HAProxy 作为数据库访问入口,将外部请求均衡分发到 Patroni 管理的 PostgreSQL 实例中。通过健康检查确保只将请求转发到正常的节点上。

Docker 部署示例

下面提供一个完整的 Docker Compose 文件示例,包含 3 个 etcd 节点、3 个 Patroni 节点和 1 个 HAProxy 节点。你只需将以下内容保存为 docker-compose.yaml 文件,并在同级目录下创建 HAProxy 配置文件 haproxy.cfg

docker-compose.yaml

version: "3.9"services:# etcd 集群(三个节点)etcd1:image: quay.io/coreos/etcd:v3.5.7container_name: etcd1environment:- ETCD_NAME=etcd1- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379ports:- "2379:2379"- "2380:2380"networks:- pat_networketcd2:image: quay.io/coreos/etcd:v3.5.7container_name: etcd2environment:- ETCD_NAME=etcd2- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379networks:- pat_networketcd3:image: quay.io/coreos/etcd:v3.5.7container_name: etcd3environment:- ETCD_NAME=etcd3- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2379networks:- pat_network# Patroni 管理的 PostgreSQL 集群(3 节点)patroni1:image: zalando/patroni:latestcontainer_name: patroni1environment:- PATRONI_NAME=patroni1- PATRONI_RESTAPI_LISTEN=0.0.0.0:8008- PATRONI_RESTAPI_CONNECT_ADDRESS=patroni1:8008- PATRONI_POSTGRESQL_LISTEN=0.0.0.0:5432- PATRONI_POSTGRESQL_CONNECT_ADDRESS=patroni1:5432- PATRONI_ETCD_HOSTS=etcd1:2379,etcd2:2379,etcd3:2379- PATRONI_SCOPE=batman_cluster- PATRONI_NAMESPACE=/service/- PATRONI_LOG_LEVEL=INFOvolumes:- ./patroni1/data:/var/lib/postgresql/dataports:- "5433:5432"depends_on:- etcd1- etcd2- etcd3networks:- pat_networkpatroni2:image: zalando/patroni:latestcontainer_name: patroni2environment:- PATRONI_NAME=patroni2- PATRONI_RESTAPI_LISTEN=0.0.0.0:8008- PATRONI_RESTAPI_CONNECT_ADDRESS=patroni2:8008- PATRONI_POSTGRESQL_LISTEN=0.0.0.0:5432- PATRONI_POSTGRESQL_CONNECT_ADDRESS=patroni2:5432- PATRONI_ETCD_HOSTS=etcd1:2379,etcd2:2379,etcd3:2379- PATRONI_SCOPE=batman_cluster- PATRONI_NAMESPACE=/service/- PATRONI_LOG_LEVEL=INFOvolumes:- ./patroni2/data:/var/lib/postgresql/dataports:- "5434:5432"depends_on:- etcd1- etcd2- etcd3networks:- pat_networkpatroni3:image: zalando/patroni:latestcontainer_name: patroni3environment:- PATRONI_NAME=patroni3- PATRONI_RESTAPI_LISTEN=0.0.0.0:8008- PATRONI_RESTAPI_CONNECT_ADDRESS=patroni3:8008- PATRONI_POSTGRESQL_LISTEN=0.0.0.0:5432- PATRONI_POSTGRESQL_CONNECT_ADDRESS=patroni3:5432- PATRONI_ETCD_HOSTS=etcd1:2379,etcd2:2379,etcd3:2379- PATRONI_SCOPE=batman_cluster- PATRONI_NAMESPACE=/service/- PATRONI_LOG_LEVEL=INFOvolumes:- ./patroni3/data:/var/lib/postgresql/dataports:- "5435:5432"depends_on:- etcd1- etcd2- etcd3networks:- pat_network# HAProxy 作为 PostgreSQL 的访问入口haproxy:image: haproxy:latestcontainer_name: haproxyports:- "5432:5432"configs:- source: haproxy_cfgtarget: /usr/local/etc/haproxy/haproxy.cfgdepends_on:- patroni1- patroni2- patroni3networks:- pat_networkconfigs:haproxy_cfg:file: ./haproxy.cfgnetworks:pat_network:driver: bridge

haproxy.cfg

在与 docker-compose.yaml 同级目录下创建 haproxy.cfg 文件,内容如下:

globallog stdout format raw local0defaultslog     globalmode    tcptimeout connect 10stimeout client  30stimeout server  30sfrontend pgsql_frontbind *:5432default_backend pgsql_backbackend pgsql_backbalance roundrobinserver patroni1 patroni1:5432 check port 8008server patroni2 patroni2:5432 check port 8008server patroni3 patroni3:5432 check port 8008

部署步骤

  1. 准备环境
    将上述两个文件(docker-compose.yamlhaproxy.cfg)放置在同一目录中,同时为每个 Patroni 节点创建对应的数据目录(例如:./patroni1/data./patroni2/data./patroni3/data)。

  2. 启动服务
    在目录中执行以下命令启动所有服务:

    docker-compose up -d
    
  3. 验证部署

    • 通过 docker ps 检查所有容器均已正常启动。
    • 通过访问 HAProxy 映射的端口(5432),即可连接到后端 Patroni 集群中的 PostgreSQL 实例。
    • 通过 Patroni 的 REST API 端口(各容器的 8008 端口)可查询集群状态与节点信息。

总结

使用 Patroni + etcd + HAProxy 构建的 PostgreSQL 高可用集群能够实现自动故障转移和负载均衡,确保数据库服务在节点故障时依然保持可用。该方案适用于需要高可用数据库支撑的生产环境。
通过 Docker Compose 快速构建此架构后,后续可以结合 Kubernetes 等编排工具进一步扩展部署,实现更高的弹性与可维护性。

希望这篇博客对你在高可用数据库部署方面有所帮助,如有疑问或进一步需求,欢迎在评论区交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bash 和 pip 是两种完全不同用途的命令,分别用于[系统终端操作]和[Python 包管理]

bash 和 pip 是两种完全不同用途的命令,分别用于 系统终端操作 和 Python 包管理。以下是它们的核心区别、用法及常见场景对比: 1. 本质区别 特性bashpip类型Shell 命令解释器(一种脚本语言)Python 包管理工具作用执行系统命令、…

分布式系统的CAP理论、事务和锁实现

分布式系统核心概念 1. CAP理论 CAP理论指出,分布式系统最多同时满足以下三项中的两项: 一致性(CC):所有节点访问同一份最新数据。可用性(AA):每个请求都能在合理时间内获得非错误…

鸿蒙UI开发

鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议,特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况(自适应布局/响应式布局) 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …

FreeRTOS 五种内存管理算法深度对比分析

FreeRTOS 提供了五种动态内存管理算法(heap_1 至 heap_5),针对不同应用场景在实时性、内存效率、碎片控制等方面进行了差异化设计。以下从实现原理、性能指标及适用场景进行全面对比: 一、Heap_1:静态分配优先 ​核心…

基于EFISH-SBC-RK3576的无人机智能飞控与数据存储方案

一、方案背景 民用无人机在电力巡检、农业植保、应急救援等领域快速普及,但传统方案面临‌多协议设备兼容性差‌、‌野外环境数据易丢失‌、‌复杂电磁干扰‌三大痛点。 电鱼智能推出‌EFISH-SBC-RK3576‌,可集成双冗余总线接口与工业级加固存储&#x…

怎样进行服务器的日常安全监控和审计?

服务器的日常安全监控和审计是保障服务器安全运行的重要措施,以下是一些常见的方法和工具: 系统日志监控 启用日志功能:确保服务器操作系统、应用程序和数据库等都启用了详细的日志记录功能。例如,Linux 系统中的 syslog&#x…

数据库----单表、多表

数据库 create database 数据库名称;---创建数据库create database 数据库名称 default charsetutf8mb4;---创建数据库,同时指定编码show databases;---查看当前数据库管理下存在多少数据库show databases like "db_%";---查询以db_开头的数据库select d…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例6,TableView16_06 分页表格拖拽排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

遗传算法优化支持向量机分类是一种将遗传算法与支持向量机相结合的方法

遗传算法优化支持向量机分类是一种将遗传算法与支持向量机相结合的方法,旨在提高支持向量机的分类性能。以下是其相关内容的详细介绍: 支持向量机(SVM) 原理:SVM是一种基于统计学习理论的机器学习方法,其…

Python中的Requests库

什么是Python中的Requests模块? requests模块是Python中广泛使用的库,用于简化HTTP请求的发送和响应处理。无论是调用API、下载文件、处理复杂会话管理,requests都能提供很好的解决方案。 一、基础使用方法 1.GET请求 GET请求用于获取服务…

复习MySQL20250327

第一章 基本操作 一、管理数据库 难点:创建数据库 输入cmd的MySQL安装路径C:\Program Files\MySQL\MySQL Server 8.0\bin 1.查看所有数据库 show databases; 2.创建数据库 create database hsusers default charset utf8 collate utf8_general_ci;create data…

谷歌推出Gemini实时AI视频功能,开启智能交互新体验

3月24日,谷歌发言人亚历克斯约瑟夫向媒体证实,谷歌已开始向 Gemini Live 推出新的人工智能功能。这些功能使 Gemini 能够“看到”用户的屏幕内容,或通过智能手机摄像头获取画面,并实时回答与之相关的问题。这一创新标志着人工智能…

Windows 新型零日漏洞:远程攻击可窃取 NTLM 凭证,非官方补丁已上线

近日,安全研究人员披露了一个新型 Windows 零日漏洞,影响从Windows 7和Server 2008 R2到最新Windows 11 v24H2及Server 2025的所有Windows操作系统版本。攻击者只需诱使用户在Windows资源管理器中查看恶意文件,即可利用该零日漏洞窃取NTLM&am…

一款超级好用且开源免费的数据可视化工具——Superset

认识Superset 数字经济、数字化转型、大数据等等依旧是如今火热的领域,数据工作有一个重要的环节就是数据可视化。 看得见的数据才更有价值! 现如今依旧有多数企业号称有多少多少数据,然而如果这些数据只是呆在冷冰冰的数据库或文件内则毫无…

作业14 (2023-05-22_const修饰指针)

第1题/共5题【单选题】 C程序常见的错误分类不包含:( ) A.编译错误 B.链接错误 C.栈溢出 D.运行时错误 回答正确 答案解析: 栈溢出是运行时错误的一种,因此C程序不会将栈溢出错误单独列出来,栈溢出包含在运行时错误中。 因此:选择C 第2题/共5题【单选题】 以下关于…

《Tr0ll2 靶机渗透实战:弱口令+SUID+两种缓冲区溢出+ 提权完整+fcrackzip暴力破解+shellshock漏洞+脏牛三种root提权复盘》

Tr0ll2 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.181 nmap -sS -A -T4 -p- 192.168.66.181 nmap --scriptvuln 192.168.66.181PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.4 (…

redis常用部署架构之redis分片集群。

redis 3.x版本后开始支持 作用: 1.提升数据读写速度 2..提升可用性 分片集群就是将业务服务器产生的数据储存在不同的机器上。 redis分片集群的架构 如上图所示,会将数据分散存储到不同的服务器上,相比于之前来说,redis要处…

分布式数据库介绍

分布式数据库介绍 一、定义与核心概念 分布式数据库是一种在物理上分散存储、逻辑上统一管理的数据管理系统,其核心特征包括数据分布性、逻辑关联性、场地透明性和可扩展性。根据最新定义,分布式数据库需具备分布式事务处理能力、平滑扩展能力&#xf…

MybatisPlus(SpringBoot版)学习第五讲:条件构造器和常用接口

目录 1.wrapper介绍 2.QueryWrapper 2.1 例1:组转查询条件 Compare Nested Join Func 2.2 例2:组装排序条件 2.3 例3:组装删除条件 2.4 例4:条件的优先级 2.5 例5:组装select子句 2.6 例6:实现子查…

OkHttp 的证书设置

在 Android 开发中,通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性,防止中间人攻击(如抓包工具 Charles/Fiddler 的拦截)。以下是实现防抓包的关键技术方案: 一、Okhttp设…