pgpool複製和負載均衡操作
簡介
pgpool-II是一個位於postgresql資料庫和客戶端之間的中介軟體,可以提供一下幾個功能:
1.連線池
pgpool-II保持已經連線到postgresql資料庫的連線,並在使用相同引數連線進來時重用他們,減少了連線開銷,並增加了系統的總體吞吐量。
2.複製
pgpool-II可以管理多個postgresql資料庫,啟用複製功能並使在2臺或多臺postgresql節點中建立一個實時備份稱為可能,這樣,如果其中一臺節點失效,服務可以不被終端繼續執行。
3.負載均衡
如果資料庫進行了複製,則在任何一臺伺服器中執行一個select查詢將返回相同的結果。pgpool-II利用了複製的功能以降低每臺postgresql伺服器的負載。它通過分發select查詢到所有可用的伺服器中,增強了系統的整體吞吐量。在理想的狀況下,讀效能應該和postgresql數量成正比。負載均衡功能在大量使用者同時執行很多讀查詢的場景中工作效果最好。
4.限制超過限度的連線
postgresql會限制當前的最大連線數,當到達這個數量時,新的連線將被拒絕。增加這個連線數會增加資源消耗並且對系統的全域性效能有一定的負面影響。pgpool-II也支援限制最大連線數,但她的做法是將連線放入佇列,而不是立即返回一個錯誤。
另外,pgpool-II也支援並行查詢,資料被分割到多臺伺服器上,所以一個查詢可以在多臺伺服器上同時執行,以減少總體執行時間。並行查詢在查詢大規模資料的時候非常有效。
測試環境
IP | 應用 | 版本 |
---|---|---|
10.10.10.56 | postgresql | 9.2.15 |
10.10.10.57 | postgresql | 9.2.15 |
10.10.10.56 | pgpool-II | 3.5 |
環境說明:兩臺postgresql,pgpool和其中一臺postgresql在一臺伺服器上。
測試需求:測試pgpool實現postgresql的複製和負載均衡
安裝pgpool
1.原始碼安裝
wget http://www.pgpool.net/download.php?f=pgpool-II-3.5.3.tar.gz tar -zxvf pgpool-II-3.5.3.tar.gz cd pgpool-II-3.5.3 ./configure --prefix=/usr/local/pgpool --with-openssl #報錯configure: error: libpq is not installed or libpq is old #安裝 yum install postgresql-devel即可 make && make install
2.安裝pgpool-regclass
使用 PostgreSQL 8.0 至 PostgreSQL 9.3,強烈推薦在需要訪問的 PostgreSQL 中安裝 pgpool_regclass 函式,因為它被 pgpool-II 內部使用。 如果不這樣做,在不同的 schema 中處理相同的表名會出現問題(臨時表不會出問題);而PostgreSQL 9.4或更高版本則不需要
cd pgpool-II-3.5.3/src/sql/pgpool-regclass make && make install -bash-4.2$ psql -f pgpool-regclass.sql template1 或 psql template1 =# CREATE EXTENSION pgpool_regclass;
應在每臺通過 pgpool-II 訪問的資料庫中執行 pgpool-regclass.sql 或者 CREATE EXTENSION。 你不需要在你執行“psql -f pgpool-regclass.sql template1” 或者 CREATE EXTENSION 後建立的資料庫中這麼做, 因為這個模板資料庫將被克隆成新建的資料庫。
3.建立insert_lock表
如果你在複製模式中使用了 insert_lock ,強烈推薦建立 pgpool_catalog.insert_lock 表,用於互斥。 到現在為止,insert_lock 還能夠工作。但是,在這種情況下,pgpool-II 需要鎖定插入的目標表。 這種行為和 pgpool-II 2.2 和 2.3 系列類似。由於表鎖與 VACUUM 衝突,所以 INSERT 操作可能因而等待很長時間。
cd pgpool-II-3.5.3/src/sql/ psql -f insert_lock.sql tempalte1
應在在每臺通過 pgpool-II 訪問的資料庫中執行 insert_lock.sql。 你不需要在你執行“psql -f insert_lock.sql template1”後建立的資料庫中這麼做, 因為這個模板資料庫將被克隆成新建的資料庫。
4.安裝pgpool_recovery
如果你使用線上回覆,需要以下一些函式: pgpool_recovery,pgpool_remote_start,pgpool_switch_xlog。
另外,附帶工具pgpoolAdmin 控制 pgpool-II 啟停和重新連線後端的 PostgreSQL 節點, 它需要函式 pgpool_pgctl;而且 pgpoolAdmin 需要函式 pgpool_pgctl 來對 PostgreSQL 進行停止/重啟/重新載入引數操作。
可以使用和安裝 pgpool_regclass 一樣的方法安裝著四個函式。 不過和 pgpool_regclass 不同的是,你只需要在 template1 資料庫中安裝這些函式。
cd pgpool-II-3.5.3/src/sql/pgpool-recovery make && make install psql -f pgpool-recovery.sql template1 或 psql template1 =# CREATE EXTENSION pgpool_recovery
配置pgpool
1.配置pcp.conf
pgpool提供pcp介面,可以檢視,管理pgpool的狀態,並且可以遠端操作pgpool,pcp.conf用來對pcp相關命令認證的檔案
cd /usr/local/pgpool cp etc/pcp.conf.sample etc/pcp.conf bin/pg_md5 -m -u pgpool -p 會自動生成pool_passwd postgres:md533c14731dfdfsdfsdf91e8d10c4bff5 cat etc/pcp.conf pgpool:md533c14731dfdfsdfsdf91e8d10c4bff5
2.配置pool_hba.conf
通過pool_hba.conf可以進行相關許可權設定,類似於postgresql的pg_hba.conf
cd /usr/local/pgpool cp etc/pool_hba.conf.sample etc/pool_hba.conf bin/pg_md5 -m -u postgres -p 會自動生成pool_passwd postgres:md533c14731dfdfsdfsdf91e8d10c4bff5
**注意:
1.pool_hba.conf中的加密方式必須和pg_hba.conf中的加密方式一樣,都為mds、trust或其他方式。若不一樣會報錯。
2.pool_hba.conf中的使用者必須在postgresql資料庫中存在
**
3.配置pgpool.conf
cd /usr/local/pgpool cp etc/pgpool.conf.sample etc/pgpool.conf #建立相關目錄 mkdir -p /var/run/pgpool mkdir -p /usr/local/pgpool/logs vim etc/pgpool.conf listen_addresses = '*' port = 9999 socket_dir = '/tmp' listen_backlog_multiplier = 2 serialize_accept = off pcp_listen_addresses = '*' pcp_port = 9898 pcp_socket_dir = '/tmp' backend_hostname0 = '10.10.10.56' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/data/pgsql/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = '10.10.10.57' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/data/pgsql/data' backend_flag1 = 'ALLOW_TO_FAILOVER' enable_pool_hba = on pool_passwd = 'pool_passwd' debug_level = 0 pid_file_name = '/var/run/pgpool/pgpool.pid' logdir = '/usr/local/pgpool/logs' replication_mode = on load_balance_mode = on master_slave_mode = off
其中:
replication_mode = on 複製模式開啟,可以在兩臺postgresql資料庫上進行實時備份
load_balance_mode = on 負載均衡模式開啟,可以實現負載均衡
3.啟動pgpool
/usr/local/pgpool/bin/pgpool
4.連線pgpool
psql -U postgres -p 9999 -h 10.10.10.56 Password for user postgres: psql (9.2.15) Type "help" for help. postgres=#
測試
1.建立bench_replication資料庫
psql -U postgres -p 9999 -h 10.10.10.56 Password for user postgres: psql (9.2.15) Type "help" for help. postgres=#create database bench_replication;
我們可以分別登陸56、57上的postgresql進行檢視
psql -U postgres -p 5432 -h 10.10.10.56 Password for user postgres: psql (9.2.15) Type "help" for help. postgres=# \list List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -------------------+----------+----------+-------------+-------------+----------------------- bench_replication | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
可以看到兩臺postgresql都建立了bench_replication資料庫,因此pgpool的複製是成功的。
2.pgbench測試
#安裝pgbench yum install postgresql-contrib pgbench -i -h 10.10.10.56 -U postgres -p 9999 bench_replication
在所有pgsql節點中,下面列出的表和資料都被建立了,說明覆制執行正常。
表名 | 行數 |
---|---|
branches | 1 |
tellers | 10 |
accounts | 100000 |
history | 0 |
總結
以上只是簡單介紹了pgpool-II的複製和負載均衡作為入門,還有很多功能沒有介紹,需要我們繼續探索。
補充:pgpool使用中遇到的坑總結
1,複製模式可靠性低
最早時候使用的是複製模式,資料到pgpool然後pgpool分別寫入n個postgres.發現經常出現數據不一致問題,導致最終只有一個數據庫可用
2,online recovery
基於PIRT的online recovery 配置複雜
3,基於流複製的主備模式
這個用到postgres9的新特性,前期配置測試都很easy,failover 也很好用,但是當服務連線上pgpool時,事務往往報錯 postgres error : failed to read kind from backend,這個我在之前的文章中提到過,至今無法解決。
4,連線數的困擾
num_init_children 原來理解成了一個池的大小,如果超過了會自動擴增,但是實際上往往不夠用,確切的說該值也是 pgpool-II 支援的從客戶端發起的最大併發連線數。
所以這個值配的儘量大些,並且對這個值的更改必須重啟pgpool.
5,client_idle_limit不要配置
當一個客戶端在執行最後一條查詢後如果空閒到了 client_idle_limit 秒數, 到這個客戶端的連線將被斷開.連線不應該讓pgpool來斷開,應該是應用主動去斷開。如果讓pgpool去斷開,會導致客戶端不可用。
當然pgpool也有一個好處,能夠快速找到連線的應用。因為每個連線都是單獨的程序,所以啟動後會有num_init_children 個程序可以接受連線
使用# ps -ef |grep pgpool 可以看到
pgpool: wait for connection request 的程序是空程序,等待連線。
pgpool: postgres dbtest 10.115.53.167(51883) idle 這些程序是使用中的程序,並且可以看到是來自哪臺機器,什麼使用者,連線的是什麼資料庫。
當然使用select * from pg_stat_activity 也能查到 連線情況
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。