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狀態
- 查看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