Postgresql流復制+pgpool實現高可用


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' #主機ip
backend_port0 = 5432
backend_weight0 = 1 #loadbalance不開啟,無效
backend_data_directory0 = '/var/lib/postgresql/9.5/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '10.10.10.102' #備機ip
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/9.5/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on 
pool_passwd = 'pool_passwd'

master_slave_mode = on
master_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    md5
host    all               all           0.0.0.0/0       md5
host    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=$1
new_master=$2
trigger_file=$3

# Do nothing if standby goes down.
if [ $failed_node = 1 ]; then
	exit 0;
fi

# Create the trigger file.
/usr/bin/ssh -T $new_master /bin/touch $trigger_file

exit 0;
配置主機間的互信

主要用途是使得pgpool所在主機能登錄postgresql所在主機,創建trigger文件。
參考命令:

ssh-keygen
ssh-copy-id postgres@IP

測試

連接
psql -h10.10.10.105 -p9999 -Ucloud

cloud=> 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 unexpectedly
	This probably means the server terminated abnormally
	before 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 0

psql -h10.10.10.105 -p9999 -Ucloud

cloud=> 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)

這樣在不停機的情況下,完成了修復工作。

 


免責聲明!

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



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