標籤:
pgpool概述
pgpool-II 是一個位於 PostgreSQL 伺服器和 PostgreSQL 資料庫用戶端之間的中介軟體,它提供以下功能:串連池、複製、負載平衡、限制超過限度的串連以及並行查詢。文檔在此。
四種模式
O 意味著“可用”, X 意味著“不可用
(1) 並行查詢模式需要同時開啟複製和負載平衡,但是複製和負載平衡無法用於並行查詢模式中的分布式表。
(2) 線上恢複可以和流複製同時使用。
(*3) 用戶端僅僅是通過 pgpool-II 串連到 PostgreSQL伺服器。這種模式僅僅用於限制到伺服器的串連數,或者在多台機器上啟用故障恢複。
pgpool在不同模式下,提供不同的功能,本文將選擇在主備模式下,實現故障恢複,即自動failover的功能。
體繫結構
設定檔介紹
pgpool有四個主要的設定檔,分別是
- pcp.conf 用於管理查、看節點資訊,如加入新節點。該檔案主要是儲存使用者名稱及md5形式的密碼。
- pgpool.conf 用於設定pgpool的模式,主次資料庫的相關資訊等。
- pool_hba.conf 用於認證使用者登入方式,如用戶端IP限制等,類似於postgresql的pg_hba.conf檔案。
- pool_passwd 用於儲存相應用戶端登入帳號名及md5密碼。
拓撲結構
安裝postgresql流複製設定
參考
pgpool安裝設定安裝
sudo apt-get insatll pgpool2
設定pcp.conf
/usr/sbin/pg_md5 password
將得到md5加上使用者名稱以以下方式寫入檔案/etc/pgpool2/pcp.conf中,
pgpool:5f4dcc3b5aa765d61d8327deb882cf99
設定pgpool.conf
確保相關配置項設定如下:
listen_addresses = ‘*‘backend_hostname0 = ‘10.10.10.104‘ #主機ipbackend_port0 = 5432backend_weight0 = 1 #loadbalance不開啟,無效backend_data_directory0 = ‘/var/lib/postgresql/9.5/main‘backend_flag0 = ‘ALLOW_TO_FAILOVER‘backend_hostname1 = ‘10.10.10.102‘ #備機ipbackend_port1 = 5432backend_weight1 = 1backend_data_directory1 = ‘/var/lib/postgresql/9.5/main‘backend_flag1 = ‘ALLOW_TO_FAILOVER‘enable_pool_hba = on pool_passwd = ‘pool_passwd‘master_slave_mode = onmaster_slave_sub_mode = ‘stream‘sr_check_user = ‘replication‘ #流複製帳號sr_check_password = ‘password‘failover_command = ‘/var/lib/postgresql/failover.sh %h %H /var/lib/postgresql/state/recovery_trigger‘ #主機失敗後,touch檔案使得備機從唯讀狀態變成可讀寫狀態
設定pool_hba.conf
設定可以參考postgresql的hba設定,如
# IPv4 local connections:host all all 127.0.0.1/32 md5host all all 0.0.0.0/0 md5host replication replication 0.0.0.0/0 md5
設定pool_passwd
前提:對應的postgresql執行個體中,已經建立相應的帳號。設定pool_passwd的目的是允許該資料庫帳號能夠通過pgpool登入資料庫。
方法一:設定與資料庫帳號同名的系統帳號,然後直接調用pg_md5,該命令會自動產生好pool_passwd檔案。例如我有系統帳號cloud,密碼為cloud
/usr/sbin/pg_md5 -m -u cloud cloud
方法二: 直接存取資料庫,將結果以以下方式放入檔案/etc/pgpool2/pool_passwd中
cloud:md5313e20fe4ca8bf6751ffd3c5b963a9ad
查詢資料庫:
select usename,passwd from pg_shadow;
failover.sh
當主機宕機後,pgpool會將連結轉至standby,所以需要將standby從唯讀狀態修改為可讀寫狀態,即建立一個trigger檔案或者調用promote命令。
#! /bin/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=$1new_master=$2trigger_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;
配置主機間的互信
主要用途是使得pgpool所在主機能登入postgresql所在主機,建立trigger檔案。
參考命令:
ssh-keygenssh-copy-id [email protected]
測試連接
psql -h10.10.10.105 -p9999 -Ucloudcloud=> show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+--------------+------+--------+-----------+--------- 0 | 10.10.10.102 | 5432 | 2 | 0.500000 | primary 1 | 10.10.10.104 | 5432 | 2 | 0.500000 | standby(2 rows)
類比主機宕機
關閉主機的服務。再次串連查看。
server closed the connection unexpectedlyThis probably means the server terminated abnormallybefore or while processing the request.The connection to the server was lost. Attempting reset: Succeeded.cloud=> show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+--------------+------+--------+-----------+--------- 0 | 10.10.10.102 | 5432 | 3 | 0.500000 | standby 1 | 10.10.10.104 | 5432 | 2 | 0.500000 | primary(2 rows)
可以發現standby已經升級為主,原來的主機status變成了3。status對應的意義為:
Status 由數字 [0 - 3]來表示。
0 - 該狀態僅僅用於初始化,PCP從不顯示它。
1 - 節點已啟動,還沒有串連。
2 - 節點已啟動,串連被緩衝。
3 - 節點已關閉。
修複及重新加入
原來的主機經過修複,重新提供服務後,可以重新作為新主機的standby加入pgpool。步驟如下:
- 更新ppgpool.conf, host0改為新主機,host1改為原來新standby。pgpool需要重啟才會生效該選項的修改,所以這裡的修改只是防止pgpool重啟而導致指向錯誤的主機,實際修複不需要重啟pgpool。
- 重建立立standby,即流複製。
- 使用pcp命令將修複的standby加入pgpool。
/usr/sbin/pcp_attach_node 10 localhost 9898 pgpool cloud 0psql -h10.10.10.105 -p9999 -Ucloudcloud=> show pool_nodes; node_id | hostname | port | status | lb_weight | role ---------+--------------+------+--------+-----------+--------- 0 | 10.10.10.102 | 5432 | 2 | 0.500000 | standby 1 | 10.10.10.104 | 5432 | 2 | 0.500000 | primary(2 rows)
這樣在不停機的情況下,完成了修複工作。
Postgresql流複製+pgpool實現高可用