Postgres高可用環境搭建


Postgres高可用環境搭建

1. postgreSQL HA配置

基礎PG的流模式加上pgpool軟件實現雙機熱備,類似於Orical DG的FSF功能。pgpool-1與pgpool-2作為中間件,將主備pg節點加入集群,實現讀寫分離,負載均衡和HA,故障自動切換。兩個pgpool節點使用一個虛擬IP節點,作為應用程序訪問的地址,兩節點之間通過watchdog進行監控,當pgpool-1宕機時,pgpool-2會自動接管虛擬IP繼續對外提供不間斷的服務。

2.pgpool主備模式


3.pgpool常用命令

# 查詢 pgpool節點狀態
psql -h 192.168.230.55 -p 9999 -c "show pool_nodes"

# 查看備庫狀態
psql -p 5433 -c "show transaction_read_only"

# 查看節點狀態
psql -p 9999 -c "show pool_nodes" test

# 啟動pgpool
pgpool -n -d > /tmp/pgpool.log 2>&1 &

show pool_version
show pool_nodes
show pool_status
show pool_pools
show pool_processes


主機規划

1.)配置域名

vim /etc/hosts
192.168.18.211 pg1
192.168.18.212 pg2
192.168.18.215 vip

2.)下載pgpool-3.7.13

下載地址:http://pgpool.net/mediawiki/index.php/Downloads
3.)配置節點互信

# pg1和pg2都執行以下命令,生成公鑰
ssh-kengen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 公鑰互相拷貝
scp ~/.ssh/authorized_keys postgres@pg2:~/.ssh/  # pg1主機
scp ~/.ssh/authorized_keys postgres@pg1:~/.ssh/  # pg2主機

# 驗證,兩個主機均執行如下命令
ssh postgres@pg2 uptime
ssh postgres@pg1 uptime

4.)安裝pgpool

mkdir /usr/local/pgpool   # root用戶
chown postgres:postgres /usr/local/pgpool  # root

cd /osft/pgpool-II-3.7.13
./configure --prefix=/usr/local/pgpool --with-pgsql=/usr/local/pg12.2/
make
make install

5.)安裝pgpool相關的函數,可選,建議安裝

cd /soft/pgool-II-3.7.13/src/sql
make
make install
cd sql
psql -f insert_lock.sql

6.)配置postgres用戶環境變量(pg1,pg2)

vim .bash_profile
export PGPOOL_HOME=/usr/local/pgpool
export PATH=$PATH:$PGPOOL_HOME/bin

7.)配置pgpool
首先配置pg1上的pool_hba.conf,該文件是對登錄用戶進行驗證的,要和pg的pg_hba.conf保持一致。

cd /usr/local/pgpool/etc/
cp pool_hba.conf.sample pool_hba.conf

vim pool_hba.conf
host replication repl  pg2 trust
host replication repl  192.168.18.0/24 trust
host all          all  192.168.18.0/24 trust

其次,配置pcp.conf(pg1,pg2),該文件用於pgpool自己登錄管理使用的,一些操作pgpool的工具會要求提供密碼等,比如節點的添加和刪除等,配置如下:

cd /usr/local/pgpool/etc
cp pcp.conf.sample pcp.conf

# 使用pg_md5生成配置的用戶名和密碼
pg_md5 postgres
xxx

vim pcp.conf
postgres:xxx   # xxx標識上面pg_md5生成的內容

配置pgpool.conf,在pgpool中添加pg數據庫的用戶名和密碼(pg1,pg2)

# 創建pgpool.conf文件
cp pgpool.conf.sample-master-slave pgpool.conf

pg_md5 -p -m -u postgres pool_passwd
# 輸入數據庫登錄用戶postgres密碼,生成pool_passwd文件

more pool_passwd # 查看生成的文件

最后,配置pgpool.conf,該文件是最核心的文件,HA是否能夠正常雲霄路,與該文件息息相關,該配置文件分為不同的模塊,需要根據不同的模塊來配置。





pg2主機上的pgpool.conf其他配置同上,不同之處如下:

8)切換腳本的編輯(pg1,pg2)
vim /usr/local/pgpool/failover_stream.sh

賦予執行權限:
chmod +x /usr/local/pgpool/failover_stream.sh

9.)設置ip arping等setuid權限,執行failover_stream.sh時會用到,否則無法啟動IP(pg1,pg2)

chmod u+x /sbin/ip
chmod u+x /sbin/arping

10)啟動集群守護進程
pg1、pg2啟動數據庫與pgpool進程

pg_ctl start -l pg.log
pgpool -n -d -D > /usr/local/pgpool/pgpool.log 2>&1 &   #-d 標識debug狀態
  1. 查看pgpool后台進程
ps -ef |grep pgpool

12)啟動順序:
先啟動主庫的pg數據庫,然后再啟動主庫的pgpool守護進程,這樣vip會在主庫上生成,否則會在備庫上產生,但是不影響業務的訪問。可以看出vip是可以在不同的集群上漂移,跟以往的雙機熱備有區別的。接着再啟動備庫的pg數據庫,最后啟動pgpool進程。

13)故障切換
場景一:模擬主庫pgpool進程中斷,此時備庫主機的pgpool會把vip接管過來,但是主備庫的角色沒有發生變化。

pgpool -m start stop

show pool_nodes; # 先連數據庫,再查看

pg_controldata |grep cluster

場景二:模擬主庫數據庫關閉,pg_ctl -m fast stop 此處備庫的pgpool切換腳本會把備庫切換成主庫,提供主庫服務。檢查postgresql.auto.conf文件,需要將primary_conninfo注釋掉,否則不會承擔主庫的責任,向備庫發送日志,重啟數據庫。

場景三:將原來的主庫編程備庫,創建standby.signal文件:


執行pg_ctl promote命令會進行主從切換,執行后發現standby.signal備刪除了,查看最新狀態pg_controlddata |grep cluster 原來備庫的postgresql.auto.conf中自動添加了一行primary_conninfo的信息,需要把這行注釋,否則雖然現在是主庫,但是配置還是當做備庫,日志會報錯background worker logical replication launcher exited with exit code

啟動備庫,注意rewind會自動把standby.signal文件刪除,以及修改postgres.auto.conf文件,需要手動修改,主庫數據庫如果管理或者發生異常中斷,pgpool會將備庫切換成主庫,提供服務,不會影響業務,但是恢復主備庫之間的關系,需要人為干預,不夠智能。所以如果需要維護數據庫,需要先停止pgpool進程再關閉主庫,否則發生切換,害的修復備庫。

14)壓力測試
方法一:通過第三台機器網絡連接測試:

方法二:pgbench工具測試

pgbench -c 30 -T 60 -h vip -p 9999 -U postgres -r postgres
pgbench -c 30 -T 60 -S -h vip -p 9999 -U postgres -r postgres # select壓力測試,兩個節點負載均衡

方法三:把備庫脫離出集群,進行單機測試:

pcp_detach_node -h vip -p 9898 -U postgres -n 0
pgbench -c 30 -T 60 -S -h vip -p 9999 -U postgres -r postgres


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM