溫馨提示×

PostgreSQL在Ubuntu上的集群搭建方案

小樊
52
2025-09-23 10:54:35
欄目: 云計算

PostgreSQL在Ubuntu上的集群搭建方案

一、基礎環境準備

在Ubuntu系統上搭建PostgreSQL集群前,需完成以下基礎配置:

  1. 安裝PostgreSQL:在所有節點執行sudo apt update && sudo apt install -y postgresql postgresql-contrib,安裝PostgreSQL數據庫及擴展工具。
  2. 安裝repmgr工具:repmgr是PostgreSQL集群管理的核心工具,用于主從復制、故障檢測與自動切換。執行以下命令安裝:
    sudo apt install -y libcurl4-openssl-dev libjson-c-dev flex libselinux1-dev libzstd-dev liblz4-dev libxslt1-dev libxml2-dev libpam0g-dev libssl-dev libkrb5-dev zlib1g-dev libreadline-dev
    wget https://www.repmgr.org/download/repmgr-5.5.0.tar.gz
    tar xvf repmgr-5.5.0.tar.gz
    cd repmgr-5.5.0/
    ./configure && make && sudo make install
    
  3. 配置SSH免密登錄:在主節點生成SSH密鑰(ssh-keygen),并將公鑰復制到所有從節點(ssh-copy-id <從節點IP>),確保節點間可通過SSH無密碼通信。
  4. 規劃集群架構:常見架構包括“1主2備”(基礎高可用)、“1主2備+Pgpool”(負載均衡+故障轉移)。節點IP需固定,避免變動。

二、基于repmgr的主從集群搭建(基礎高可用)

1. 主節點配置

  • 修改PostgreSQL配置文件/etc/postgresql/<版本>/main/postgresql.conf):
    wal_level = replica                # 啟用WAL日志(支持復制)
    max_wal_senders = 10               # 允許的最大WAL發送器數量(至少比備節點數多1)
    max_replication_slots = 10         # 最大復制槽數(與備節點數一致)
    hot_standby = on                   # 允許備節點以只讀模式運行
    
  • 修改pg_hba.conf文件/etc/postgresql/<版本>/main/pg_hba.conf):
    添加以下規則,允許從節點連接主節點:
    host    replication     repmgr    <從節點IP>/32    md5
    host    repmgr          repmgr    192.168.1.0/24    trust  # 集群內部節點信任(生產環境建議用md5)
    
  • 重啟PostgreSQL服務sudo systemctl restart postgresql。
  • 創建repmgr用戶與數據庫
    sudo -u postgres psql -c "CREATE USER repmgr WITH SUPERUSER REPLICATION PASSWORD 'repmgr123';"
    sudo -u postgres createdb -O repmgr repmgr;
    ALTER USER repmgr SET search_path TO repmgr, "$user", public;
    

2. 從節點配置

  • 停止PostgreSQL服務sudo systemctl stop postgresql。
  • 清空數據目錄(若為全新節點):sudo rm -rf /var/lib/postgresql/<版本>/main/*。
  • 克隆主節點數據:使用pg_basebackup從主節點同步數據:
    sudo -u postgres pg_basebackup -h <主節點IP> -D /var/lib/postgresql/<版本>/main -U repmgr -P --wal-method=stream
    
  • 創建repmgr.conf文件/etc/repmgr.conf):
    node_id=2                          # 從節點ID(主節點為1)
    node_name='node2'                  # 節點名稱(需唯一)
    conninfo='host=<從節點IP> user=repmgr dbname=repmgr connect_timeout=2'
    data_directory='/var/lib/postgresql/<版本>/main'
    

3. 注冊與啟動集群

  • 主節點注冊:在主節點執行repmgr -f /etc/repmgr.conf primary register,將主節點加入集群。
  • 從節點注冊:在從節點執行repmgr -f /etc/repmgr.conf standby register,將從節點注冊到主節點。
  • 驗證集群狀態:在任意節點執行repmgr -f /etc/repmgr.conf cluster show,查看集群節點狀態(主節點狀態為“primary”,從節點為“standby”)。
  • 啟動repmgrd守護進程:在所有節點執行repmgrd -f /etc/repmgr.conf --daemonize,監控節點狀態并自動處理故障。

三、集成Pgpool實現負載均衡與自動故障轉移

Pgpool是一個PostgreSQL中間件,提供連接池、負載均衡、自動故障轉移功能,適用于生產級高可用場景。

1. 安裝Pgpool

在獨立節點(或主節點)安裝Pgpool:

sudo apt install -y pgpool2

2. 配置Pgpool

  • 修改Pgpool配置文件/etc/pgpool2/pgpool.conf):
    listen_addresses = '*'             # 監聽所有IP
    backend_hostname0 = '<主節點IP>'    # 主節點IP
    backend_port0 = 5432
    backend_weight0 = 1
    backend_hostname1 = '<備節點1IP>'   # 備節點1IP
    backend_port1 = 5432
    backend_weight1 = 1
    backend_hostname2 = '<備節點2IP>'   # 備節點2IP
    backend_port2 = 5432
    backend_weight2 = 1
    sr_check_period = 10               # 主節點狀態檢查間隔(秒)
    failover_command = '/etc/pgpool2/failover.sh %d %H %P'  # 故障轉移腳本
    load_balance_mode = on             # 開啟負載均衡
    
  • 創建故障轉移腳本/etc/pgpool2/failover.sh):
    編寫腳本實現主節點故障時自動晉升備節點(需根據環境調整路徑):
    #!/bin/bash
    FAILED_NODE=$1
    NEW_PRIMARY=$2
    PGDATA=$3
    # 停止故障節點的Pgpool服務
    ssh postgres@$FAILED_NODE "systemctl stop pgpool"
    # 晉升備節點為主節點
    ssh postgres@$NEW_PRIMARY "pg_ctl promote -D $PGDATA"
    # 重新配置Pgpool連接
    ssh postgres@$NEW_PRIMARY "pgpool -n -f /etc/pgpool2/pgpool.conf"
    

3. 啟動Pgpool

sudo systemctl start pgpool2
sudo systemctl enable pgpool2

4. 驗證負載均衡

通過Pgpool節點連接數據庫(psql -h <PgpoolIP> -U postgres),執行查詢時,Pgpool會自動將讀請求分發到備節點,寫請求發送到主節點。

四、注意事項

  1. 數據一致性:確保主從節點的wal_level、archive_mode等參數一致,避免數據丟失。
  2. 安全配置:生產環境中,pg_hba.conf應使用md5scram-sha-256認證,避免明文密碼傳輸。
  3. 監控與告警:使用pg_stat_replication視圖監控復制狀態,結合Prometheus+Granafa搭建監控告警體系。
  4. 備份策略:定期備份主節點數據(如使用pg_dumpbarman),避免集群完全故障時數據丟失。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女