pgpool-II 的使用


1.pgpool-II的概念

pgpool-II 是一個位於 PostgreSQL 服務器和 PostgreSQL 數據庫客戶端之間的中間件,它提供以下功能:

  • 連接池

pgpool-II 保持已經連接到 PostgreSQL 服務器的連接, 並在使用相同參數(例如:用戶名,數據庫,協議版本) 連接進來時重用它們。 它減少了連接開銷,並增加了系統的總體吞吐量。

  •  復制

pgpool-II 可以管理多個 PostgreSQL 服務器。 激活復制功能並使在2台或者更多 PostgreSQL 節點中建立一個實時備份成為可能, 這樣,如果其中一台節點失效,服務可以不被中斷繼續運行。

  • 負載均衡

如果數據庫進行了復制(可能運行在復制模式或者主備模式下), 則在任何一台服務器中執行一個 SELECT 查詢將返回相同的結果。 pgpool-II 利用了復制的功能以降低每台 PostgreSQL 服務器的負載。 它通過分發 SELECT 查詢到所有可用的服務器中,增強了系統的整體吞吐量。 在理想的情況下,讀性能應該和 PostgreSQL 服務器的數量成正比。 負載均很功能在有大量用戶同時執行很多只讀查詢的場景中工作的效果最好。

  • 限制超過限度的連接

PostgreSQL 會限制當前的最大連接數,當到達這個數量時,新的連接將被拒絕。 增加這個最大連接數會增加資源消耗並且對系統的全局性能有一定的負面影響。 pgpoo-II 也支持限制最大連接數,但它的做法是將連接放入隊列,而不是立即返回一個錯誤。

  • 並行查詢

使用並行查詢時,數據可以被分割到多台服務器上, 所以一個查詢可以在多台服務器上同時執行,以減少總體執行時間。 並行查詢在查詢大規模數據的時候非常有效。
pgpool-II 使用 PostgreSQL 的前后台程序之間的協議,並且在前后台之間傳遞消息。 因此,一個(前端的)數據庫應用程序認為 pgpool-II 就是實際的 PostgreSQL 數據庫, 而后端的服務進程則認為 pgpool-II 是它的一個客戶端。 因為 pgpool-II 對於服務器和客戶端來說是透明的, 現有的數據庫應用程序基本上可以不需要修改就可以使用 pgpool-II 了。

摘抄於:http://www.pgpool.net/docs/pgpool-II-3.2.1/pgpool-zh_cn.html

2. pgpool-II的安裝

pgpool-II 可以在 pgpool 開發頁面下載到。 而且也提供包括 CentOS,RedHat Enterprise Linux,Fedora 和 Debian 在內的大量平台的二進制包。 請檢查相關的軟件庫。可以在以下位置下載 pgpool-II 的源碼:
下載地址:http://www.pgpool.net/mediawiki/index.php/Downloads
從源碼安裝 pgpool-II 需要 2.9 甚至或更高版本的 gcc,以及 GNU make。 而且,pgpool-II 需要鏈接到 libpq 庫,所以在構建 pgpool-II 的機器上必須安裝 libpq 庫和它的開發頭文件。 另外,還需要 OpenSSL 庫和它的頭文件以便在 pgpool-II 中提供 OpenSSL 支持。在解壓源碼包后,執行以下配置腳本

2.1 源碼安裝

#由於pool是基於postgres數據的中間件;所以需要安裝postgres數據庫服務
#安裝postgres數據庫服務器
查考《PostgreSQL on Linux 部署手冊》
安裝pgpool-II
#解壓軟件包
tar -zxvf pgpool-II-××.tar.gz
#編譯安裝
./configure --prefix=/opt/pgpool --with-pgsql=/opt/pgsql96 
gmake  
gmake install

2.2 安裝pgpool_regclass

如果你在使用 PostgreSQL 8.0 或之后的版本,強烈推薦在需要訪問的 PostgreSQL 中安裝 pgpool_regclass 函數,因為它被 pgpool-II 內部使用。 如果不這樣做,在不同的 schema 中處理相同的表名會出現問題(臨時表不會出問題)。
cd pgpool-II-×.×.0/src/sql
make
make install 
因為這個模板數據庫將被克隆成新建的數據庫。

postgres=# CREATE EXTENSION pgpool_regclass; 
CREATE EXTENSION
postgres=# CREATE EXTENSION pgpool_recovery;
CREATE EXTENSION
postgres=# \dx
                                List of installed extensions
      Name       | Version |   Schema   |                    Description                     
-----------------+---------+------------+----------------------------------------------------
 pgpool_recovery | 1.1     | public     | recovery functions for pgpool-II for V3.4 or later
 pgpool_regclass | 1.0     | public     | replacement for regclass
 plpgsql         | 1.0     | pg_catalog | PL/pgSQL procedural language
(3 rows)

2.3建立insert_lock表【可選】

如果你在復制模式中使用了 insert_lock ,強烈推薦建立 pgpool_catalog.insert_lock 表,用於互斥。 到現在為止,insert_lock 還能夠工作。但是,在這種情況下,pgpool-II 需要鎖定插入的目標表。 這種行為和 pgpool-II 2.22.3 系列類似。由於表鎖與 VACUUM 沖突,所以 INSERT 操作可能因而等待很長時間。
cd pgpool-II-x.x.x/sql
psql -f insert_lock.sql template1
應在在每台通過 pgpool-II 訪問的數據庫中執行 insert_lock.sql。 你不需要在你執行“psql -f insert_lock.sql template1”后建立的數據庫中這么做, 因為這個模板數據庫將被克隆成新建的數據庫

3. 搭建主/備模式

本例針對流復制模式

環境
OS:  CentOS release 6.5 (Final)
DB: postgresql 9.6
pgpool服務器:  pgpool 192.168.1.201
數據庫主服務器:master 192.168.1.202
數據庫從服務器:slave  192.168.1.203

架構設計

3.1 配置主機環境

1. 對每個主機的/etc/hosts文件添加以下內容,
192.168.1.201 pgpool
192.168.1.202 master
192.168.1.203 slave

2. 配置環境變量
根據實際環境而定;示例
export PGHOME=/opt/pgsql96
export PGDATA=/home/postgres/data              
export PATH=$PGHOME/bin:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export LANG=en_US.utf8
export PGPORT=5432
export PGUSER=postgres
export PGDATABASE=postgres

PGPOOLHOME=/opt/pgpool
export PGPOOLHOME
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin:$PGPOOLHOME/bin
export PATH

3. 主機互信
用postgres用戶登錄;
主要用途是使得pgpool所在主機能登錄postgresql所在主機。
$ ssh-keygen -t rsa
在pool節點都操作
$ ssh-copy-id postgres@master
$ ssh-copy-id postgres@slave

3.2 搭建流復制

 參考《PG主備流復制.txt》;

4. 在master庫上創建監控角色。在后面配置pool.conf需要設置
postgres=# create user srcheck PASSWORD '*****';
postgres=# alter user postgres password '*****';
postgres=# select rolname,rolpassword from pg_authid;
      rolname      |             rolpassword             
-------------------+-------------------------------------
 pg_signal_backend | 
 replica           | md5a28004efa9973e28807c49c166594b9d
 postgres          | md517214fe84590864b4d75cbeb0c4d57e9
 srcheck           | md57535ba2e04de102b8c3089e84b0d0d3b

3.3. 安裝pgpool-II

在pool節點操作;postgres軟件安裝查考《PostgreSQL on Linux 部署手冊》
[root@pool opt]# tar -zxvf pgpool-II-3.6.0.tar.gz 
[root@pool opt]# cd pgpool-II-3.6.0
[root@pool pgpool-II-3.6.0]# ./configure --prefix=/opt/pgpool --with-pgsql=/opt/pgsql96 
[root@pool pgpool-II-3.6.0]# gmake
[root@pool pgpool-II-3.6.0]# gmake install

3.4 配置pgpool-II

[root@pool etc]$ cp pool_hba.conf.sample pool_hba.conf
[root@pool etc]$ cp pgpool.conf.sample-stream pgpool.conf
[root@pool etc]$ cp pcp.conf.sample pcp.conf
[root@pool etc]$ vim pgpool.conf
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898

# - Backend Connection Settings -

backend_hostname0 = 'master'
                                   # Host name or IP address to connect to for backend 0
backend_port0 = 5432
                                   # Port number for backend 0
backend_weight0 = 1
                                   # Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/home/postgres/data'
                                   # Data directory for backend 0
backend_flag0 = 'ALLOW_TO_FAILOVER'
                                   # Controls various backend behavior
                                   # ALLOW_TO_FAILOVER or DISALLOW_TO_FAILOVER
backend_hostname1 = 'slave'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/home/postgres/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

pid_file_name = '/home/postgres/pgpool/pgpool.pid'
                                   # PID file name
                                   # (change requires restart)
logdir = '/home/postgres/log'
                                   # Directory of pgPool status file
                                   # (change requires restart)
#------------------------------------------------------------------------------
# LOAD BALANCING MODE
#------------------------------------------------------------------------------

load_balance_mode = on

#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------

master_slave_mode = on
                                   # Activate master/slave mode
                                   # (change requires restart)
master_slave_sub_mode = 'stream'
                                   # Master/slave sub mode
                                   # Valid values are combinations slony or
                                   # stream. Default is slony.
                                   # (change requires restart)
# - Streaming -

sr_check_period = 10
                                   # Streaming replication check period
                                   # Disabled (0) by default
sr_check_user = 'srcheck'
                                   # Streaming replication check user
                                   # This is neccessary even if you disable streaming
                                   # replication delay check by sr_check_period = 0
sr_check_password = 'srcheck'
                                   # Password for streaming replication check user
sr_check_database = 'postgres'
                                   # Database name for streaming replication check
#------------------------------------------------------------------------------
# HEALTH CHECK
#------------------------------------------------------------------------------

health_check_period = 10
                                   # Health check period
                                   # Disabled (0) by default
health_check_timeout = 20
                                   # Health check timeout
                                   # 0 means no timeout
health_check_user = 'postgres'
                                   # Health check user
health_check_password = 'li0924'
                                   # Password for health check user
health_check_database = 'postgres'
                                   # Database name for health check. If '', tries 'postgres' frist, 
                                   
#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

failover_command = '/home/postgres/bin/failover_stream.sh %H'

其中需要創建對應的目錄腳本;在pool主句
[postgres@pool ~]$ mkdir bin
[postgres@pool ~]$ mkdir log
[postgres@pool ~]$ mkdir pgpool
[postgres@pool ~]$ cd bin
[postgres@pool ~]$ cd bin        
[postgres@pool bin]$ vi failover_stream.sh 

#! /bin/sh 
# Failover command for streaming replication. 
# Arguments: $1: new master hostname. 

new_master=$1
trigger_command="$PGHOME/bin/pg_ctl promote -D $PGDATA"

# Prompte standby database. 
/usr/bin/ssh -T $new_master $trigger_command

exit 0;

配置pcp文件。配置管理pcp帳號                                   
[root@pool etc]# pg_md5  li0924
5901cb2f82e1df6c9131753cc4cd3499
[root@pool etc]# vi pcp.conf
postgres:5901cb2f82e1df6c9131753cc4cd3499
[root@pool etc]# cat pool_hba.conf
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
local   all         all                               md5
# "local" is for Unix domain socket connections only
# IPv4 local connections:
#host    all         all         192.168.1.0/24          md5
host    all         all         0.0.0.0/0          md5
#在pgpool中添加pg數據庫的用戶名和密碼
[root@pool etc]# pg_md5 -p -m -u postgres pool_passwd
輸入密碼;即可生成pool_passwd文件
[root@pool etc]# cat pool_passwd 
postgres:md517214fe84590864b4d75cbeb0c4d57e9
或者直接vi pool_passwd;密碼在    select rolname,rolpassword from pg_authid;尋找

4.啟動服務

8.1在master/slave節點啟動數據庫
pg_start

8.2在pool節點啟動pool服務
[postgres@pool ~]$ pgpool -n -d > pgpool.log 2>&1 &
[1] 1059
可以在/var/log/messages這樣的信息。啟動排查錯誤信息日志: /var/log/messages
Nov 21 07:14:52 pool pgpool[1171]: [6-1] 2017-11-21 07:14:52: pid 1171: LOG:  Setting up socket for 0.0.0.0:9999
Nov 21 07:14:52 pool pgpool[1171]: [7-1] 2017-11-21 07:14:52: pid 1171: LOG:  Setting up socket for :::9999
Nov 21 07:14:52 pool pgpool[1171]: [8-1] 2017-11-21 07:14:52: pid 1171: LOG:  pgpool-II successfully started. version 3.6.0 (subaruboshi)

8.3 關閉pool服務
pgpool -m fast stop

5. 查看信息

[postgres@pool ~]$  psql -p 9999
Password: 
psql (9.6.0)
Type "help" for help.

postgres=# show pool_nodes;
 node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay 
---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
 0       | master   | 5432 | up     | 0.500000  | primary | 0          | false             | 0
 1       | slave    | 5432 | up     | 0.500000  | standby | 0          | true              | 0
(2 rows)

6.  高可用性

6.1  模擬主庫數據庫掛掉;是否可以繼續提供服務                                       
[postgres@pool ~]$ psql -p 9999
Password: 
psql (9.6.0)
Type "help" for help.

postgres=# show pool_nodes;
 node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_de
lay 
---------+----------+------+--------+-----------+---------+------------+-------------------+---------------
----
 0       | master   | 5432 | down   | 0.500000  | standby | 0          | false             | 0
 1       | slave    | 5432 | up     | 0.500000  | primary | 1          | true              | 0
(2 rows)
從這里可以看出節點0的狀態為down;

6.2 啟動主庫;在把節點0的狀態恢復
[postgres@pool ~]$ pcp_attach_node -?
pcp_attach_node - attach a node from pgpool-II
Usage:
pcp_attach_node [OPTION...] [node-id]
Options:
  -U, --username=NAME    username for PCP authentication
  -h, --host=HOSTNAME    pgpool-II host
  -p, --port=PORT        PCP port number
  -w, --no-password      never prompt for password
  -W, --password         force password prompt (should happen automatically)
  -n, --node-id=NODEID   ID of a backend node
  -d, --debug            enable debug message (optional)
  -v, --verbose          output verbose messages
  -?, --help             print this help

[postgres@pool ~]$ pcp_attach_node -d -p 9898 -n 0
Password: 
DEBUG: recv: tos="m", len=8
DEBUG: recv: tos="r", len=21
DEBUG: send: tos="C", len=6
DEBUG: recv: tos="c", len=20
pcp_attach_node -- Command Successful
DEBUG: send: tos="X", len=4

[postgres@pool ~]$ psql -p 9999
Password: 
psql (9.6.0)
Type "help" for help.

postgres=# show pool_nodes;
 node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_de
lay 
---------+----------+------+--------+-----------+---------+------------+-------------------+---------------
----
 0       | master   | 5432 | up     | 0.500000  | standby | 0          | false             | 0
 1       | slave    | 5432 | up     | 0.500000  | primary | 1          | true              | 0
(2 rows)

參考文獻:http://blog.163.com/digoal@126/blog/static/1638770402014413104753331/
                《PostgreSQL修煉之道》


免責聲明!

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



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