前部分:php
下載:下載後的源碼包中就包含中文手冊和入門教程。html
http://www.pgpool.net/mediawiki/index.php/Downloadssql
記住,ubuntu的話,挑選源代碼下載!不然./configure的時候會報".PO"文件缺失的錯誤!數據庫
安裝:ubuntu
①./configure服務器
②make&&make install網絡
配置:併發
pgpool-II 的配置參數保存在 pgpool.conf 文件中。文件以每行 「parameter = value」 的格式保存。當你安裝 pgpool-II 後, pgpool.conf.sample 被自動創建。咱們建議拷貝或者重命名它爲 pgpool.conf ,而後你能夠隨意編輯它。函數
$ cp /usr/local/etc/pgpool.conf.sample /usr/local/etc/pgpool.confpost
pgpool-II 默認只接受到 9999 端口的本地鏈接。若是你但願從其餘主機接受鏈接,請設置 listen_addresses 爲 '*'.
listen_addresses = 'localhost'
port = 9999
4.啓動:
pgpool -n &
注意:若是提示「could not open pid file as /var/run/pgpool/pgpool.pid. reason: No such file or directory」,則新建/var/run/pgpool目錄,並賦予寫權限,或者修改pgpool.conf文件的pid_file_name選項,修改文件路徑保證當前用戶可訪問控制。
5建立system_db的調度函數:
CREATE OR REPLACE FUNCTION pgpool_catalog.dist_def_branches(anyelement)
RETURNS integer AS
$BODY$
SELECT CASE WHEN $1 >= 1 and $1 <= 30000 THEN 0
WHEN $1 > 30000 and $1 <= 60000 THEN 1
ELSE 2
end;
$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION pgpool_catalog.dist_def_branches(anyelement) OWNER TO postgres;
安裝過程基本參考了(就是手冊和入門教程):http://pgpool.projects.pgfoundry.org/pgpool-II/doc/tutorial-zh_cn.html
6.結果驗證:
貌似全網的教程都沒什麼具體的驗證方法(手冊中的驗證方法也不提示結果,模棱兩可;並且我是在多個服務器上搭建的集羣,不能直接用)。我這裏大體記錄了一下驗證方法。前提是,已經使用pgbench -p 9999向數據庫中插入測試數據。
首先,我這裏設置的pgpool監聽端口號是9999,數據庫集羣(initdb)配置的端口號是5432.這種狀況下,使用psql -p 9999 bench_parallel和psql -p 5432 bench_parallel均可以鏈接到bench_parallel數據庫(測試併發模式的數據庫)
而後,使用9999端口登陸數據庫時,執行"select count(1) from pgbench_accounts;",得到的結果應該是被分發到各個服務器上數據的總和(經由pgpool獲取查詢結果);使用5432端口登陸數據庫時,執行"select count(1) from pgbench_accounts;",得到的結果應該是隻存在本地數據庫中的數據條目。
最後說一句,不出意外的話,pgadmin鏈接到的服務器應該是5432,也就是說,在pgadmin上看到的數據僅僅是本地數據庫中存儲的數據。若是你配置的是併發模式,並且在pgadmin上看到的是測試數據的總數,那麼極可能和我犯了一樣的毛病,這個問題在後半部分有解釋
後半部分:問題記錄:
①編譯pgbench時發現問題:Makefile:19: ../../src/Makefile.global: No such file or directory,
其實這種問題的緣由都是,源代碼解壓事後,configure沒有運行過,因此從新回到最高層./configure,會把缺失的文件補全。
②編譯pgbench時發現問題:pgbench# make all以後:/usr/bin/ld: cannot find -lpgport。libpgport存在於/usr/local/pgsql/lib中,cp /usr/lcoal/pgsql/lib/libpgport.a /usr/local/lib.便可解決
③啓動pgpool時:
bind(0.0.0.0:9999) failed. reason: Address already in use
碰見這個問題,說明9999端口被其它程序佔用。
執行命令 lsof|grep 9999,查看9999端口被哪一個進程佔用。結果是pgpool。因此killall pgpool便可解決問題。
注意,若是報錯bind(0.0.0.0:postgresql) failed. reason: Address already in use,那說明你的端口號設成了5432,和postgresql相同,重啓服務器是否可以成功還沒有可知。
④pgpool只進入重用(replication),不進入併發(parallel)模式
按照入門教程一步一步配置下來發現,每一步都沒有問題,可是執行pgbench -i -s 3 -p 9999 bench_parallel後,發現每個數據庫節點都是完整的存了一份數據,即使是將bench_parallel數據庫單獨放置在一個文件夾(表空間)中,也一樣能看出文件大小是同樣的,51M。
先後拖了將近一週,今天仔細的 看了一下數據分佈表dist_def,突然發現,table_name列中,值是「accounts」,而數據庫bench_parallel中的表名是"pgbench_accounts"。。。。這個問題好囧,表名改爲pgbench_accounts,而後再用pgbench向節點插數據,會發現插入的速度明顯下降,甚至能夠說是至關慢。固然,這是在將數據分區(節點)存儲,效率必定會低,這樣插入的數據纔是個人目標--併發。
⑤對端口號加深了理解:
原本這對我來講是模棱兩可的概念,可是在研究上個問題的過程當中,
又對相關知識進行了瞭解,汗。。。端口號嘛,每一個IP肯定一個主機,每一個主機能夠提供許多網絡服務,這些網絡服務同時使用一個IP,很難辨識,因此有了端口號的概念,也就是一個IP加一個端口號,能夠肯定一個服務。
這裏,postgresql數據庫服務器中,先用initdb初始化一個數據庫集羣(具體可查pgsql/bin/initdb --help),這裏定義了一個端口號,默認5432。固然,每個服務器上不必定只有一個數據庫集羣,這時,能夠新建另外一個端口號的數據庫集羣。