傳統的關聯式資料庫PostgreSQL一般而言都是裝在本機端上運作,但是搭配了pgpool中介工具,就能夠串聯多臺PostgreSQL伺服器,以達到高可用(High Available)的架構。我將pgpool與PosgreSQL的高可用架構做成了兩臺虛擬應用範本pgpool-master跟pgpool-slave提供大家下載,並說明擴充的方法。
什麼是pgpool? / What is pgpool?
pgpool是PostgreSQL的中介工具(middleware),現在的版本為pgpool-II,所以軟體名稱通常是pgpool2,以下內容翻譯自pgpool Wiki。
pgpool-II採BSD開放原始碼授權,提供了以下功能:
- 資料庫連線池管理(Connection Pooling):pgpool-II保存連線到PostgreSQL伺服器的連線,當同樣設定的人進行連線時,就拿以保存的連線來使用。這可以降低資料庫連線的額外負擔(overhead),並且改善系統整體效能。(布丁註:早期我在DSpace上使用Proxool也是同樣的目的)
- 資料複製(replication):pgpool-II可以管理多個PostgreSQL伺服器。使用複製功能,可以即時將資料備份在2個或更多的實體硬碟中,如此一來即使硬碟損毀,伺服器仍然可以繼續提供服務。
- 負載平衡(Load Balancing):當資料複製功能開啟時,在任何伺服器上執行SELECT查詢時的會獲得同樣地結果。pgpool-II將SELECT查詢分散到多個PostgreSQL伺服器上,以改進整體的效能。PostgreSQL伺服器的數量越多,效能提升的幅度越多。負載平衡特別適用於很多使用者同時執行大量查詢的時候。
- 限制超量的資料庫連線:PostgreSQL會限制最大同時連線數量,超量的連線將會被拒絕。調整資料庫連線上限會增加資源消耗量,並影響系統效能。pgpool-II也可以設定連線數量的上限,而超過的連線將會列入等待,而不會立即回傳錯誤。
- 並行查詢(Parallel Query):使用並行查詢功能,查詢本身會切割成多個部分,並同時在多臺伺服器上同時進行查詢、取回資料、並進行合併,以此降低整體執行的時間。(布丁註:類似RAID-0的概念) 並行查詢的功能最適合用在查詢大規模的資料上。
pgpool-II將PostgreSQL伺服器作為後端與前端的通訊接口,並仰賴與伺服器之間的連線。因此,資料庫應用程式(前端,意思是網站)會將pgpool-II視為一臺PostgreSQL伺服器,而資料庫伺服器(後端)則會視pgpool-II為它的客戶端。因為pgpool-II對伺服器與客戶端來說都是透明的,因此既有的資料庫應用程式(網站)可以直接使用pgpool-II而幾乎不需要更改設定。(布丁註:通常修改連接埠即可)
(我翻譯完才發現pgpool有中文wiki…)
pgpool-II的配置 / Configuring pgpool-II
pgpool有很多模式,每一種模式都會啟用或關閉部分功能,詳細的設定一般會位於 /etc/pgpool.conf 與 /etc/pcp.conf。讓我們來看看pgpool的四種模式:
連接池管理 | X | O | O | O |
資料複製 | X | O | X | (*1) |
負載平衡 | X | O | O | (*1) |
故障恢復 | O | O | O | X |
線上恢復 | X | O | (*2) | X |
並行查詢 | X | X | X | O |
需要伺服器數量 | 1 或更多 | 2 或更多 | 2 或更多 | 2 或更多 |
是否需要系統資料庫 | 否 | 否 | 否 | 是 |
- O表示可用、X表示不可用。
- *1 並行模式需要同時打開複製與負載平衡的設定,但是複製和負載平衡無法用於並行查詢模式中的分佈式表。
- *2 線上恢復可以和串流複製同時使用。
- *3 客戶端僅是透過pgpool-II連接到PostgreSQL伺服器。這種模式僅用於限制連到伺服器的連接數,或著在多臺機器上啟用故障恢復的功能。
本文主要的目標在於第二種模式:複製模式。以下大致上說明安裝的過程,至於結果請直接用虛擬應用範本就好了。
安裝pgpool-II / Install pgpool-II
我以Turunkey Linux的PostgreSQL虛擬應用範本為基礎,以apt-get安裝pgpool2,然後修改配置後完成。大致做法如下:
- 下載Turnkey Linux Postgresql:這個虛擬應用範本做得很貼心,安裝完成之後可以自動提示設定PostgreSQL預設帳號postgres的密碼,使用https連線就會開啟phpPgAdmin。
- 從虛擬應用範本建立虛擬機器:做法請看我之前寫的教學:Proxmox VE 3安裝與建立OpenVZ虛擬機器。建立的虛擬機器有兩臺,各別是pgpool-master與pgpool-slave。以下步驟大部分都會在這兩台上進行。這兩台伺服器的IP為:
- pgpool-master: 192.168.11.110
- pgpool-slave: 192.168.11.111
- 啟動Turnkey Linux Postgresql:Turnkey Linux的虛擬應用範本啟動時都要先進行初始化,大概要花10分鐘的時間。
- 安裝pgpool2:安裝指令為:
apt-get install –y pgpool2
- 設定伺服器之間SSH的連線:
- 先設定postgres帳號的密碼:
passwd postgres
設定密碼為: password - 切換到posgresql帳號:
su postgres
- 在pgpool-master電腦上建立ssh金鑰:
ssk-keygen
當詢問passphrase的時候,直接enter就好了,不設定passphrase。
- 複製金鑰到pgpool-slave:
ssh-copy-id postgres@192.168.11.111
詢問密碼時,輸入剛剛設定postgres的密碼:password
- 設定PostgreSQL的連線權限:
- 修改/etc/postgresql/9.1/main/pg_hba.conf ,注意,路徑可能會因為PostgreSQL的版本而有所不同,我用的是9.1版本。
- 將METHOD中使用peer與md5的登入方式全部改成password。例如:
host all all 0.0.0.0/0 password #md5
- 設定 /etc/pgpool2/pcp.conf
- 建立要連線帳號的md5密碼,我們用預設帳號postgres來做這件事情:
pg_md5 postgres –p
- 輸入密碼,我建立公開範本的統一密碼都是password
- 取得md5編碼:「88e2d8cd1e92fd5544c8621508cd706b」
- 連同帳號組成「
postgres:88e2d8cd1e92fd5544c8621508cd706b
」,加到 /etc/pgpool2/pcp.conf最後一行
- 調整 /etc/pgpool2/pgpool.conf 基本設定:
- listen_addresses = '*' # 表示可讓任何其他伺服器連線到pgpool。
- replication_mode = on # 啟用資料複製
- load_balance_mode = on # 啟用負載平衡
- 調整 /etc/pgpool2/pgpool.conf 連接PostgreSQL伺服器的設定,backend_hostname1就是pgpool-slave:
backend_hostname1 = 'localhost'
backend_port1 = 5432
backend_weight1 = 1
backend_hostname1 = '192.168.11.111'
backend_port1 = 5432
backend_weight1 = 1
- 修改phpPgAdmin的連接埠設定 /etc/phppgadmin/config.inc.php:
$conf['servers'][0]['port'] = 5433;
這樣phppgadmin就會連到pgpool,而不是原本的PostgreSQL。 - 重新啟動pgpool-II跟PostgreSQL:
service pgpool2 restart
service pgpool2 postgresql
- 開啟phpPgAdmin看看成果:
https://192.168.11.110
這個網址應該可以打開phpPgAdmin,然後請用postgres / password來登入。登入之後的任何操作都會在pgpool-master跟pgpool-slave上生效。這就代表成功了。
安裝pgpoolAdmin / Install pgpoolAdmin
pgpoolAdmin是用來管理pgpool-II的PHP網頁管理工具。我們可以用它來快速確認pgpool是否正常運作。安裝方法參考自Aric Gardner的PGPOOL-II-ADMIN安裝教學。我把pgpoolAdmin跟phpPgAdmin結合,大致上步驟如下:
- 下載pgpoolAdmin:
- 解壓縮後,更改目錄名為admin-tool
- 修改擁有者為root
chown -R root admin-tool
- 修改目錄與檔案為777
chmod 777 templates_c
chmod 777 conf/pgmgt.conf.php
- 放置到phpPgAdmin的網頁目錄:/usr/share/phppgadmin/admin-tool/
- 開啟網頁 https://192.168.11.110/admin-tool/install,按照指示設定。主要設定包括了
- 修改以下目錄與檔案的修改為777 (使用chmod)
- /etc/pgpool2/pcp.conf
- /etc/pgpool2//etc/pgpool2/pgpool.conf
- pgpool.conf File (string): /etc/pgpool2/pgpool.conf
- Password File (string): /etc/pgpool2/pcp.conf
- pgpool Command (string): /usr/sbin/pgpool
- PCP Directory (string): /usr/sbin/
- 設定完成後,刪除install資料夾
rm -rf /usr/share/phppgadmin/admin-tool/install/
開啟網頁:https://192.168.11.110/admin-tool/status.php
設定完成。
下載pgpool虛擬應用範本 / Download pgpool Virtual Application Template
經過以上漫長的安裝過程之後,最後成果就是pgpool-master跟pgpool-slave這兩個虛擬應用範本啦。
建立虛擬應用範本的方法請參考我之前寫的教學:Proxmox VE 3安裝與建立OpenVZ虛擬機器。
建置好之後,設定啟動,預設就是這兩台伺服器的PostgreSQL高可用架構。
pgpool虛擬應用範本操作教學 / pgpool Virtual Application Guide
接下來我要說明使用教學。在以下教學中的網路設定如下:
- pgpool-master: 192.168.11.110 (主要操作都在這進行)
- pgpool-slave:192.168.11.111
- pgpool-slave2 (複製pgpool-slave):192.168.11.112
如何操作pgpool?
請使用phpPgAdmin來操作pgpool,操作方式就跟原本操作PostgreSQL一樣!
網址是: https://[pgpool-master-ip]/
如何觀看pgpool的運作狀況?
請使用pgpoolAdmin,網址是:https://[pgpool-master-ip]/admin-tool/
如何連接到pgpool? / How to connect to pgpool?
很簡單,使用原本連接到PostgreSQL的設定方式,連線到pgpool-master,然後連接埠改成5433就可以了。(PostgreSQL預設連接埠為5432)
以CodeIgnitor的資料庫連線設定來舉例,
原本的設定可能是連線到localhost本機端:
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "password";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "postgres";
現在要改成連線到pgpool-master (假設IP為192.168.11.110),而且要指定連接埠為5433:
$db['default']['hostname'] = "192.168.11.110";
$db['default']['username'] = "root";
$db['default']['password'] = "password";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "postgres";
$db['default']['port'] = 5433;
如何增加pgpool的數量? / How to extend pgpool structure?
首先,我們要再建置一臺pgpool-slave,設定為pgpool-slave2,設定網路位址為192.168.11.112。
然後來到pgpool-master上,修改 /etc/pgpool2/pgpool.conf。加入以下設定:(因為是第三臺,所以編號為2,下一臺編號就是3,依此類推)
backend_hostname2 = '192.168.11.112'
backend_port2 = 5432
backend_weight2 = 1
重新啟動pgpool:
service pgpool2 restart
從pgpoolAdmin來看,pgpool-slave2已經加入節點中。
有其他問題怎麼辦? / Other Questions
請使用Blogger的「張貼留言」來描述您的問題。
結論 / Conclusion
其實最近我連續做了很多個OpenVZ的虛擬應用範本,可是大部分是做給實驗室內部使用的,因此還沒能花時間轉換成可以發佈的版本。老實說,用OpenVZ製作虛擬應用範本有點麻煩。即使我用了Turnkey Linux來製作虛擬機器,可是檔案還是有200MB以上,要找到空間擺放,實在是不太容易。而且如果我要修改一個檔案,那就要重新打包、上傳,這樣子維護虛擬應用範本實在是太沒有效率。
OpenVZ虛擬應用範本在更新上實在很麻煩,因此我開始關注起Docker的倉庫運作方式。不知道這個倉庫的運作方不方便使用?
(more...)
Comments