PostgreSQL高可用(二)使用pgpool实现主从切换+读写分离
文章目錄
- 1主從流復制
- 1.1 主機分配
- 2主從切換
- 2.1 手動切換
- 2.2 pgpool 自動切換
- 2.2.1 解壓編譯安裝
- 2.2.2 添加環境變量
- 2.2.3 配置pool_hba.conf
- 2.2.4 配置pcp.conf和pool_passwd
- 2.2.5 修改pcp.conf
- 2.2.6 配置pgpool.conf
- 2.2.7 failover_stream.sh內容:
- 2.2.8 pgpool的啟動和關閉
- 2.2.9 查看集群狀態
- 3 測試(模擬master宕機)
- 3.1 關閉master數據庫
- 3.2 宕機后的恢復
- 3.2.1 首先將master中的recovery.done改為recovery.conf,讓它成為新的從庫
- 3.2.2 啟動宕機的數據庫
- 3.2.3 使用pcp_attach_node命令
- 3.2.4 查看當前集群狀態
- 4 讀寫分離
1主從流復制
主從復制請看:[PostgreSQL高可用(一)主從流復制]
1.1 主機分配
2主從切換
2.1 手動切換
在上一節中,配置好了流復制結構,接下來模擬主庫宕機,進行測試。
1.主庫宕機
在master上執行
會發現測試庫報錯,連接不上主庫。
這時我們創建觸發文件。
也可以放在別的目錄,記得要給postgres權限。
這時,測試庫會變成主庫。我們在slave上的測試庫中新建測試表,并插入數據。
將主庫的recover.done變為recovery.conf
mv recovery.done recovery.conf啟動主庫
pg_ctl start主庫會自動的發現時間線的差異,并拷貝過來。
登錄主庫查詢,可以查到數據。
如果你們更改recovery.done,或者進行了別的操作,你會發現數據是不一樣的。
這是你需要停掉被恢復的庫,手動同步時間線。
將主庫的recover.done變為recovery.conf
mv recovery.done recovery.conf再次啟動主庫。數據就已經同步了。
你可以多次手動切換進行測試,但是你會發現一個問題。
觸發文件trigger_file0每次在即創建完成后并不會存在,他在切換完成后就消失了。每次都要手動創建文件的話很麻煩,所以使用pgpool進行自動切換。
2.2 pgpool 自動切換
下載地址:http://www.pgpool.net/mediawiki/images/
2.2.1 解壓編譯安裝
tar -zxvf pgpool-II-3.6.0.tar.gz -C /opt/ cd /opt/pgpol-II/ ./configure –prefix=/opt/pgpool -with-pgsql=path -with-pgsql=/home/postgres make make install2.2.2 添加環境變量
vim /etc/profilePGPOOL_HOME=/opt/pgpool export PGPOOL_HOME PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin:$PGPOOL_HOME/bin export PATH #使之生效 source /etc/profile2.2.3 配置pool_hba.conf
增加一下內容
host all all 0.0.0.0/0 md5 [postgres@pool etc]$ pwd /opt/pgpool/etc [postgres@pool etc]$ cat pool_hba.conf local all all trust host all all ::1/128 trust host all all 0.0.0.0/0 md52.2.4 配置pcp.conf和pool_passwd
(master)主節點登陸后執行:
postgres=# select rolname,rolpassword from pg_authid;rolname | rolpassword --------------------+-------------------------------------postgres | md59df270eb52907fff723d9b8b7436113astream_replication | md54ef59c2cef276ba5fadf7c4bb545ea2cpgpool | md50b5752e4c7711493bdd283d5c4853774 (3 rows)修改pool_passwd增加SQL執行結果的內容
形式為rolname:rolpassword例如:
postgres:md59df270eb52907fff723d9b8b7436113a
2.2.5 修改pcp.conf
[postgres@pool etc]$ pg_md5 -u postgres 123 202cb962ac59075b964b07152d234b70 [postgres@pool etc]$ vim /etc/pgpool/pcp.conf ## 加入 postgres:上一命令的輸出 postgres:202cb962ac59075b964b07152d234b702.2.6 配置pgpool.conf
內容如下:根據自己的配置進行相應的修改
#CONNECTIONSlisten_addresses = '*' port = 9999 socket_dir = '/opt/pgpool' pcp_listen_addresses = '*' pcp_port = 9898 pcp_socket_dir = '/opt/pgpool'# - Backend Connection Settings -backend_hostname0 = '192.168.36.130' #主庫hosts backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/home/postgres/data' #數據庫位置 backend_flag0 = 'ALLOW_TO_FAILOVER' # backend_hostname1 = '192.168.36.131' #從庫hosts backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/home/postgres/data' #數據庫位置 backend_flag1 = 'ALLOW_TO_FAILOVER' # # # - Authentication - # enable_pool_hba = on pool_passwd = 'pool_passwd' # # # FILE LOCATIONS # pid_file_name = '/opt/pgpool/pgpool.pid' ##pid文件位置 logdir = '/data1/pg_logs' ##日志位置 # replication_mode = off load_balance_mode = on master_slave_mode = on master_slave_sub_mode = 'stream' # sr_check_period = 5 sr_check_user = 'pgpool' ##主庫創建的用戶 sr_check_password = '123' ##密碼 sr_check_database = 'postgres' # # # HEALTH CHECK 健康檢查 # health_check_period = 10 health_check_timeout = 20 health_check_user = 'pgpool' ##主庫創建的用戶 health_check_password = '123' ##密碼 health_check_database = 'postgres' ##檢查的庫 # # # FAILOVER AND FAILBACK # # 這是一個切換腳本,高可用全靠它 failover_command = '/data1/pg_bin/failover_stream.sh %d %H /tmp/trigger_file0'給腳本放到指定位置,加執行權限
2.2.7 failover_stream.sh內容:
# Failover command for streaming replication. # This script assumes that DB node 0 is primary, and 1 is standby. # # If standby goes down, do nothing. If primary goes down, create a # trigger file so that standby takes over primary node. # # Arguments: $1: failed node id. $2: new master hostname. $3: path to # trigger file.failed_node=$1 new_master=$2 trigger_file=$3# Do nothing if standby goes down. if [ $failed_node = 1 ]; thenexit 0; fi# Create the trigger file. /usr/bin/ssh -T $new_master /bin/touch $trigger_fileexit 0;2.2.8 pgpool的啟動和關閉
啟動 pgpool -n -D > /data1/pg_logs/pgpool.log 2>&1 & 關閉 pgpool -m fast stop2.2.9 查看集群狀態
[postgres@localhost etc]$ psql -p 9999 -h pool -U pgpool -d postgres 用戶 pgpool 的口令:postgres=> show pool_nodes;node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------------+-------+--------+-----------+---------+------------+-------------------+-------------------0 | 192.168.36.130 | 5432 | up | 0.500000 | primary | 0 | false | 01 | 192.168.36.131 | 5432 | up | 0.500000 | standby | 0 | true | 0 (2 rows)3 測試(模擬master宕機)
3.1 關閉master數據庫
master
#因為加了PGDATA,所以在啟動和關閉時不用指定數據庫位置,很方便 [postgres@master data]$ pg_ctl stop waiting for server to shut down.... done server stoppedpool
master關閉后,從節點的連接中斷后又成功連接上
發現master已經是standby了,且down機了,slave升為了primary
slave成為新的主且slave中的recovery.conf 變成recovery.done
3.2 宕機后的恢復
最簡單的方法就是將宕機的主庫刪掉,是用pg_basebackup的命令重新備份,但在生產環境中,數據量會越來越多,所以每次都重新拷貝很大的數據是很麻煩的,所以需要增量拷貝。
3.2.1 首先將master中的recovery.done改為recovery.conf,讓它成為新的從庫
[postgres@master data]$ mv recovery.done recovery.conf3.2.2 啟動宕機的數據庫
[postgres@master pg_xlog]$ pg_ctl start server starting [postgres@master pg_xlog]$ LOG: redirecting log output to logging collector process HINT: Future log output will appear in directory "pg_log".3.2.3 使用pcp_attach_node命令
pcp_attach_node -d -U postgres -h pool -p 9898 -n 03.2.4 查看當前集群狀態
[postgres@pool etc]$ psql -h pool -p 9999 -U pgpool -d postgrespostgres=> show pool_nodes;node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------------+-------+--------+-----------+---------+------------+-------------------+-------------------0 | 192.168.36.131 | 5432 | up | 0.500000 | primary | 0 | false | 01 | 192.168.36.130 | 5432 | up | 0.500000 | standby | 0 | true | 0 (2 行記錄)恢復完成,master成為了新的standby。
4 讀寫分離
實現讀寫分離非常簡單,在pgpool.conf中添加參數就可以實現。
load_balance_mode = onpgpool會自動的將select語句分到從庫上,將update等語句分到主庫上。
總結
以上是生活随笔為你收集整理的PostgreSQL高可用(二)使用pgpool实现主从切换+读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图文并茂详细教程之——用pixhawk飞
- 下一篇: PostgreSQL 区块链条管理举例