天天看點

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

作者:Rainbond開源

PostgreSQL 是一種流行的開源關系型資料庫管理系統。它提供了标準的SQL語言接口用于操作資料庫。

repmgr 是一個用于 PostgreSQL 資料庫複制管理的開源工具。它提供了自動化的複制管理,包括:

  • 故障檢測和自動故障切換:repmgr 可以檢測到主伺服器故障并自動切換到備用伺服器。
  • 自動故障恢複:repmgr 可以檢測到從伺服器故障并自動将其重新加入到複制拓撲中。
  • 多個備用伺服器:repmgr 支援多個備用伺服器,可以在主伺服器故障時自動切換到最合适的備用伺服器。
  • 靈活的複制拓撲:repmgr 支援各種複制拓撲,包括單主伺服器和多主伺服器。
  • 管理和監控:repmgr 提供了用于管理和監控PostgreSQL複制的各種工具和指令。

可以說 repmgr 是一個擴充子產品,簡化了 PostgreSQL 複制的管理和維護,提高系統的可靠性和可用性。它是一個非常有用的工具,特别是對于需要高可用性的生産環境。同時 repmgr 也是由 Postgresql 社群開發以及維護的。

Pgpool 是一個高性能的連接配接池和負載均衡器,用于 PostgreSQL 資料庫。Pgpool 可以作為中間層,位于用戶端和 PostgreSQL 伺服器之間,來管理連接配接請求并配置設定給不同的 PostgreSQL 伺服器進行處理,以提高整體的系統性能和可用性。Pgpool 的一些主要功能包括:

  • 連接配接池:Pgpool在應用程式和資料庫之間建立一個連接配接池,使得多個應用程式可以共享一組資料庫連接配接,避免了重複的連接配接和斷開。
  • 負載均衡:Pgpool可以将用戶端請求均衡地配置設定到多個PostgreSQL伺服器上,以實作負載均衡和更好的性能。
  • 高可用性:Pgpool可以檢測到PostgreSQL伺服器的故障,并自動将用戶端請求重新路由到其他可用伺服器,進而提高系統的可用性和穩定性。
  • 并行查詢:Pgpool可以将大型查詢分成幾個子查詢,然後将這些子查詢并行發送到多個PostgreSQL伺服器上執行,以提高查詢性能。

本文将介紹在 Rainbond 上使用 Postgresql-repmgr + Pgpool 實作 Postgresql 高可用叢集的部署和管理。

架構

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

當使用 Postgresql HA 叢集時,應用隻需連接配接 pgpool 即可。

  • 通過 pgpool 實作讀寫分離,寫入操作由 Master 執行,讀取操作由 Slave 執行。
  • 由 repmgr 實作流複制,Master 資料自動複制到 Slave。
  • 當 Master 遇故障下線時,由 repmgr 自定選擇 Slave 為 Master,并繼續執行寫入操作。
  • 當某個節點遇故障下線時,由 pgpool 自動斷開故障節點的連接配接,并切換到可用的節點上。

部署 Rainbond

安裝 Rainbond,可通過一條指令快速安裝 Rainbond,或選擇 基于主機安裝 和 基于 Kubernetes 安裝 Rainbond。

curl -o install.sh https://get.rainbond.com && bash ./install.sh           

通過 Rainbond 開源應用商店部署 PostgreSQL 叢集

Postgresql HA 叢集已釋出到 Rainbond 開源應用商店,可一鍵部署 Postgresql HA 叢集。

登陸 Rainbond 控制台,進入 平台管理 -> 應用市場 -> 開源應用商店 中搜尋 postgresql-ha 并安裝。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

安裝完成後的拓撲圖如下。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

配置 Pgpool 元件

  1. 擷取 PostgreSQL-repmgr 連接配接位址,進入 PostgreSQL-repmgr 元件的 Web 終端内。
env | grep REPMGR_PARTNER_NODES           
PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案
  1. 将上述的内容複制出并修改成以下格式,然後進入 Pgpool 元件内,修改PGPOOL_BACKEND_NODES 環境變量,并更新元件。
0:pg-grde8ebc-0.pg-grde8ebc.dev.svc.cluster.local:5432,1:pg-grde8ebc-1.pg-grde8ebc.dev.svc.cluster.local:5432,2:pg-grde8ebc-2.pg-grde8ebc.dev.svc.cluster.local:5432           
PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案
  1. 驗證叢集,進入 Pgpool 元件的 Web 終端中。
# 連接配接 postgresql
PGPASSWORD=$PGPOOL_POSTGRES_PASSWORD psql -U $PGPOOL_POSTGRES_USERNAME -h localhost

# 查詢叢集節點
show pool_nodes;           

status 字段均為 UP 即可。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

從零開始部署 PostgreSQL 叢集

從零開始在 Rainbond 上部署 Postgresql HA 叢集也是非常簡單的,大緻分為以下幾個步驟:

  • 基于鏡像部署 PostgreSQL-repmgr 元件,并修改元件配置。
  • 基于鏡像部署 pgpool 元件,并修改元件配置。
  • 建立元件之間的依賴關系。

鏡像均采用 bitnami 制作的 postgresql-repmgr 和 pgpool,因 bitnami 制作的鏡像将很多配置檔案都抽離成了環境變量,配置比較友善。

部署 PostgreSQL-repmgr 元件

1. 建立元件

進入團隊内 -> 建立元件 -> 基于鏡像建立元件,應用、元件、英文名稱等自定義即可,鏡像填寫 bitnami/postgresql-repmgr:14.7.0。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

2. 修改元件類型

進入元件内 -> 其他設定,将元件部署類型修改為 有狀态服務。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

3. 添加環境變量

進入元件内 -> 環境變量,新增以下環境變量:

# 預設初始化的資料庫
POSTGRESQL_DATABASE=initialize

# 建立普通使用者和密碼
POSTGRESQL_USERNAME=admin
POSTGRESQL_PASSWORD=admin@123

# 管理者 postgres 密碼
POSTGRESQL_POSTGRES_PASSWORD=postgres@123

# repmgr 使用者密碼
REPMGR_PASSWORD=repmgrpass

# 初始化主節點的 HOST。Rainbond 控制台自動渲染 SERVICE_NAME 變量,擷取目前 Statefulset 的控制器名稱。
REPMGR_PRIMARY_HOST=${SERVICE_NAME}-0.${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local

# 叢集中的所有節點,以逗号分隔
REPMGR_PARTNER_NODES=${SERVICE_NAME}-0.${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local,${SERVICE_NAME}-1.${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local,${SERVICE_NAME}-2.${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local           
PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

進入元件内 -> 其他設定,添加 Kubernetes 屬性,選擇 env,添加以下内容:

# repmgr 節點名稱
- name: REPMGR_NODE_NAME
  value: "$(POD_NAME)"
# repmgr 節點網絡名稱
- name: REPMGR_NODE_NETWORK_NAME
  value: "$(POD_NAME).$(SERVICE_NAME).$(NAMESPACE).svc.cluster.local"
  
### "$(POD_NAME)" 用于定義 env 之間的互相依賴           
PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

4. 添加元件存儲

進入元件内 -> 存儲,添加新的存儲,存儲路徑為 /bitnami/postgresql,其他自定義即可。

5. 啟動元件

在元件視圖内建構元件等待建構完成并啟動。

6. 修改元件執行個體數量

進入元件内 -> 伸縮,将元件執行個體數量設定為 3,等待所有執行個體啟動即可。

部署 pgpool 元件

1. 建立元件

進入團隊内 -> 建立元件 -> 基于鏡像建立元件,應用、元件、英文名稱等自定義即可,鏡像填寫 bitnami/pgpool:4.4.2。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

2. 添加環境變量

進入元件内 -> 環境變量,新增以下環境變量:

# pgpool admin 使用者與密碼
PGPOOL_ADMIN_USERNAME=admin
PGPOOL_ADMIN_PASSWORD=admin@123

# postgres 使用者與密碼
PGPOOL_POSTGRES_USERNAME=postgres
PGPOOL_POSTGRES_PASSWORD=postgres@123

# 用于執行流檢查的使用者和密碼
PGPOOL_SR_CHECK_USER=admin
PGPOOL_SR_CHECK_PASSWORD=admin@123

# postgresql 後端節點。節點清單擷取進入到 PostgreSQL-repmgr 元件的 Web 終端内,使用 env | grep REPMGR_PARTNER_NODES 指令擷取,然後修改為以下格式
PGPOOL_BACKEND_NODES=0:postgresql-ha-repmgr-0.postgresql-ha-repmgr.dev.svc.cluster.local:5432,1:postgresql-ha-repmgr-1.postgresql-ha-repmgr.dev.svc.cluster.local:5432,2:postgresql-ha-repmgr-2.postgresql-ha-repmgr.dev.svc.cluster.local:5432           
PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

3. 添加依賴

在應用視圖,将 pgpool 元件依賴至 PostgreSQL-repmgr 元件。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

4. 啟動元件

在 pgpool 元件視圖内建構元件等待建構完成并啟動。

5. 驗證叢集

進入 Pgpool 元件的 Web 終端中,輸入以下指令驗證叢集:

# 連接配接 postgresql
PGPASSWORD=$PGPOOL_POSTGRES_PASSWORD psql -U $PGPOOL_POSTGRES_USERNAME -h localhost

# 查詢叢集節點
show pool_nodes;           

status 字段均為 UP 即可。

PostgreSQL-HA 高可用叢集在 Rainbond 上的部署方案

最後

外部連接配接

如想使用本地工具連接配接到 postgresql,可在 pgpool 元件的端口内打開對外服務端口,通過該端口連接配接到 postgresql,預設使用者密碼為 postgres/postgres@123。

驗證高可用叢集

為了保障高可用叢集,Kubernetes 叢集至少有 3 個節點,且底層存儲使用分布式存儲,如沒有分布式存儲,需将 Postgresql 存儲切換為本地存儲也可保障高可用叢集的資料。可通過以下方式進行高可用叢集驗證:

  • • 通過 Pgpool 連接配接後,建立資料庫并寫入資料,再進入 PostgreSQL-repmgr 元件的 Web 終端内查詢每個執行個體是否都有資料。
  • • 挂掉主節點,驗證是否主節點自動切換并可正常連接配接并寫入。

繼續閱讀