對於PostgreSQL用戶來講,隨着數據增多、業務負載上升,須要將其進行容器化和集羣化改造,以便於管理和伸縮規模。PostgreSQL雖然能夠支持集羣,但仍然是傳統數據庫架構而非分佈式數據庫架構。擴展爲集羣主要有兩種方式:一是單寫多讀,slave節點實時同步,實施比較簡單;二是多寫多讀,須要在中間層添加分佈式事務協調器實現寫一致性,多讀機制與第一種方法相同。大部分狀況下,數據庫都是寫少讀多,第一種方案就足夠了。html
做爲開源數據庫的新星,PostgreSQL已經發展了多種集羣化部署方案,主要分爲裸機部署、容器部署和Kubernetes集羣部署三種主要方式;並且,已經研發了相應的擴展版本和部署工具,能夠更快地進行集羣的部署和管理。不過,因爲擴展插件(如PostGIS)每每落後於主版本的開發,與特定版本有必定的依賴性,在缺省的集羣安裝中可能沒法使用,須要本身手動安裝甚至從源碼進行編譯。git
Postgres-XL(https://www.postgres-xl.org/) 基於 PostgreSQL 數據庫構建,是一個通用的 ACID 開源的、可方便進行水平擴展的 SQL 數據庫解決方案。Postgres-XL內建了MPP (Massively Parallel Processing)能力,引入了分佈式事務協調器,支持多寫多讀,可用於商業智能、大數據分析等場合。github
Postgres-XL 可很是靈活的應付各類負載,特性包括:sql
OLTP 寫頻繁的業務。數據庫
商業智能須要MPP並行性。後端
操做數據存儲。服務器
Key-value 存儲。網絡
GIS 地理空間數據存儲。架構
適合不一樣業務工做環境。負載均衡
多租戶服務提供商託管環境。
Postgres-XL在PostgreSQL上增長了GTC和GTM,架構上是比較複雜的,雖然能夠容器化但尚未完整的Kubernetes集羣部署方案,所以目前沒法利用Kubernetes的節點伸縮、自動化管理等能力,須要手工進行配置。
目前在Kubernetes上部署PostgreSQL集羣的方案有Stolon(由SorintLab開發)、Crunchy(由CrunchyData開發)、Patroni(由Zalando開發)。
以上幾種方法採用一主多從的模式進行部署,主從節點之間經過數據複製保持同步,數據經過單一節點寫入,從多個節點讀出。節點由Kubernetes進行管理,能夠實現負載均衡、在線擴容、容錯漂移等高級特性,適合寫入頻率低、讀取負載高的應用場景。
Stolon的Kubernetes部署架構以下圖所示:
不過,因爲缺省安裝方案只提供了基本的容器鏡像,並且擴展插件(如PostGIS)每每落後於主版本的開發,與特定版本有必定的依賴性,在缺省的集羣安裝中可能沒法使用,須要本身手動安裝甚至從源碼進行編譯,進行自定義容器鏡像的建立,而後修改yaml配置文件進行部署,第一次部署起來有一些繁瑣(之後能夠經過現成的yaml文件重建,就比較簡單了)。
採用Stolon部署PostgreSQL到Kubernetes,運行的容器實例狀況以下:
PostGIS是支持地理空間數據存儲、查詢和簡單空間運算的數據庫系統,基於PostgreSQL擴展開發,能夠單獨安裝發行版,或者在PostgreSQL中安裝擴展插件來實現該功能,目前開源的QGIS和SuperMap、ESRI等商業GIS軟件都支持PostGIS做爲數據存儲後端服務器。在使用Stolon、Crunchy、Patroni部署時,目前沒有現成的鏡像可用,須要自定義容器鏡像。
爲了方便使用,PostGIS提供了一些演示地圖數據(以下),也可使用GDAL、QGIS等免費工具和SuperMap、ArcGIS等大型商業GIS平臺進行數據的導入、導出、轉換、投影、製圖、分析等操做。使用GeoPandas也能夠在Python環境中進行空間數據操做,以及使用Notebook、JupyterHub/JupyterLab進行融合的空間大數據分析。
目前,Postgres-XL和PostgreSQL標準安裝均可以直接安裝PostGIS模塊,導入數據便可使用。在使用Stolon、Crunchy、Patroni部署時,目前沒有現成的鏡像可用,須要自定義容器鏡像(估計,很快會有人作出來的)。
使用pgAdmin的圖形化界面進行管理,參考:Kubernetes上PostgreSQL集羣的管理。
PostgreSQL集羣的各個節點使用各自的存儲,即使是使用共享的存儲設備。這種模式能夠提升數據存儲的可靠性,但須要將各節點的存儲儘量分佈到不一樣的存儲設備上,以減小存儲設備失效帶來的數據丟失的風險。
在部署時須要考慮到節點漂移後的存儲可用性問題,能夠採用制定節點的方式來固定訪問的存儲位置(如使用本機磁盤時),或者使用網絡共享存儲來提供可遷移的分佈式存儲訪問,可使用傳統的光纖存儲網絡或者基於以太網協議的IPSAN(包括IPSCSI),也可使用基於軟件的網絡存儲服務(NFS)以及分佈式存儲(GlusterFS、Ceph/Rook)等。關於網絡存儲服務,參考:
隨着容器技術和集羣技術的發展,愈來愈多的服務器軟件開始向雲原生環境遷移,數據庫也不例外。傳統數據庫服務器不只向多節點集羣方案發展,還向容器化和Kubernetes集羣部署模式演進,就連Oracle都已經推出容器部署的方案,而新出現的NoSQL/NewSQL數據庫(如MongDB/Redis等等)更是從一開始就把多節點集羣、容器集羣做爲原生運行環境進行開發。
本文介紹了傳統業務大量使用的PostgreSQL數據庫的分佈式和容器集羣部署方案,而MySQL做爲互聯網企業大量採用的數據庫服務器系統,也出現了OceanBase、Vitess等多種集羣化部署方案(參考《分佈式MySQL集羣Vitess-簡介》、 《分佈式MySQL集羣Vitess-Kubernetes部署》),前幾年新創的CrateDB聲稱是同時具備NoSQL的靈活性和SQL的易用性的分佈式數據庫系統。
隨着雲原生技術的成熟和被接受度增長,傳統數據庫將可以更好地支持雲原生環境,帶來能夠動態伸縮的大規模SQL數據服務體驗,而面向雲原生的「原生數據庫」系統也將得到更大的發展和更普遍的應用。