pgpool-II 4.3 中文手冊 - 入門教程

為少發表於2022-04-21

image

本章解釋瞭如何開始使用 Pgpool-II

安裝

在本節中,我們假設您已經安裝了 Pgpool-IIPostgreSQL 叢集。

你的第一個複製(Replication)

在本節中,我們將解釋如何使用 Pgpool-II 管理具有流複製的 PostgreSQL 叢集,這是最常見的設定之一。

在繼續之前,您應該正確設定 pgpool.conf 與流複製模式。Pgpool-II 提供了示例配置,配置檔案位於 /usr/local/etc,預設從原始碼安裝。您可以將 pgpool.conf.sample 複製為 pgpool.conf

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

如果你打算使用 pgpool_setup,輸入:

pgpool_setup

這將建立一個具有流複製模式安裝、主 PostgreSQL 安裝和非同步備用 PostgreSQL 安裝的 Pgpool-II

從現在開始,我們假設您使用 pgpool_setup 在當前目錄下建立安裝。請注意,在執行 pgpool_setup 之前,當前目錄必須是空的。

要啟動整個系統,請輸入:

./startall

系統啟動後,您可以通過向任何資料庫發出名為 show pool_nodes 的偽 SQL 命令來檢查叢集狀態。 pgpool_setup 自動建立 test 資料庫。我們使用資料庫。注意埠號是 11000,這是 pgpool_setup 分配給 Pgpool-II 的預設埠號。

$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 0          | false             | 0                 | 2019-01-31 10:23:09
1       | /tmp     | 11003 | up     | 0.500000  | standby | 0          | true              | 0                 | 2019-01-31 10:23:09
(2 rows)

結果顯示 status 列為 up,表示 PostgreSQL 已啟動並正在執行,這很好。

測試複製

讓我們使用標準 PostgreSQL 安裝附帶的基準工具 pgbench 來測試複製功能。鍵入以下內容以建立基準表

$ pgbench -i -p 11000 test

要檢視 replication 是否正常工作,請直接連線到主伺服器和備用伺服器,看看它們是否返回相同的結果。

$ psql -p 11002 test
\dt
List of relations
Schema |       Name       | Type  |  Owner  
--------+------------------+-------+---------
public | pgbench_accounts | table | t-ishii
public | pgbench_branches | table | t-ishii
public | pgbench_history  | table | t-ishii
public | pgbench_tellers  | table | t-ishii
(4 rows)
\q
$ psql -p 11003 test
\dt
List of relations
Schema |       Name       | Type  |  Owner  
--------+------------------+-------+---------
public | pgbench_accounts | table | t-ishii
public | pgbench_branches | table | t-ishii
public | pgbench_history  | table | t-ishii
public | pgbench_tellers  | table | t-ishii
(4 rows)

主伺服器(埠 11002)和備用伺服器(埠 11003)返回相同的結果。接下來,讓我們執行 pgbench 一段時間並檢查結果。

$ pgbench -p 11000 -T 10 test
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 10 s
number of transactions actually processed: 4276
latency average = 2.339 ms
tps = 427.492167 (including connections establishing)
tps = 427.739078 (excluding connections establishing)

$ psql -p 11002 -c "SELECT sum(abalance) FROM pgbench_accounts" test
sum
--------
216117
(1 row)

$ psql -p 11003 -c "SELECT sum(abalance) FROM pgbench_accounts" test
sum
--------
216117
(1 row)

同樣,結果是相同的。

測試負載均衡(Load Balance)

Pgpool-II 允許讀取查詢負載均衡。預設情況下啟用。要檢視效果,讓我們使用 pgbench -S 命令。

$ ./shutdownall
$ ./startall
$ pgbench -p 11000 -c 10 -j 10 -S -T 60 test
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 10
duration: 60 s
number of transactions actually processed: 1086766
latency average = 0.552 ms
tps = 18112.487043 (including connections establishing)
tps = 18125.572952 (excluding connections establishing)

$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 537644     | false             | 0                 | 2019-01-31 11:51:58
1       | /tmp     | 11003 | up     | 0.500000  | standby | 548582     | true              | 0                 | 2019-01-31 11:51:58
(2 rows)

select_cnt 列顯示有多少 SELECT 被分派到每個節點。由於使用預設配置,Pgpool-II 嘗試排程相同數量的 SELECT,因此該列顯示幾乎相同的數字。

測試故障轉移(Fail Over)

PostgreSQL 伺服器當機時,Pgpool-II 允許自動故障轉移。在這種情況下,Pgpool-II 將伺服器的狀態設定為 down 並使用剩餘的伺服器繼續資料庫操作。

$ pg_ctl -D data1 stop
waiting for server to shut down.... done
server stopped
$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 4276       | true              | 0                 | 2019-01-31 12:00:09
1       | /tmp     | 11003 | down   | 0.500000  | standby | 1          | false             | 0                 | 2019-01-31 12:03:07
(2 rows)

備用節點被 pg_ctl 命令關閉。Pgpool-II 檢測到它並分離備用節點。show pool_nodes 命令顯示備用節點處於關閉狀態。您可以在沒有備用節點的情況下繼續使用叢集:

$ psql -p 11000 -c "SELECT sum(abalance) FROM pgbench_accounts" test
sum   
--------
216117
(1 row)

如果主伺服器當機了怎麼辦?在這種情況下,剩餘的備用伺服器之一被提升為新的主伺服器。 對於這個測試,我們從兩個節點都啟動的狀態開始。

$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 0          | false             | 0                 | 2019-01-31 12:04:58
1       | /tmp     | 11003 | up     | 0.500000  | standby | 0          | true              | 0                 | 2019-01-31 12:04:58
(2 rows)

$ pg_ctl -D data0 stop
waiting for server to shut down.... done
server stopped
$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | down   | 0.500000  | standby | 0          | false             | 0                 | 2019-01-31 12:05:20
1       | /tmp     | 11003 | up     | 0.500000  | primary | 0          | true              | 0                 | 2019-01-31 12:05:20
(2 rows)

現在主節點從 0 變成了 1。裡面發生了什麼?當節點 0 當機時,Pgpool-II 檢測到它並執行 pgpool.conf 中定義的 failover_command。這是檔案的內容。

#! /bin/sh
# Execute command by failover.
# special values:  %d = node id
#                  %h = host name
#                  %p = port number
#                  %D = database cluster path
#                  %m = new main node id
#                  %M = old main node id
#                  %H = new main node host name
#                  %P = old primary node id
#                  %R = new main database cluster path
#                  %r = new main port number
#                  %% = '%' character
failed_node_id=$1
failed_host_name=$2
failed_port=$3
failed_db_cluster=$4
new_main_id=$5
old_main_id=$6
new_main_host_name=$7
old_primary_node_id=$8
new_main_port_number=$9
new_main_db_cluster=${10}
mydir=/home/t-ishii/tmp/Tutorial
log=$mydir/log/failover.log
pg_ctl=/usr/local/pgsql/bin/pg_ctl
cluster0=$mydir/data0
cluster1=$mydir/data1

date >> $log
echo "failed_node_id $failed_node_id failed_host_name $failed_host_name failed_port $failed_port failed_db_cluster $failed_db_cluster new_main_id $new_main_id old_main_id $old_main_id new_main_host_name $new_main_host_name old_primary_node_id $old_primary_node_id new_main_port_number $new_main_port_number new_main_db_cluster $new_main_db_cluster" >> $log

if [ a"$failed_node_id" = a"$old_primary_node_id" ];then	# main failed
! 	new_primary_db_cluster=${mydir}/data"$new_main_id"
echo $pg_ctl -D $new_primary_db_cluster promote >>$log	# let standby take over
$pg_ctl -D $new_primary_db_cluster promote >>$log	# let standby take over
sleep 2
fi

該指令碼從 Pgpool-II 接收必要的資訊作為引數。如果主伺服器當機,它會執行 pg_ctl -D data1 promote ,這應該將備用伺服器提升為新的主伺服器。

測試線上恢復(Online Recovery)

Pgpool-II 允許通過稱為 Online Recovery 的技術來恢復當機的節點。 這會將資料從主節點複製到備用節點,以便與主節點同步。 這可能需要很長時間,並且在此過程中可能會更新資料庫。這沒問題,因為在流式配置中,備用伺服器將接收 WAL 日誌並將其應用於趕上主伺服器。為了測試線上恢復,讓我們從之前的叢集開始,其中節點 0 處於關閉狀態。

$ pcp_recovery_node -p 11001 -n 0
Password: 
pcp_recovery_node -- Command Successful

$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | standby | 0          | false             | 0                 | 2019-01-31 12:06:48
1       | /tmp     | 11003 | up     | 0.500000  | primary | 0          | true              | 0                 | 2019-01-31 12:05:20
(2 rows)

pcp_recovery_nodePgpool-II 安裝附帶的控制命令之一。引數 -p 是指定分配給命令的埠號,它是 pgpool_setup 設定的 11001。引數 -n 是指定要恢復的節點 id。執行命令後,節點 0 恢復到 up 狀態。

pcp_recovery_node 執行的指令碼在 pgpool.conf 中被指定為 recovery_1st_stage_command。這是 pgpool_setup 安裝的檔案。

#! /bin/sh
psql=/usr/local/pgsql/bin/psql
DATADIR_BASE=/home/t-ishii/tmp/Tutorial
PGSUPERUSER=t-ishii

main_db_cluster=$1
recovery_node_host_name=$2
DEST_CLUSTER=$3
PORT=$4
recovery_node=$5

pg_rewind_failed="true"

log=$DATADIR_BASE/log/recovery.log
echo >> $log
date >> $log
if [ $pg_rewind_failed = "true" ];then

$psql -p $PORT -c "SELECT pg_start_backup('Streaming Replication', true)" postgres

echo "source: $main_db_cluster dest: $DEST_CLUSTER" >> $log

rsync -C -a -c --delete --exclude postgresql.conf --exclude postmaster.pid \
--exclude postmaster.opts --exclude pg_log \
--exclude recovery.conf --exclude recovery.done \
--exclude pg_xlog \
$main_db_cluster/ $DEST_CLUSTER/

rm -fr $DEST_CLUSTER/pg_xlog 
mkdir $DEST_CLUSTER/pg_xlog
chmod 700 $DEST_CLUSTER/pg_xlog
rm $DEST_CLUSTER/recovery.done
fi
cat > $DEST_CLUSTER/recovery.conf $lt;$lt;REOF
standby_mode          = 'on'
primary_conninfo      = 'port=$PORT user=$PGSUPERUSER'
recovery_target_timeline='latest'
restore_command = 'cp $DATADIR_BASE/archivedir/%f "%p" 2> /dev/null'
REOF

if [ $pg_rewind_failed = "true" ];then
$psql -p $PORT -c "SELECT pg_stop_backup()" postgres
fi

if [ $pg_rewind_failed = "false" ];then
cp /tmp/postgresql.conf $DEST_CLUSTER/
fi

架構基礎

Pgpool-II 是位於客戶端和 PostgreSQL 之間的代理伺服器。Pgpool-II 理解 PostgreSQL 使用的稱為 前端和後端協議(frontend and backend protocol)線路(wire)級協議。 有關該協議的更多詳細資訊,請參閱 PostgreSQL 手冊。使用 Pgpool-II 不需要修改 PostgreSQL(更準確地說,您需要一些擴充套件才能使用 Pgpool-II 的全部功能)。因此 Pgpool-II 可以應對各種 PostgreSQL 版本。理論上,即使是最早的 PostgreSQL 版本也可以與 Pgpool-II 一起使用。對客戶端也可以這樣說。只要它遵循協議,Pgpool-II 就會愉快地接受來自它的連線,無論它使用什麼樣的語言或驅動程式。

Pgpool-II 由多個程式組成。有一個主程式,它是所有其他程式的父程式。 它負責分叉子程式,每個子程式都接受來自客戶端的連線。 還有一些從主程式派生的工作程式,負責檢測流複製延遲。還有一個特殊的程式叫做 pcp 程式,專門用於管理 Pgpool-II 本身。Pgpool-II 有一個內建的高可用性功能,稱為 watchdogWatchdog 由一些程式組成。

image

更多

相關文章