【轉載】PG的兩種集羣技術:Pgpool-II與Postgres-XL

轉自:https://segmentfault.com/a/1190000007012082

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

1、 Pgpool-II和Postgres-XL簡介
據我目前的瞭解,Pgpool-II和Postgres-XL是PG集羣開源實現中比較成功的兩個項目,互聯網上相關的介紹也不少,但尚不確定二者在企業生產環境中是否被廣泛使用。其中Pgpool-II的前身的Pgpool-I,Postgres-XL的前身是Postgres-XC。
1.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主從模式集羣的結構

既然PG可以通過自身的流複製機制方便的搭建主從結構集羣,爲什麼還要在它上面搭建Pgpool-II呢?因爲簡單的主從結構集羣並不能提供連接池、負載均衡、自動故障切換等功能,Pgpool-II正好可以做到這些,當然負載均衡只針對讀操作,寫操作只發生在主節點上。爲了避免單點故障,Pgpool-II自身也可以配置爲主從結構,對外提供虛擬IP地址,當主節點故障後,從節點提升爲新的主節點並接管虛擬IP。
1.2、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語句改變數據的分佈方式。

2、 Pgpool-II和Postgres-XL對比
pgpool與pgxl對比表

3、 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.1、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.2、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,如果公司今後打算用的話,我會推介。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章