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 叢集時,應用只需連線 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
並安裝。
安裝完成後的拓撲圖如下。
配置 Pgpool 元件
- 獲取 PostgreSQL-repmgr 連線地址,進入 PostgreSQL-repmgr 元件的 Web 終端內。
env | grep REPMGR_PARTNER_NODES
- 將上述的內容複製出並修改成以下格式,然後進入 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
- 驗證叢集,進入 Pgpool 元件的 Web 終端中。
# 連線 postgresql
PGPASSWORD=$PGPOOL_POSTGRES_PASSWORD psql -U $PGPOOL_POSTGRES_USERNAME -h localhost
# 查詢叢集節點
show pool_nodes;
status 欄位均為 UP 即可。
從零開始部署 PostgreSQL 叢集
從零開始在 Rainbond 上部署 Postgresql HA 叢集也是非常簡單的,大致分為以下幾個步驟:
- 基於映象部署 PostgreSQL-repmgr 元件,並修改元件配置。
- 基於映象部署 pgpool 元件,並修改元件配置。
- 建立元件之間的依賴關係。
映象均採用 bitnami 製作的 postgresql-repmgr 和 pgpool,因 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 儲存切換為本地儲存也可保障高可用叢集的資料。可透過以下方式進行高可用叢集驗證:
- 透過 Pgpool 連線後,建立資料庫並寫入資料,再進入 PostgreSQL-repmgr 元件的 Web 終端內查詢每個例項是否都有資料。
- 掛掉主節點,驗證是否主節點自動切換並可正常連線並寫入。