diff --git a/Chart.yaml b/Chart.yaml index 6d1e882..0c4fbfd 100644 --- a/Chart.yaml +++ b/Chart.yaml @@ -1,4 +1,4 @@ apiVersion: v1 name: pgdog -version: v0.70 +version: v0.71 appVersion: "0.1.47" diff --git a/README.md b/README.md index 9e532f1..88f52b6 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,28 @@ mirrors: ### High Availability +#### StatefulSet WAL storage + +PgDog can persist its two-phase commit WAL when running as a StatefulSet. +Enable `walPvc` and configure the requested capacity: + +```yaml +statefulSet: + enabled: true + walPvc: + enabled: true + size: 5Gi +``` + +The StatefulSet creates one `ReadWriteOnce` persistent volume claim per replica +and mounts it at `/var/lib/pgdog`. The generated PgDog configuration sets +`two_phase_commit_wal_dir` to that mount point automatically. An explicit +`twoPhaseCommitWalDir` value takes precedence. + +The claims use the cluster's default `StorageClass`. Ensure one is configured +for dynamic provisioning before enabling `walPvc`. This option has no effect +when PgDog runs as a Deployment. + #### PodDisruptionBudget Ensures minimum pod availability during voluntary disruptions diff --git a/templates/config.yaml b/templates/config.yaml index e1d9579..00355e0 100644 --- a/templates/config.yaml +++ b/templates/config.yaml @@ -151,6 +151,8 @@ data: {{- end }} {{- if hasKey .Values "twoPhaseCommitWalDir" }} two_phase_commit_wal_dir = {{ .Values.twoPhaseCommitWalDir | quote }} + {{- else if and .Values.statefulSet.enabled .Values.statefulSet.walPvc.enabled }} + two_phase_commit_wal_dir = "/var/lib/pgdog" {{- end }} {{- if hasKey .Values "twoPhaseCommitWalSegmentSize" }} two_phase_commit_wal_segment_size = {{ include "pgdog.intval" .Values.twoPhaseCommitWalSegmentSize }} diff --git a/templates/deployment.yaml b/templates/deployment.yaml index 552f639..1c844dd 100644 --- a/templates/deployment.yaml +++ b/templates/deployment.yaml @@ -130,6 +130,10 @@ spec: mountPath: /etc/pgdog - name: users mountPath: /etc/secrets/pgdog + {{- if and .Values.statefulSet.enabled .Values.statefulSet.walPvc.enabled }} + - name: wal + mountPath: /var/lib/pgdog + {{- end }} {{- if .Values.tlsGenerateSelfSignedCert }} - name: tls mountPath: /etc/pgdog-tls @@ -254,3 +258,14 @@ spec: topologySpreadConstraints: {{- toYaml . | nindent 8 }} {{- end }} + {{- if and .Values.statefulSet.enabled .Values.statefulSet.walPvc.enabled }} + volumeClaimTemplates: + - metadata: + name: wal + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.statefulSet.walPvc.size | quote }} + {{- end }} diff --git a/test/values-statefulset.yaml b/test/values-statefulset.yaml index 5c4a4a3..20a360c 100644 --- a/test/values-statefulset.yaml +++ b/test/values-statefulset.yaml @@ -1,3 +1,6 @@ # Test StatefulSet deployment mode statefulSet: enabled: true + walPvc: + enabled: true + size: 5Gi diff --git a/values.yaml b/values.yaml index 8191d35..84f0e2e 100644 --- a/values.yaml +++ b/values.yaml @@ -89,6 +89,12 @@ replicas: 2 statefulSet: # enabled switches from Deployment to StatefulSet enabled: false + # walPvc creates one persistent volume claim per StatefulSet pod. + # The volume is mounted at /var/lib/pgdog. When enabled, + # twoPhaseCommitWalDir defaults to this mount point. + walPvc: + enabled: false + size: 1Gi # env allows setting custom environment variables on the pgdog container # Note: NODE_ID is automatically generated and cannot be overridden