PG的兩種集羣技術:Pgpool-II與Postgres-XL

最近研究了PG的兩種集羣方案,分別是Pgpool-II和Postgres-XL,在這裏總結一下兩者的機制、結構、優劣、測試結果等。node

一、 Pgpool-II和Postgres-XL簡介
據我目前的瞭解,Pgpool-II和Postgres-XL是PG集羣開源實現中比較成功的兩個項目,互聯網上相關的介紹也很多,但尚不肯定兩者在企業生產環境中是否被普遍使用。其中Pgpool-II的前身的Pgpool-I,Postgres-XL的前身是Postgres-XC。
1.一、Pgpool-II
Pgpool-II至關於中間件,位於應用程序和PG服務端之間,對應用程序來講,Pgpool-II就至關於PG服務端;對PG服務端來講,Pgpool-II至關於PG客戶端。因而可知,Pgpool-II與PG是解耦合的,基於這樣的機制,Pgpool-II能夠搭建在已經存在的任意版本的PG主從結構上,主從結構的實現與Pgpool-II無關,能夠經過slony等工具或者PG自身的流複製機制實現。除了主從結構的集羣,Pgpool-II也支持多主結構,稱爲複製模式,該模式下PG節點之間是對等的,沒有主從關係,寫操做同時在全部節點上執行,這種模式下寫操做的代價很大,性能上不及主從模式。PG 9.3以後支持的流複製機制能夠方便的搭建主從結構的集羣(包括同步複製與異步複製),所以Pgpool-II中比較經常使用的模式是流複製主從模式,其結構以下圖(也能夠一主多從)。
Pgpool主從模式集羣的結構sql

既然PG能夠經過自身的流複製機制方便的搭建主從結構集羣,爲何還要在它上面搭建Pgpool-II呢?由於簡單的主從結構集羣並不能提供鏈接池、負載均衡、自動故障切換等功能,Pgpool-II正好能夠作到這些,固然負載均衡只針對讀操做,寫操做只發生在主節點上。爲了不單點故障,Pgpool-II自身也能夠配置爲主從結構,對外提供虛擬IP地址,當主節點故障後,從節點提高爲新的主節點並接管虛擬IP。
1.二、Postgres-XL
Postgres-XL的機制和Pgpool-II大不相同,它不是獨立於PG的,是在PG源代碼的基礎上增長新功能實現的。簡單來講,Postgres-XL將PG的SQL解析層的工做和數據存取層的工做分離到不一樣的兩種節點上,分別稱爲Coordinator節點和Datanode節點,並且每種節點能夠配置多個,共同協調完成本來單個PG實例完成的工做。此外,爲了保證分佈模式下事務可以正確執行,增長了一個GTM節點。爲了不單點故障,能夠爲全部節點配置對應的slave節點。Postgres-XL結構圖見下圖,來自官網。
Postgres-XL集羣的結構數據庫

Postgres-XL的Coordinator節點是整個集羣的數據訪問入口,能夠配置多個,而後在它們之上經過Nginx等工具實現負載均衡。Coordinator節點維護着數據的存儲信息,但不存儲數據自己。接收到一條SQL語句後,Coordinator解析SQL,制定執行計劃,而後分發任務到相關的Datanode上,Datanode返回執行結果到Coordinator,Coordinator整合各個Datanode返回的結果,最後返回給客戶端。
Postgres-XL的Datanode節點負責實際存取數據,數據在多個Datanode上的分佈有兩種方式:複製模式和分片模式,複製模式下,一個表的數據在指定的節點上存在多個副本;分片模式下,一個表的數據按照指定的規則分佈在多個數據節點上,這些節點共同保存一份完整的數據。這兩種模式的選擇是在建立表的時候執行CREATE TABLE語句指定的,也能夠經過ALTER TABLE語句改變數據的分佈方式。 負載均衡

二、 Pgpool-II和Postgres-XL對比
pgpool與pgxl對比表異步

三、 Pgpool-II和Postgres-XL的性能測試
我分別使用pgbench和benchmarksql測試了Pgpool-II集羣和Postgres-XL集羣的性能,爲了對比,還測試單機PG的性能。
測試條件:Pgpool-II集羣是搭建在兩臺虛機上的主從複製(異步)集羣;Postgres-XL集羣也是搭建在相同條件上的兩臺虛機的集羣,其中包含兩個Coordinator節點和兩個Datanode節點。單機PG也是運行在相同條件的虛機上。操做系統是CentOS 6.6,單機PG和Pgpool-II集羣種的PG版本號是9.5,Postgres-XL的版本號是Postgres-XL 9.5 R1.3,也只基於PG 9.5的。
3.一、pgbench測試
pgbench是PG自帶的一款簡單的PG性能測試工具,測試指標是TPS,表示每秒鐘完成的事務數。測試過程以下:
1) 建庫工具

psql -h 10.192.33.244 -p7777 -c "create database pgbench"

2) 生成數據性能

pgbench -i -s 1000 -h 10.192.33.244 -p 7777 pgbench 
#參數-s指定數據量,這裏使用1000,最終生成的數據量大小約16G。

3) 測試測試

pgbench -h 10.192.33.244 -p7777  -c30 -T300 -n 
#測試時間5分鐘,連續測試3次。

pgbench測試結果:
pgbench測試結果大數據

pgbench的測試結果顯示,Pgpool-II集羣的性能比單機PG的性能差一些,約爲84%;Postgres-XL集羣的性能比單機PG的性能好一些,約爲137%。
3.二、benchmarksql測試
benchmarksql的是一款經常使用的TPC-C測試工具,TPC-C測試衡量的是數據庫的OLTP性能。測試過程以下:
1) 建庫優化

psql -h 10.192.33.244 -p7777 -c "create database tpcc"

2) 生成數據

./runDatabaseBuild.sh props.pg
#props.pg爲配置文件,配置數據庫連接信息以及測試數據量、測試時間等,
#這裏配置的數據量是100 warehouse,最終生成的數據約10G,測試時間1小時。

3) 測試

./runBenchmark.sh props.pg

benchmarksql測試結果:
benchmarksql測試結果

benchmarksql測試結果顯示,兩種集羣與單機PG的性能指標幾乎一致,沒法分辨高下。出現這種結果的可能緣由之一是:測試數據量較小,沒法發揮集羣的性能優點,尤爲像Postgres-XL這個集羣在設計上針對大數據處理作了一些優化,應該更加適合大數據處理的場景。鑑於benchmarksql測試生成數據十分耗時,這裏就再也不進行較大數據量的測試了。

最後,綜合來看,我更傾向於Postgres-XL,若是公司從此打算用的話,我會推介。

相關文章
相關標籤/搜索