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

PostgreSQL 是一種流行的開源關係型數據庫管理系統。它提供了標準的 SQL 語言接口用於操作數據庫。

repmgr 是一個用於 PostgreSQL 數據庫複製管理的開源工具。它提供了自動化的複製管理,包括:

可以說 repmgr 是一個擴展模塊,簡化了 PostgreSQL 複製的管理和維護,提高系統的可靠性和可用性。它是一個非常有用的工具,特別是對於需要高可用性的生產環境。同時 repmgr 也是由 Postgresql 社區開發以及維護的。

Pgpool 是一個高性能的連接池和負載均衡器,用於 PostgreSQL 數據庫。Pgpool 可以作爲中間層,位於客戶端和 PostgreSQL 服務器之間,來管理連接請求並分配給不同的 PostgreSQL 服務器進行處理,以提高整體的系統性能和可用性。Pgpool 的一些主要功能包括:

「本文將介紹在 Rainbond 上使用 Postgresql-repmgr + Pgpool 實現 Postgresql 高可用集羣的部署和管理。」

架構

當使用 Postgresql HA 集羣時,應用只需連接 pgpool 即可。

部署 Rainbond

安裝 Rainbond,可通過一條命令快速安裝 Rainbond,或選擇 基於主機安裝 [1] 和 基於 Kubernetes 安裝 [2] Rainbond。

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

通過 Rainbond 開源應用商店部署

Postgresql HA 集羣已發佈到 Rainbond 開源應用商店,可一鍵部署 Postgresql HA 集羣。

登陸 Rainbond 控制檯,進入 「平臺管理 -> 應用市場 -> 開源應用商店」 中搜索 postgresql-ha 並安裝。

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

配置 Pgpool 組件

  1. 獲取 PostgreSQL-repmgr 連接地址,進入 PostgreSQL-repmgr 組件的 Web 終端內。
env | grep REPMGR_PARTNER_NODES

  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

  1. 驗證集羣,進入 Pgpool 組件的 Web 終端中。
# 連接 postgresql
PGPASSWORD=$PGPOOL_POSTGRES_PASSWORD psql -U $PGPOOL_POSTGRES_USERNAME -h localhost

# 查詢集羣節點
show pool_nodes;

status 字段均爲 UP 即可。

從零開始部署 PostgreSQL 集羣

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

鏡像均採用 bitnami 製作的 postgresql-repmgr[3] 和 pgpool[4],因 bitnami 製作的鏡像將很多配置文件都抽離成了環境變量,配置比較方便。

部署 PostgreSQL-repmgr 組件

1. 創建組件

進入團隊內 -> 新建組件 -> 基於鏡像創建組件,應用、組件、英文名稱等自定義即可,鏡像填寫 bitnami/postgresql-repmgr:14.7.0

2. 修改組件類型

進入組件內 -> 其他設置,將組件部署類型修改爲 有狀態服務

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

進入組件內 -> 其他設置,添加 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 之間的相互依賴

4. 添加組件存儲

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

5. 啓動組件

在組件視圖內構建組件等待構建完成並啓動。

6. 修改組件實例數量

進入組件內 -> 伸縮,將組件實例數量設置爲 3,等待所有實例啓動即可。

部署 pgpool 組件

1. 創建組件

進入團隊內 -> 新建組件 -> 基於鏡像創建組件,應用、組件、英文名稱等自定義即可,鏡像填寫 bitnami/pgpool:4.4.2

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

3. 添加依賴

在應用視圖,將 pgpool 組件依賴至 PostgreSQL-repmgr 組件。

4. 啓動組件

在 pgpool 組件視圖內構建組件等待構建完成並啓動。

5. 驗證集羣

進入 Pgpool 組件的 Web 終端中,輸入以下命令驗證集羣:

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

# 查詢集羣節點
show pool_nodes;

status 字段均爲 UP 即可。

最後

外部連接

如想使用本地工具連接到 postgresql,可在 pgpool 組件的端口內打開對外服務端口,通過該端口連接到 postgresql,默認用戶密碼爲 postgres/postgres@123

驗證高可用集羣

爲了保障高可用集羣,Kubernetes 集羣至少有 3 個節點,且底層存儲使用分佈式存儲,如沒有分佈式存儲,需將 Postgresql 存儲切換爲本地存儲也可保障高可用集羣的數據。可通過以下方式進行高可用集羣驗證:

[1]

基於主機安裝 Rainbond: https://www.rainbond.com/docs/installation/install-with-ui/

[2]

基於 Kubernetes 安裝 Rainbond: https://www.rainbond.com/docs/installation/install-with-helm/

[3]

postgresql-repmgr: https://github.com/bitnami/containers/tree/main/bitnami/postgresql-repmgr

[4]

pgpool: https://github.com/bitnami/containers/tree/main/bitnami/pgpool

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Pml2TWJDUIh7d7eG-AoFQA