利用 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.pswp.cn/bicheng/74743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74743.shtml
英文地址,請注明出處:http://en.pswp.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設…