在 《Huaweicloud CCE helm install Bitnami PostgreSQL》写了下如何通过helm部署单节点 PG 和 master/standy架构。但神奇的会发现 Bitnami 除了提供这个helm chart外,还有一个 PostgreSQL HA 的chart,两者之间有何异同呢?

一、PostgreSQL-HA 和 PostgreSQL Helm chart之间的差异

有两种不同的方法来部署 PostgreSQL 集群:使用 PostgreSQL Helm 图表或 PostgreSQL 高可用性 (HA) Helm 图表。这两种解决方案都提供了一种在生产环境中运行 PostgreSQL 的简单可靠的方法。继续阅读以发现它们之间的差异,并检查哪一个更适合您的需求。

  • PostgreSQL HA 和 PostgreSQL chart 都配置具有主从拓扑的集群。主节点具有写入权限,而复制则在具有只读权限的从节点上进行。
  • PostgreSQL HA Helm chart 默认部署一个三节点集群,一个节点用于启动 pgpool,还有一主一从的PostgreSQL。PostgreSQL chart 默认配置有两个节点的集群(一主一从)。
  • PostgreSQL HA Helm chart 使用 pgpool 来处理与节点的连接。pgpool 负责在节点之间传播查询。
  • PostgreSQL HA Helm chart 包含一个 repmgr 模块,该模块通过自动成员资格控制确保高可用性。如果主节点宕机,任何一个从节点都会被提升为主节点以避免数据丢失。

下图显示了两者的区别:

pg-ha-different
pg-ha-different

二、PostgreSQL-HA 的安装

因为华为云CCE使用的存储类型是csi-disk,这里我们指定下,

 1helm install pgha  oci://registry-1.docker.io/bitnamicharts/postgresql-ha \
 2    --set postgresql.password=pgpasswd \
 3    --set postgresql.repmgrPassword=pgreppasswd \
 4    --set persistence.storageClass=csi-disk
 5
 6# 查看安装结果
 7[root@testcce-92497 ~]# kubectl get pods
 8NAME                                        READY   STATUS    RESTARTS   AGE
 9pgha-postgresql-ha-pgpool-d47b5575b-qc8gh   1/1     Running   0          101s
10pgha-postgresql-ha-postgresql-0             1/1     Running   0          101s
11pgha-postgresql-ha-postgresql-1             1/1     Running   0          101s
12pgha-postgresql-ha-postgresql-2             1/1     Running   0          101s
13[root@testcce-92497 ~]#
14[root@testcce-92497 ~]#
15[root@testcce-92497 ~]# kubectl get pods
16NAME                                        READY   STATUS    RESTARTS   AGE
17pgha-postgresql-ha-pgpool-d47b5575b-qc8gh   1/1     Running   0          109s
18pgha-postgresql-ha-postgresql-0             1/1     Running   0          109s
19pgha-postgresql-ha-postgresql-1             1/1     Running   0          109s
20pgha-postgresql-ha-postgresql-2             1/1     Running   0          109s
21[root@testcce-92497 ~]# kubectl get svc
22NAME                                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
23kubernetes                               ClusterIP   10.247.0.1       <none>        443/TCP    4d2h
24pgha-postgresql-ha-pgpool                ClusterIP   10.247.181.238   <none>        5432/TCP   113s
25pgha-postgresql-ha-postgresql            ClusterIP   10.247.179.184   <none>        5432/TCP   113s
26pgha-postgresql-ha-postgresql-headless   ClusterIP   None             <none>        5432/TCP   113s
27[root@testcce-92497 ~]# kubectl get pvc
28NAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
29data-pgha-postgresql-ha-postgresql-0   Bound    pvc-ba91a1f2-2678-4a97-b5e5-19e90e6e8d9d   8Gi        RWO            csi-disk       2m1s
30data-pgha-postgresql-ha-postgresql-1   Bound    pvc-d31b0210-0861-4cdb-8564-b376df5adf9f   8Gi        RWO            csi-disk       2m1s
31data-pgha-postgresql-ha-postgresql-2   Bound    pvc-6d5c9774-9cdc-466b-9a40-159487f25e44   8Gi        RWO            csi-disk       2m1s
32
33# 登录验证
34[root@testcce-92497 ~]# kubectl exec -it pgha-postgresql-ha-pgpool-d47b5575b-qc8gh -- /bin/bash
35I have no name!@pgha-postgresql-ha-pgpool-d47b5575b-qc8gh:/$ psql -h pgha-postgresql-ha-pgpool -p 5432 -U postgres -d postgres
36Password for user postgres:
37psql (14.8, server 15.3)
38WARNING: psql major version 14, server major version 15.
39         Some psql features might not work.
40Type "help" for help.
41
42postgres=# \l
43                                  List of databases
44   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
45-----------+----------+----------+-------------+-------------+-----------------------
46 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
47 repmgr    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
48 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
49           |          |          |             |             | postgres=CTc/postgres
50 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
51           |          |          |             |             | postgres=CTc/postgres
52(4 rows)

如果需要涉及指定版本和副本数,也可以使用如下指令进行更新:

1helm upgrade my-release --version 8.0.0 oci://registry-1.docker.io/bitnamicharts/postgresql-ha \
2    --set postgresql.password=[POSTGRESQL_PASSWORD] \
3    --set postgresql.repmgrPassword=[REPMGR_PASSWORD] \
4    --set postgresql.replicaCount=1 \
5    --set postgresql.upgradeRepmgrExtension=true

参考页面:

https://artifacthub.io/packages/helm/bitnami/postgresql-ha

https://docs.bitnami.com/kubernetes/infrastructure/postgresql/get-started/compare-solutions/