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.2 和 2.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修煉之道》