Postgresql通過docker進行高可用部署

来源:https://www.cnblogs.com/qgdtq/archive/2023/02/09/17106567.html
-Advertisement-
Play Games

Postgresql通過docker進行高可用部署 在postgresql官網看了pgpool-II的文檔,發現部署比較麻煩 pgpool-II官方文檔:https://www.pgpool.net/mediawiki/index.php/Documentation 為了方便快捷還是使用docker ...


Postgresql通過docker進行高可用部署

在postgresql官網看了pgpool-II的文檔,發現部署比較麻煩

pgpool-II官方文檔:https://www.pgpool.net/mediawiki/index.php/Documentation

為了方便快捷還是使用docker部署,然後在dockerhub上找到了相關的鏡像:

bitnami/postgresql-repmgrbitnami/pgpool

從如下截圖中可以看到下載量還是很高的:

簡單介紹就是:

bitnami/postgresql-repmgrPostgreSQL HA對應的docker鏡像,PostgreSQL HA 是 PostgreSQL 集群解決方案,其中包括 PostgreSQL 複製管理器,這是一個用於管理 PostgreSQL 集群上的複製和故障轉移的開源工具。

bitnami/pgpoolPgpool-II 對應的docker鏡像,是 PostgreSQL 代理。它位於 PostgreSQL 伺服器和它們的客戶端之間,提供連接池、負載平衡、自動故障轉移和複製。

試驗環境

兩台機器:server-0:192.168.30.141、server-1:192.168.30.134

pg-0、pg-1代表postgresql-repmgr容器

pg-0做主庫,pg-1做從庫

系統:ubuntu20.04

docker版本20.10.12

docker-compose版本1.25.0

需要準備的鏡像

bitnami/postgresql-repmgr:14 對應著postgresql14

bitnami/pgpool:4

修改hosts文件

分別修改server-0、server-1上的hosts文件

sudo vim /etc/hosts添加下麵的內容

192.168.30.141 pg-0
192.168.30.134 pg-1

部署資料庫伺服器

在server-0的創建文件:touch ~/pgdb/docker-compose.yml

version: '2'

services:
  pg-0:
    image: bitnami/postgresql-repmgr:14
    network_mode: "host"
    container_name: "pgrepmgr0"
    ports:
      - 5432
    volumes:
      - ./data:/bitnami/postgresql
    environment:
      - POSTGRESQL_POSTGRES_PASSWORD=adminpassword
      - POSTGRESQL_USERNAME=customuser
      - POSTGRESQL_PASSWORD=custompassword
      - POSTGRESQL_DATABASE=customdatabase
      - POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
      - REPMGR_USERNAME=repmgr
      - REPMGR_PASSWORD=repmgrpassword
      - REPMGR_PRIMARY_HOST=pg-0
      - REPMGR_PRIMARY_PORT=5432
      - REPMGR_PARTNER_NODES=pg-0,pg-1:5432
      - REPMGR_NODE_NAME=pg-0
      - REPMGR_NODE_NETWORK_NAME=pg-0
      - REPMGR_PORT_NUMBER=5432
    restart: always
      

在server-1的創建文件:touch ~/pgdb/docker-compose.yml

version: '2'

services:
  pg-1:
    image: bitnami/postgresql-repmgr:14
    network_mode: "host"
    container_name: "pgrepmgr1"
    volumes:
      - ./data:/bitnami/postgresql
    environment:
      - POSTGRESQL_POSTGRES_PASSWORD=adminpassword
      - POSTGRESQL_USERNAME=customuser
      - POSTGRESQL_PASSWORD=custompassword
      - POSTGRESQL_DATABASE=customdatabase
      - POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
      - REPMGR_USERNAME=repmgr
      - REPMGR_PASSWORD=repmgrpassword
      - REPMGR_PRIMARY_HOST=pg-0
      - REPMGR_PRIMARY_PORT=5432
      - REPMGR_PARTNER_NODES=pg-0,pg-1:5432
      - REPMGR_NODE_NAME=pg-1
      - REPMGR_NODE_NETWORK_NAME=pg-1
      - REPMGR_PORT_NUMBER=5432
    restart: always


為了數據持久化,我們把/bitnami/postgresql目錄掛載到當前的data目錄中

docker-compose up的時候應該會出現許可權問題,這個時候我們給新建的data目錄相應許可權就行了,執行如下命令:

sudo chgrp -R root data

sudo chmod -R g+rwX data

再次docker-compose up -d應該就好了

部署pgpool

server-0中

為了後續方便修改配置文件,我們把配置文件掛載出來

首先在創建配置文件./conf/myconf.conf

然後在創建文件touch ~/pgpool/docker-compose.yml

version: '2.1'
services:
  pgpool:
    image: bitnami/pgpool:4
    container_name: "pgpool"
    network_mode: "bridge"
    ports:
      - 9999:5432
    volumes:
      - ./conf/myconf.conf:/config/myconf.conf
    environment:
      - PGPOOL_USER_CONF_FILE=/config/myconf.conf
      - PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5432
      - PGPOOL_SR_CHECK_USER=repmgr
      - PGPOOL_SR_CHECK_PASSWORD=repmgrpassword
      - PGPOOL_ENABLE_LDAP=no
      - PGPOOL_POSTGRES_USERNAME=postgres
      - PGPOOL_POSTGRES_PASSWORD=adminpassword
      - PGPOOL_ADMIN_USERNAME=admin
      - PGPOOL_ADMIN_PASSWORD=adminpassword
      - PGPOOL_ENABLE_LOAD_BALANCING=yes
      - PGPOOL_POSTGRES_CUSTOM_USERS=customuser
      - PGPOOL_POSTGRES_CUSTOM_PASSWORDS=custompassword
    restart: always
    extra_hosts:
      - "pg-0:192.168.30.141"
      - "pg-1:192.168.30.134"
    healthcheck:
      test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]
      interval: 10s
      timeout: 5s
      retries: 5

docker-compose up後看沒有報錯就好了,通過pgpool可以實現資料庫的負載均衡和讀寫分離

測試

測試數據能否共用

用navicat連接pgpoll

創建一個表插入數據後看pg-0和pg-1是否一致

創建users表然後插入兩條數據:

而且pg-1從庫只能讀不能寫,在pg-1中直接修改數據會報如下錯誤:

測試能否故障轉移

我們停掉主庫pg-0後查看pgpool服務日誌

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

然後去pg-1中查看一下,數據是同步的

我們在把pg-0啟動起來。然後看pgpool日誌如下,pg-1是可以成功鏈接到pgpool的

看pg-1的日誌如下:

會發現就算pg-0重新啟動器來了,但是pg-1還是主節點不變,pg-0又會成為副節點。

去pg-0中查看,剛剛新插入的數據也能同步的。

本文來自博客園,作者:qgdtq,轉載請註明原文鏈接:https://www.cnblogs.com/qgdtq/p/17106567.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 修改Windows遠程桌面3389埠 Windows版本:windows10、Windows server 2016、2019(其他版本沒有測過,應該也適用) 1、Windows桌面上,點擊“開始-運行”或鍵盤按下“WIN+R”打開運行視窗,輸入“regedit”,點擊確定打開註冊表編輯器。 2、 ...
  • 自己編譯的內核進行修改後為後續方便查詢是那個版本的系統。 所以每次更改內核後都需要修改一下版本信息, 又因為內核一般是不變的為了區分所以增加到擴展版本上。 操作環境: 硬體是全志 V3S Linux內核是3.4 修改的方法: 方法一: 一個在menuconfig中進行增加 打開menuconfig ...
  • 1、大多數情況下很正常,偶爾很慢,則有如下原因 (1)、資料庫在刷新臟頁,例如 redo log 寫滿了需要同步到磁碟。 (2)、執行的時候,遇到鎖,如表鎖、行鎖。 (3)、sql寫的爛 2、這條 SQL 語句一直執行的很慢,則有如下原因 (1)、沒有用上索引或索引失效:例如該欄位沒有索引;或則由於 ...
  • 摘要:提供一種執行高效的TereData的marco遷移方案。 本文分享自華為雲社區《GaussDB(DWS)遷移 - teredata相容 -- macro相容 # 【玩轉PB級數倉GaussDB(DWS)】》,作者: 譡里個檔 。 Teradata的巨集是一組可以接受參數的SQL語句,通過調用巨集名 ...
  • 總結了一下在以往工作中,對於`Hive SQL`調優的一些實際應用,是日常積累的一些優化技巧,如有出入,歡迎在評論區留言探討~ ...
  • 記錄一些工作中有意思的統計指標,做過一些簡化方便大家閱讀,記錄如有錯誤,歡迎在評論區提問討論~ 問題類型 連續問題 兩種思路 第一種:日期減去一列數字得出日期相同,主要是通過row_number視窗函數 第二種:後一個日期減去前一個日期差值相等,用的較少,可以用lag/lead視窗函數解決 分組問題 ...
  • 一、研發背景 DataX官方開源的版本支持HDFS文件的讀寫,但是截止目前,並沒有支持Parquet文件的讀寫,得益於DataX出色的數據同步性能,去年公司的項目大部分採用了DataX作為數據同步工具,但是從CDH集群同步Parquet或者將其他數據源的數據以Parquet格式寫入HDFS,這兩個常 ...
  • 前文回顧 實現一個簡單的Database系列 譯註:cstack在github維護了一個簡單的、類似sqlite的資料庫實現,通過這個簡單的項目,可以很好的理解資料庫是如何運行的。本文是第八篇,主要是對B-tree的葉子節點格式的實現 Part 8 B-Tree葉子節點格式 我們準備把表的格式從非排 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...