Workstation Logo
مصنوعات
AI لیبزOpenAI ایجنٹسClaude ایجنٹسGrok BotWorkstation CRM (WSL CRM)مارکیٹنگتمام مصنوعات
AI حل
AI ورک سٹیشنزAI SME Packagesپرائیویٹ AIGPU کلسٹرزایج AIانٹرپرائز AI لیبصنعت کے مطابق AI
خدمات
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous OperationsAI مشاورتDevOps آٹومیشنسائبر سیکیورٹیسافٹ ویئر ڈیولپمنٹایجنٹ بلڈنگMLOps سیٹ اپ
ہمارے بارے میں
شراکت دارگاہکوں کی کہانیاں
مضامین
دستاویزات
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
بلاگ
ہم سے رابطہ کریںLogin
Workstation

جدید کاروبار کے لیے AI ورک اسٹیشنز، AI ملٹی ایجنٹک سافٹ ویئر، GPU انفراسٹرکچر اور ذہین ایجنٹ حل۔

ہم سے رابطہ کریں

AI حل

AI ورک سٹیشنزAI SME Packagesپرائیویٹ AIGPU کلسٹرزایج AIانٹرپرائز AI لیبصنعت کے مطابق AI

مصنوعات

تمام مصنوعاتWSL CRM اور ERPمارکیٹنگOpenAI ایجنٹسWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

کمپنی

ہمارے بارے میںWorkstation کیوںشراکت دارگاہکوں کی کہانیاںقیمتیںرابطہ

وسائل

مضامیندستاویزاتبلاگتلاشسائٹ میپ
برطانیہ آفس
77-79 Marlowes, Hemel Hempstead HP1 1LFراستہ - M25 آؤٹر لندن سے جنکشن 20 لیںکمپنی نمبر: 11641870پیر - جمعہ: صبح 9:00 - شام 6:00 GMT
+44 7515 356 146
بیلجیم آفس
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683پیر - جمعہ: صبح 9:00 - شام 6:00 CET
+32 492 45 67 46
بھارت آفس
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI۔ جملہ حقوق محفوظ ہیں۔

رازداریکوکیزسروس کی شرائطویب سائٹ سائٹ میپ

Loading blog...

Home / Blog
DatabaseKubernetesDevOpsBackend

Zalando Postgres آپریٹر کے ساتھ PostgreSQL اعلی دستیابی: ملٹی کلاؤڈ Kubernetes تعیناتی گائیڈ

کسی بھی Kubernetes پلیٹ فارم پر Zalando آپریٹر کے ساتھ پروڈکشن گریڈ PostgreSQL HA تعینات کریں۔

Balinder Walia12 اپریل، 202630 min read

کا تعارف: Kubernetes پر PostgreSQL کی اعلی دستیابی

پر کیوں اہم ہے

PostgreSQL کو پیداوار میں چلانا زیادہ دستیابی (HA) کا مطالبہ کرتا ہے۔ ڈاون ٹائم منٹوں میں ماپا جانے سے کاروباری اداروں کو لاکھوں ڈالر کا نقصان، کسٹمر کے اعتماد میں کمی، اور سروس کی سطح کے معاہدوں کی خلاف ورزی کا سامنا کرنا پڑ سکتا ہے۔ Kubernetes کنٹینرائزڈ کام کے بوجھ کو ترتیب دینے کے لیے ڈی فیکٹو پلیٹ فارم بن گیا ہے، لیکن Kubernetes پر PostgreSQL جیسی ریاستی خدمات کو چلانے سے منفرد چیلنجز متعارف کرائے گئے ہیں: مستقل اسٹوریج مینجمنٹ، لیڈر الیکشن، خودکار فیل اوور، بیک اپ آرکیسٹریشن، اور کنکشن پولنگ۔

Zalando Postgres آپریٹرایک اوپن سورس، جنگ کا تجربہ کرنے والا حل ہے جسے Zalando-یورپ کا سب سے بڑا آن لائن فیشن خوردہ فروش- پیداوار میں سینکڑوں PostgreSQL کلسٹرز کا انتظام کرنے کے لیے بنایا گیا ہے۔ یہ اتفاق رائے پر مبنی لیڈر کے انتخاب کے لیےPatroni، PostgreSQL کنٹینر امیج کے طور پرSpilo، مسلسل آرکائیونگ اور پوائنٹ ان ٹائم ریکوری کے لیےWAL-G، اور کنکشن pooling کے لیےPgBouncerکا فائدہ اٹھاتا ہے۔ ایک ساتھ، یہ اجزاء ایک مکمل خودکار، خود سے شفا بخش PostgreSQL تعیناتی فراہم کرتے ہیں جو کسی بھی Kubernetes تقسیم میں کام کرتی ہے — AWS EKS، Azure AKS، اور Google GKE سے لے کر Rancher کے ساتھ k3s چلانے والے ننگے دھاتی کلسٹرز تک۔

اس جامع گائیڈ میں، ہم Zalando Postgres آپریٹر کے فن تعمیر کو دریافت کریں گے، متعدد Kubernetes پلیٹ فارمز پر انسٹالیشن اور کنفیگریشن کے ذریعے چلیں گے، ریپلیکیشن، بیک اپ، ڈیزاسٹر ریکوری، مانیٹرنگ، اور پروڈکشن ٹیوننگ میں گہرا غوطہ لگائیں گے۔ آخر تک، آپ کو کسی بھی Kubernetes انفراسٹرکچر پر پروڈکشن گریڈ PostgreSQL HA کلسٹرز کو تعینات اور چلانے کا علم حاصل ہو جائے گا۔

Zalando Postgres آپریٹر آرکیٹیکچر

تعینات کرنے سے پہلے فن تعمیر کو سمجھنا ضروری ہے۔ Zalando Postgres آپریٹر Kubernetes آپریٹر پیٹرن کی پیروی کرتا ہے: یہpostgresqlقسم کی کسٹم ریسورس ڈیفینیشنز (CRDs) کو دیکھتا ہے اور مطلوبہ حالت کو اصل Kubernetes وسائل میں ملا دیتا ہے۔ یہ ہے کہ اجزاء کیسے ایک ساتھ فٹ ہوتے ہیں:

Zalando Postgres آپریٹر آرکیٹیکچرPostgreSQL CRDقسم: postgresqlPostgres آپریٹرگھڑیاں &کو ملاتا ہے۔StatefulSetPod لائف سائیکلکا انتظام کرتا ہے۔پرائمری پوڈسپیلو (PostgreSQL)پیٹرونی ایجنٹریپلیکا پوڈ 1سپیلو (PostgreSQL)پیٹرونی ایجنٹریپلیکا پوڈ 2سپیلو (PostgreSQL)پیٹرونی ایجنٹPatroni DCS (Kubernetes API)لیڈر الیکشن & کلسٹر اسٹیٹPgBouncerکنکشن پولنگWAL-GS3/GCS/Azureمیںبیک اپپرائمرینقلConsensus/DCSبیک اپکنکشن پول

سپیلو: PostgreSQL کنٹینر کی تصویر

SpiloZalando کی Docker تصویر ہے جو PostgreSQL کو Patroni، WAL-G، اور ضروری ایکسٹینشنز کے ساتھ بنڈل کرتی ہے۔ سٹیٹ فل سیٹ میں ہر پوڈ سپیلو کنٹینر چلاتا ہے۔ سپیلو ہینڈل:

  • PostgreSQL سرور— ڈیٹا بیس انجن خود، ورژن 13 سے 16
  • کو سپورٹ کرتا ہے۔
  • Patroni— HA ایجنٹ جو لیڈر کے انتخاب، نقل، اور فیل اوور
  • کا انتظام کرتا ہے
  • WAL-G— مسلسل WAL آرکائیونگ اور بیس بیک اپ ٹول
  • pg_cron, pg_stat_statements, PostGIS— عام طور پر ضروری ایکسٹینشنز پہلے سے انسٹال شدہ

پیٹرونی: لیڈر الیکشن اور آٹومیٹک فیل اوور

پیٹرونی HA میکانزم کا دل ہے۔ یہ کلسٹر اسٹیٹ کو برقرار رکھنے اور لیڈر الیکشن انجام دینے کے لیے ڈسٹری بیوٹڈ کنفیگریشن اسٹور (DCS) کا استعمال کرتا ہے۔ Zalando آپریٹر سیاق و سباق میں، PatroniKubernetes APIکو بطور DCS (بذریعہ Endpoints یا ConfigMaps) استعمال کرتا ہے، بیرونی etcd یا ZooKeeper کلسٹر کی ضرورت کو ختم کرتا ہے۔

یہ ہے پیٹرونی کا فیل اوور عمل کیسے کام کرتا ہے:

  1. ہیلتھ چیک— ہر Patroni ایجنٹ مسلسل اپنے مقامی PostgreSQL مثال کی نگرانی کرتا ہے اور DCS کو صحت کی اطلاع دیتا ہے۔
  2. لیڈر لاک— پرائمری DCS (ایک Kubernetes اینڈ پوائنٹ آبجیکٹ) میں لیڈر لاک رکھتا ہے۔ لاک میں TTL (پہلے سے طے شدہ 30 سیکنڈ) ہوتا ہے۔
  3. ناکامی کا پتہ لگانا— اگر پرائمری TTL کے اندر اپنے لاک کی تجدید کرنے میں ناکام ہو جاتی ہے، تو نقلیں غیر موجودگی کا پتہ لگاتی ہیں۔
  4. الیکشن— اہل نقلیں لیڈر لاک کے لیے مقابلہ کرتی ہیں۔ کم از کم نقل کے وقفے والی نقل جیت جاتی ہے۔
  5. پروموشن— جیتنے والی نقل خود کو پرائمری میں ترقی دیتی ہے، DCS کو اپ ڈیٹ کرتی ہے، اور Kubernetesmasterسروس اینڈ پوائنٹ خود بخود اپ ڈیٹ ہو جاتی ہے۔
  6. Fencing— پرانے پرائمری کو باڑ لگا دیا گیا ہے (روک دیا گیا ہے یا نقل میں تبدیل کر دیا گیا ہے) اسپلٹ برین کو روکنے کے لیے۔

یہ پورا فیل اوور عمل عام طور پر15-30 سیکنڈزمیں مکمل ہوتا ہے، آپ کی ایپلی کیشنز کے لیے کم سے کم ڈاؤن ٹائم کو یقینی بناتا ہے۔

WAL-G: مسلسل آرکائیونگ اور بیک اپ

WAL-G PostgreSQL کے لیے اگلی نسل کا آرکائیو ٹول ہے جو S3، Google Cloud Storage (GCS) اور Azure Blob Storage میں بیک اپ کو سپورٹ کرتا ہے۔ یہ فراہم کرتا ہے:

  • بیس بیک اپ—pg_basebackup
  • کا استعمال کرتے ہوئے مکمل فزیکل بیک اپ
  • WAL آرکائیونگ— پوائنٹ ان ٹائم ریکوری کے لیے مسلسل لکھنا آگے لاگ شپنگ
  • ڈیلٹا بیک اپس— اضافی بیک اپ جو صرف تبدیل شدہ صفحات کو محفوظ کرتے ہیں
  • انکرپشن— باقی
  • پر بیک اپ کی AES-256 انکرپشن
  • کمپریشن— LZ4 یا ZSTD کمپریشن کم سٹوریج کے اخراجات

Kubernetes وسائل کا درجہ بندی

جب آپpostgresqlکسٹم ریسورس بناتے ہیں تو آپریٹر کلسٹر کو منظم کرنے کے لیے Kubernetes وسائل کا ایک جامع سیٹ بناتا ہے۔ اس درجہ بندی کو سمجھنا ٹربل شوٹنگ اور مانیٹرنگ کے لیے اہم ہے:

Kubernetes وسائل کا درجہ بندی — Zalando آپریٹرpostgresql CRDPostgres آپریٹراسٹیٹفل سیٹسروس(ماسٹر)سروس(replica)اینڈ پوائنٹسPDBPodsPVCsرازPgBouncer تعینات کریںسروس (پولر)پرائمرینقلنقلٹھوس لائنیں = براہ راست تخلیق | ڈیشڈ لائنز = مشروط تخلیقآپریٹرکے ذریعہ تخلیق کردہ

وسائل
  • StatefulSet— مستحکم نیٹ ورک شناخت کے ساتھ PostgreSQL پوڈز کا نظم کرتا ہے اور
  • کی تعیناتی کا حکم دیتا ہے۔
  • سروسز— دو کلسٹر آئی پی سروسز: پرائمری کے لیے<cluster-name>اور پڑھنے والی نقلوں کے لیے<cluster-name>-repl
  • اینڈ پوائنٹس— Patroni سیملیس فیل اوور
  • کے لیے موجودہ لیڈر کی طرف اشارہ کرنے کے لیے اینڈ پوائنٹس کو اپ ڈیٹ کرتا ہے۔
  • PodDisruption Budgets (PDB)— اس بات کو یقینی بناتا ہے کہ رضاکارانہ رکاوٹوں کے دوران کم از کم ایک مثال دستیاب رہے
  • راز— PostgreSQL سپر یوزر، نقل، اور درخواست کی اسناد Kubernetes راز
  • کے بطور محفوظ
  • Persistent Volume Claims (PVCs)— PostgreSQL کے لیے ایک PVC فی پوڈ ڈیٹا اسٹوریج
  • PgBouncer کی تعیناتی- اختیاری کنکشن پولر کو اپنی سروس
  • کے ساتھ علیحدہ تعیناتی کے طور پر تعینات کیا گیا ہے۔
ایک سے زیادہ Kubernetes پلیٹ فارمز پر

انسٹالیشن

شرطیں

Zalando Postgres آپریٹر کو انسٹال کرنے سے پہلے، یقینی بنائیں کہ آپ کے پاس ہے:

  • A چل رہا ہے Kubernetes کلسٹر (v1.25+)
  • kubectlکلسٹر ایڈمن رسائی
  • کے ساتھ ترتیب دیا گیا
  • helmv3 انسٹال ہوا
  • ایک ڈیفالٹ StorageClass کنفیگر شدہ

آپریٹر کی تنصیب بذریعہ Helm

تجویز کردہ تنصیب کا طریقہ Helm استعمال کرتا ہے۔ یہ تمام Kubernetes پلیٹ فارمز پر مستقل طور پر کام کرتا ہے:

# Add the Zalando Postgres Operator Helm repository
helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm repo add postgres-operator-ui-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator-ui
helm repo update

# Create a dedicated namespace
kubectl create namespace postgres-operator

# Install the operator with custom values
helm install postgres-operator postgres-operator-charts/postgres-operator \
  --namespace postgres-operator \
  --set configKubernetes.enable_pod_antiaffinity=true \
  --set configKubernetes.pod_environment_configmap=postgres-pod-config \
  --set configAwsOrGcp.aws_region=us-east-1 \
  --set configLoadBalancer.db_hosted_zone=db.example.com \
  --set configConnectionPooler.connection_pooler_default_cpu_request=500m \
  --set configConnectionPooler.connection_pooler_default_memory_request=100Mi

# Optionally install the operator UI for visual management
helm install postgres-operator-ui postgres-operator-ui-charts/postgres-operator-ui \
  --namespace postgres-operator

تصدیق کریں کہ آپریٹر چل رہا ہے:

kubectl get pods -n postgres-operator
# Expected output:
# NAME                                 READY   STATUS    RESTARTS   AGE
# postgres-operator-7f8b9c6d4-x2k9j   1/1     Running   0          2m

AWS EKS تعیناتی کی تفصیلات

Amazon EKS کو بہترین PostgreSQL کارکردگی کے لیے مخصوص ترتیب درکار ہے:

# EKS-specific Helm values (eks-values.yaml)
configAwsOrGcp:
  aws_region: us-east-1
  enable_ebs_gp3_migration: true
  additional_secret_mount: "aws-iam-token"

configKubernetes:
  enable_pod_antiaffinity: true
  pod_environment_configmap: "postgres-pod-config"
  spilo_privileged: false
  storage_resize_mode: pvc

# Use EBS gp3 StorageClass for better performance
# Create the StorageClass first:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-gp3-postgres
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  iops: "6000"
  throughput: "400"
  encrypted: "true"
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
EKS پر WAL-G بیک اپ کے لیے

، سروس اکاؤنٹس (IRSA):

کے لیے IAM رولز کنفیگر کریں
# Create IAM policy for WAL-G S3 access
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:DeleteObject",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::my-pg-backups",
        "arn:aws:s3:::my-pg-backups/*"
      ]
    }
  ]
}

Azure AKS تعیناتی

Azure AKS مستقل سٹوریج کے لیے Azure ڈسک اور بیک اپ تصدیق کے لیے منظم شناخت کا استعمال کرتا ہے:

# AKS-specific StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-premium-postgres
provisioner: disk.csi.azure.com
parameters:
  skuName: Premium_LRS
  cachingMode: ReadOnly
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# WAL-G backup to Azure Blob Storage environment variables
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-pod-config
  namespace: default
data:
  AZURE_STORAGE_ACCOUNT: "pgbackupsstorage"
  AZURE_STORAGE_ACCESS_KEY: "" # Use Managed Identity instead
  WALG_AZ_PREFIX: "azure://pg-wal-backups/$(SCOPE)"
  USE_WALG_BACKUP: "true"
  USE_WALG_RESTORE: "true"
  BACKUP_SCHEDULE: "0 2 * * *"
  BACKUP_NUM_TO_RETAIN: "7"

Google GKE تعیناتی

Google Kubernetes انجن GCS بیک اپ رسائی کے لیے پرسسٹنٹ ڈسک اور ورک لوڈ آئیڈینٹی کا استعمال کرتا ہے:

# GKE StorageClass for SSD Persistent Disks
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ssd-postgres
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-ssd
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# GCS backup configuration
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-pod-config
  namespace: default
data:
  WALG_GS_PREFIX: "gs://my-pg-backups/$(SCOPE)"
  USE_WALG_BACKUP: "true"
  USE_WALG_RESTORE: "true"
  GOOGLE_APPLICATION_CREDENTIALS: "/var/secrets/google/key.json"
  BACKUP_SCHEDULE: "0 2 * * *"
  BACKUP_NUM_TO_RETAIN: "7"

ننگی دھاتی k3s/رنچر لانگ ہارن اسٹوریج کے ساتھ

آن پریمیسس تعیناتیوں کے لیے، k3s ہلکا پھلکا Kubernetes تقسیم فراہم کرتا ہے اور Longhorn تقسیم شدہ بلاک اسٹوریج کی پیشکش کرتا ہے۔ جب آپ کو کلاؤڈ وینڈر لاک ان کے بغیر اپنے بنیادی ڈھانچے پر مکمل کنٹرول کی ضرورت ہو تو یہ مجموعہ مثالی ہے۔

# Install k3s on all nodes
# Master node:
curl -sfL https://get.k3s.io | sh -s - server \
  --cluster-init \
  --disable traefik \
  --write-kubeconfig-mode 644

# Worker nodes:
curl -sfL https://get.k3s.io | sh -s - agent \
  --server https://master-ip:6443 \
  --token $(cat /var/lib/rancher/k3s/server/node-token)

# Install Longhorn for persistent storage
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --create-namespace \
  --set defaultSettings.defaultReplicaCount=3 \
  --set defaultSettings.defaultDataPath=/mnt/longhorn

# Install MetalLB for LoadBalancer services
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml

# Configure MetalLB IP pool
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: postgres-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.200-192.168.1.210
k3s / Rancher Bere Metal Deploymentرینچر مینجمنٹ سرورنوڈ 1 (k3s سرور)PostgreSQL پرائمریSpilo + PatroniZalando آپریٹرPgBouncer پوللانگ ہارن والیوم/mnt/longhorn (3 نقلیں)نوڈ 2 (k3s سرور)PostgreSQL نقلSpilo + PatroniPgBouncer پولPrometheus برآمد کنندہلانگ ہارن والیوم/mnt/longhorn (3 نقلیں)Node 3 (k3s ایجنٹ)PostgreSQL نقلSpilo + PatroniPgBouncer پولGrafana ڈیش بورڈلانگ ہارن والیوم/mnt/longhorn (3 نقلیں)HAProxy / MetalLB LoadBlancerWAL-G بیک اپNFS / MinIO S3 سے مطابقت رکھنے والاپرائمرینقلPgBouncerلانگ ہارنسٹریمنگ ریپلیکیشن

PostgreSQL کلسٹر CRD تفصیلات

تعیناتی کا مرکز a Zalando آپریٹر کے ساتھ PostgreSQL کلسٹرpostgresqlکسٹم ریسورس ہے۔ یہ YAML مینی فیسٹ آپ کے کلسٹر کی مطلوبہ حالت کا اعلان کرتا ہے، اور آپریٹر اسے حقیقت میں ملا دیتا ہے۔ ذیل میں ایک جامع، پیداوار کے لیے تیار CRD تفصیلات ہے:

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  name: pg-production-cluster
  namespace: databases
  labels:
    team: platform
    environment: production
spec:
  teamId: "platform"
  volume:
    size: 100Gi
    storageClass: ebs-gp3-postgres
  numberOfInstances: 3
  enableConnectionPooler: true
  enableReplicaConnectionPooler: true
  connectionPooler:
    numberOfInstances: 2
    mode: transaction
    schema: pooler
    user: pooler
    resources:
      requests:
        cpu: 500m
        memory: 100Mi
      limits:
        cpu: "1"
        memory: 256Mi
  users:
    app_user:
    - superuser
    - createdb
    readonly_user: []
  databases:
    app_database: app_user
  postgresql:
    version: "16"
    parameters:
      shared_buffers: "2GB"
      max_connections: "200"
      work_mem: "64MB"
      maintenance_work_mem: "512MB"
      effective_cache_size: "6GB"
      random_page_cost: "1.1"
      effective_io_concurrency: "200"
      wal_buffers: "64MB"
      max_wal_size: "4GB"
      min_wal_size: "1GB"
      checkpoint_completion_target: "0.9"
      default_statistics_target: "100"
      log_statement: "ddl"
      log_min_duration_statement: "1000"
      idle_in_transaction_session_timeout: "600000"
      lock_timeout: "30000"
      statement_timeout: "60000"
  patroni:
    initdb:
      encoding: "UTF8"
      locale: "en_US.UTF-8"
      data-checksums: "true"
    pg_hba:
    - hostssl all all 0.0.0.0/0 md5
    - host    all all 0.0.0.0/0 md5
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    synchronous_mode: false
    synchronous_mode_strict: false
    maximum_lag_on_failover: 33554432
  resources:
    requests:
      cpu: "2"
      memory: 8Gi
    limits:
      cpu: "4"
      memory: 16Gi
  podAnnotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9187"
  tolerations:
  - key: "database"
    operator: "Equal"
    value: "postgres"
    effect: "NoSchedule"
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: workload-type
          operator: In
          values:
          - database
  enableShmVolume: true
  spiloRunAsUser: 101
  spiloRunAsGroup: 103
  spiloFSGroup: 103

کلیدی CRD فیلڈز کی وضاحت

  • numberOfInstances— پوڈز کی کل تعداد۔ آپریٹر خود بخود ایک کو پرائمری اور باقی کو سٹریمنگ ریپلیکس کے طور پر نامزد کرتا ہے۔
  • کنکشن پولرکو فعال کرتا ہے — کنکشن اوور ہیڈ کو کم کرتے ہوئے، بنیادی سروس کے لیے پی جی باؤنسر سائڈ کار تعینات کرتا ہے۔
  • enableReplicaConnectionPooler— ریپلیکا سروس کے لیے ایک علیحدہ پی جی باؤنسر تعینات کرتا ہے، جو پڑھنے والے بھاری کام کے بوجھ کے لیے ضروری ہے۔
  • postgresql.parameters— براہ راست PostgreSQL کنفیگریشن پیرامیٹرزpostgresql.confکو بھیجے گئے۔
  • پیٹرونی— پیٹرونی رویے کو کنفیگر کرتا ہے جس میں TTL، لوپ ویٹ، دوبارہ کوشش کرنے کا ٹائم آؤٹ، اور ہم وقت ساز نقل موڈ شامل ہے۔
  • volume.storageClass— پلیٹ فارم کے لیے مخصوص StorageClass کے نقشے (AWS پر EBS gp3، Azure پر پریمیم SSD، GCP پر SSD PD، k3s پر Longhorn)۔
  • enableShmVolume— PostgreSQL مشترکہ میموری کے لیے/dev/shmپرtmpfsکو ماؤنٹ کرتا ہے، کارکردگی کے لیے اہم۔
PgBouncerکے ساتھ

کنکشن پولنگ

PostgreSQL کا پروسیس فی کنکشن ماڈل بڑی تعداد میں کلائنٹ کنکشن کو سنبھالنا مہنگا بنا دیتا ہے۔ ہر کنکشن تقریباً 10MB RAM استعمال کرتا ہے۔ PgBouncer حقیقی PostgreSQL کنکشنز کے ایک چھوٹے سے پول پر ہزاروں کلائنٹ کنکشنز کو ملٹی پلیکس کر کے اسے حل کرتا ہے۔

Zalando آپریٹر مقامی طور پر PgBouncer کی تعیناتی کی حمایت کرتا ہے۔ جب آپ CRD میںenableConnectionPooler: trueسیٹ کرتے ہیں تو آپریٹر تخلیق کرتا ہے:

  • ایک پی جی باؤنسر تعیناتی قابل ترتیب نقل کے ساتھ
  • پولڈ کنکشنز کے لیے ایک وقف سروس (<cluster-name>-pooler)
  • PostgreSQL
  • کے ساتھ خودکار اسناد کی مطابقت پذیری

PgBouncer کنفیگریشن موڈز

# PgBouncer connection pooler modes:
#
# transaction (recommended for most workloads)
#   - Connection returned to pool after each transaction
#   - Best balance of efficiency and compatibility
#   - Cannot use session-level features (prepared statements, temp tables)
#
# session
#   - Connection held for entire client session
#   - Full PostgreSQL compatibility
#   - Lower pooling efficiency
#
# statement
#   - Connection returned after each statement
#   - Most efficient but most restrictive
#   - Only works with autocommit queries

# Custom PgBouncer configuration via operator
spec:
  connectionPooler:
    numberOfInstances: 3
    mode: transaction
    schema: pooler
    user: pooler
    defaultPoolSize: 25
    maxDBConnections: 100
    resources:
      requests:
        cpu: 250m
        memory: 128Mi
      limits:
        cpu: "1"
        memory: 256Mi

ایسی ایپلی کیشنز کے لیے جن کو تیار کردہ بیانات یا سیشن لیول فیچرز کی ضرورت ہے، PgBouncer کو نظرانداز کرتے ہوئے PostgreSQL سروسز سے براہ راست جڑیں، یا کم کنکشن کی کارکردگی کے ٹریڈ آف کے ساتھsessionپولنگ موڈ کا استعمال کریں۔

ملٹی ریجن PostgreSQL نقل

عالمی ایپلی کیشنز کے لیے جن کے لیے متعدد جغرافیائی مقامات سے کم لیٹنسی ریڈز یا تمام خطوں میں ڈیزاسٹر ریکوری کی ضرورت ہوتی ہے، ملٹی ریجن کی نقل ضروری ہے۔ Zalando آپریٹر اسٹینڈ بائی کلسٹرز کے ذریعے اس کی حمایت کرتا ہے جو اسٹریمنگ ریپلیکشن یا WAL-G آرکائیوز کے ذریعے پرائمری کلسٹر سے نقل تیار کرتے ہیں۔

ملٹی ریجن PostgreSQL سٹریمنگ ریپلیکیشنUS-EAST-1 (AWS EKS)پرائمری کلسٹرpg-prod-us (3 pods)پرائمرینقلAZکے اندرمطابقت پذیری کی نقلWAL-G → S3 (مسلسل)پی جی باؤنسر پولرEU-WEST-1 (Azure AKS)اسٹینڈ بائی کلسٹرpg-standby-eu (2 pods)اسٹینڈ بائینقلکاسکیڈنگ نقلWAL-G → Azure بلابPgBouncer (صرف پڑھنے کے لیے)AP-SOUTHEAST (GCP GKE)اسٹینڈ بائی کلسٹرpg-standby-ap (2 pods)اسٹینڈ بائینقلکاسکیڈنگ نقلWAL-G → GCS بالٹیPgBouncer (صرف پڑھنے کے لیے)ASYNCASYNC (WAL شپنگ)ریپلیکیشن ٹوپولوجیپرائمری (US-EAST) → Async سٹریمنگ سے EU-WEST & AP-SOUTHEAST اسٹینڈ بائی کلسٹرز | RPO: ~سیکنڈز | RTO: <5 منٹ دستی پروموشن کے ساتھمطابقت پذیری کی نقلAsync نقلپرائمریاسٹینڈ بائی لیڈرریپلیکاپڑھیں

سٹریمنگ ریپلیکیشن کنفیگریشن

PostgreSQL سٹریمنگ ریپلیکیشن Zalando آپریٹر میں HA کی بنیاد ہے۔ یہ رائٹ-ایڈ لاگ (WAL) ریکارڈز کو پرائمری سے ریپلیکا کو قریب قریب حقیقی وقت میں بھیج کر کام کرتا ہے۔ آپریٹر اسے خود بخود ترتیب دیتا ہے، لیکن تفصیلات کو سمجھنا ٹیوننگ اور ٹربل شوٹنگ میں مدد کرتا ہے۔

  • ہم وقت ساز نقل— پرائمری لین دین کرنے سے پہلے WAL کی رسید کی تصدیق کے لیے کم از کم ایک نقل کا انتظار کرتا ہے۔ یہ صفر ڈیٹا نقصان کی ضمانت دیتا ہے (RPO=0) لیکن تاخیر میں اضافہ کرتا ہے۔patroni.synchronous_mode: trueکے ساتھ فعال کریں۔
  • غیر مطابقت پذیر نقل— پرائمری فوری طور پر کمٹ کرتا ہے اور WAL کو متضاد طور پر بھیجتا ہے۔ قدرے کم تاخیر لیکن فیل اوور کے دوران ممکنہ ڈیٹا کا نقصان۔ یہ طے شدہ ہے۔
  • کاسکیڈنگ ریپلیکیشن— نقلیں پرائمری کی بجائے دوسری نقلوں سے نقل کر سکتی ہیں، بڑے کلسٹرز میں پرائمری پر بوجھ کو کم کرتی ہے۔
# Enable synchronous replication for zero data loss
spec:
  patroni:
    synchronous_mode: true
    synchronous_mode_strict: false  # Allow async if no sync replica available
    synchronous_node_count: 1       # Number of sync replicas required
  postgresql:
    parameters:
      synchronous_commit: "on"      # Matches Patroni synchronous_mode
      max_wal_senders: "10"         # Maximum WAL sender processes
      wal_keep_size: "1GB"          # WAL retention for replica catch-up
      hot_standby: "on"             # Allow queries on replicas
      hot_standby_feedback: "on"    # Reduce query conflicts on replicas
WAL-Gکے ساتھ

بیک اپ اور ریکوری

WAL-G بیک اپ کنفیگریشن

ڈیزاسٹر ریکوری کے لیے مناسب بیک اپ کنفیگریشن بہت ضروری ہے۔ Zalando آپریٹر آبجیکٹ اسٹوریج میں مسلسل بیک اپ کے لیے WAL-G کو مربوط کرتا ہے۔ یہاں S3 سے مطابقت رکھنے والے اسٹوریج کے لیے ایک مکمل کنفیگریشن ہے:

# ConfigMap for WAL-G backup configuration
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-pod-config
  namespace: databases
data:
  # S3 backup configuration
  AWS_ENDPOINT: "https://s3.us-east-1.amazonaws.com"
  AWS_S3_FORCE_PATH_STYLE: "false"
  AWS_REGION: "us-east-1"
  WALG_S3_PREFIX: "s3://my-pg-backups/$(SCOPE)"
  WALG_DISABLE_S3_SSE: "false"
  WALG_S3_SSE: "aws:kms"
  WALG_S3_SSE_KMS_ID: "arn:aws:kms:us-east-1:123456789:key/mrk-abcdef"

  # Backup scheduling and retention
  USE_WALG_BACKUP: "true"
  USE_WALG_RESTORE: "true"
  BACKUP_SCHEDULE: "0 1 * * *"       # Daily at 1 AM UTC
  BACKUP_NUM_TO_RETAIN: "14"          # Keep 14 daily backups

  # WAL archiving
  WALG_COMPRESSION_METHOD: "zstd"     # Better compression than lz4
  WALG_DELTA_MAX_STEPS: "6"           # Delta backups between full backups
  WALG_UPLOAD_CONCURRENCY: "4"        # Parallel upload streams
  WALG_DOWNLOAD_CONCURRENCY: "4"      # Parallel download for restore
  WALG_UPLOAD_DISK_CONCURRENCY: "4"   # Disk read concurrency

  # Clone configuration
  CLONE_AWS_ENDPOINT: "https://s3.us-east-1.amazonaws.com"
  CLONE_AWS_REGION: "us-east-1"
  CLONE_WALG_S3_PREFIX: "s3://my-pg-backups/$(CLONE_SCOPE)"
  CLONE_METHOD: "CLONE_WITH_WALG"
  CLONE_USE_WALG_RESTORE: "true"

پوائنٹ ان ٹائم ریکوری (PITR)

PITR آپ کو اپنے ڈیٹا بیس کو کسی بھی مخصوص لمحے میں بحال کرنے کی اجازت دیتا ہے جو کہ حادثاتی ڈیٹا کے حذف ہونے یا بدعنوانی سے بازیابی کے لیے اہم ہے۔ Zalando آپریٹر PITR کو کلون میکانزم کے ذریعے سپورٹ کرتا ہے:

# Clone a cluster with PITR
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  name: pg-restored-cluster
  namespace: databases
spec:
  teamId: "platform"
  volume:
    size: 100Gi
    storageClass: ebs-gp3-postgres
  numberOfInstances: 3
  postgresql:
    version: "16"
  clone:
    cluster: "pg-production-cluster"
    timestamp: "2026-04-11T14:30:00+00:00"  # Restore to this exact moment
    s3_wal_path: "s3://my-pg-backups/wal/16/pg-production-cluster"
    s3_endpoint: "https://s3.us-east-1.amazonaws.com"
    s3_access_key_id: ""      # Use IAM role instead
    s3_secret_access_key: ""  # Use IAM role instead

جب یہ CRD لاگو ہوتا ہے، آپریٹر درج ذیل اقدامات کرتا ہے:

  1. ٹارگٹ ٹائم اسٹیمپ
  2. سے پہلے تازہ ترین بیس بیک اپ تلاش کرتا ہے۔
  3. نئے StatefulSet کے بنیادی پوڈ
  4. میں بیس بیک اپ کو بحال کرتا ہے۔
  5. مخصوص ٹائم سٹیمپ
  6. تک WAL حصوں کو دوبارہ چلاتا ہے
  7. پڑھنے لکھنے کی کارروائیوں کے لیے ڈیٹا بیس کھولتا ہے
  8. ریپلیکا پوڈز
  9. پر سٹریمنگ کی نقل ترتیب دیتا ہے

اسٹینڈ بائی کلسٹر برائے ڈیزاسٹر ریکوری

ایک اسٹینڈ بائی کلسٹر ایک پرائمری کلسٹر سے مسلسل نقل کرتا ہے، جو ایک گرم اسٹینڈ بائی فراہم کرتا ہے جسے تباہی کے دوران فروغ دیا جا سکتا ہے۔ یہ کلسٹر کے اندر موجود نقلوں سے مختلف ہے — ایک اسٹینڈ بائی کلسٹر ایک مکمل طور پر خودمختار Kubernetes وسیلہ ہے جو مختلف نام کی جگہ، کلسٹر، یا یہاں تک کہ علاقے میں چل سکتا ہے۔

# Standby cluster in a different region
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  name: pg-standby-eu
  namespace: databases
spec:
  teamId: "platform"
  volume:
    size: 100Gi
    storageClass: managed-premium-postgres
  numberOfInstances: 2
  postgresql:
    version: "16"
  standby:
    standby_host: "pg-production-cluster.databases.svc.cluster.local"
    standby_port: "5432"
    # Alternative: replicate from S3 WAL archive
    # s3_wal_path: "s3://my-pg-backups/wal/16/pg-production-cluster"
  enableConnectionPooler: true
  enableReplicaConnectionPooler: true

اسٹینڈ بائی کلسٹر کو ایک آزاد پرائمری میں فروغ دینے کے لیے (ڈیزاسٹر ریکوری کے دوران)، صرف CRD سےstandbyسیکشن کو ہٹا دیں اور لاگو کریں:

# Edit the standby cluster CRD to remove standby section
kubectl patch postgresql pg-standby-eu -n databases --type json \
  -p '[{"op": "remove", "path": "/spec/standby"}]'

# The operator will promote the standby to primary
# Update your application DNS/service mesh to point to the new primary
Prometheus اور Grafanaکے ساتھ

مانیٹرنگ

جامع نگرانی پروڈکشن PostgreSQL کی تعیناتیوں کے لیے غیر گفت و شنید ہے۔ Zalando آپریٹرpostgres_exporterسائڈ کار کے ذریعے Prometheus میٹرکس ایکسپورٹ کو سپورٹ کرتا ہے۔ ایک مکمل مانیٹرنگ اسٹیک ترتیب دینے کا طریقہ یہاں ہے:

سروس مانیٹر برائے Prometheus

# ServiceMonitor for PostgreSQL metrics
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: postgres-monitor
  namespace: databases
  labels:
    team: platform
    release: prometheus
spec:
  selector:
    matchLabels:
      team: platform
  namespaceSelector:
    matchNames:
    - databases
  endpoints:
  - port: exporter
    interval: 15s
    scrapeTimeout: 10s
    path: /metrics
    relabelings:
    - sourceLabels: [__meta_kubernetes_pod_label_spilo_role]
      targetLabel: role
    - sourceLabels: [__meta_kubernetes_pod_label_cluster_name]
      targetLabel: cluster
---
# PodMonitor alternative (scrapes pods directly)
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: postgres-pod-monitor
  namespace: databases
spec:
  selector:
    matchLabels:
      application: spilo
  podMetricsEndpoints:
  - port: exporter
    interval: 15s
    path: /metrics
کی نگرانی کے لیے

کلیدی میٹرکس

یہ آپ کے Grafana ڈیش بورڈز میں ٹریک کرنے کے لیے انتہائی اہم PostgreSQL میٹرکس ہیں:

  • pg_stat_replication_lag— نقل بائٹس اور سیکنڈز میں وقفہ۔ اگر وقفہ آپ کے RPO کی حد سے زیادہ ہو تو الرٹ کریں۔
  • pg_stat_activity_count— ریاست کے لحاظ سے فعال کنکشنز۔ کنکشن پول کی تھکن پر الرٹ۔
  • pg_stat_database_tup_fetched/returned/inserted/updated/deleted— پوچھے گئے تھرو پٹ میٹرکس۔
  • pg_stat_bgwriter_buffers_checkpoint/clean/backend— بفر مینجمنٹ کی کارکردگی۔
  • pg_database_size_bytes— صلاحیت کی منصوبہ بندی کے لیے ڈیٹا بیس کے سائز میں وقت کے ساتھ اضافہ۔
  • pg_locks_count— لاک تنازعہ۔ ضرورت سے زیادہ انتظار کے تالے پر الرٹ۔
  • pg_stat_statements_calls/mean_time— اصلاح کے لیے کارکردگی کے اعدادوشمار سے استفسار کریں۔
  • patroni_postgres_running— پیٹرونی صحت کی حیثیت (1 = چل رہا ہے، 0 = نیچے)۔
  • patroni_master— کون سا پوڈ موجودہ پرائمری ہے (1 = ماسٹر، 0 = نقل)۔
  • pg_up— بنیادی PostgreSQL دستیابی کی تحقیقات۔

الرٹنگ رولز

# PrometheusRule for PostgreSQL alerts
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: postgres-alerts
  namespace: databases
spec:
  groups:
  - name: postgresql.rules
    rules:
    - alert: PostgreSQLDown
      expr: pg_up == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "PostgreSQL instance {{ $labels.instance }} is down"
    - alert: PostgreSQLReplicationLag
      expr: pg_stat_replication_pg_wal_lsn_diff > 100000000
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Replication lag is {{ $value }} bytes on {{ $labels.instance }}"
    - alert: PostgreSQLHighConnections
      expr: sum(pg_stat_activity_count) by (instance) > 180
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "{{ $value }} active connections on {{ $labels.instance }}"
    - alert: PostgreSQLDeadlocks
      expr: rate(pg_stat_database_deadlocks[5m]) > 0
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: "Deadlocks detected on {{ $labels.datname }}"
    - alert: PatroniFailover
      expr: changes(patroni_master[5m]) > 0
      labels:
        severity: critical
      annotations:
        summary: "Patroni failover occurred in cluster {{ $labels.cluster }}"

پروڈکشن ٹیوننگ گائیڈ

Kubernetes پر PostgreSQL سے زیادہ سے زیادہ کارکردگی نکالنے کے لیے مناسب ٹیوننگ ضروری ہے۔ درج ذیل پیرامیٹرز کو آپ کے پوڈ کے وسائل کی حدود اور کام کے بوجھ کی خصوصیات کی بنیاد پر ایڈجسٹ کیا جانا چاہیے۔

میموری کنفیگریشن

# For a pod with 16GB memory limit:
postgresql:
  parameters:
    # shared_buffers: 25% of total memory
    shared_buffers: "4GB"

    # effective_cache_size: 75% of total memory
    # (tells planner how much OS cache to expect)
    effective_cache_size: "12GB"

    # work_mem: shared_buffers / (max_connections * 2)
    # Conservative to prevent OOM
    work_mem: "10MB"

    # maintenance_work_mem: 5-10% of total memory
    # Used for VACUUM, CREATE INDEX, ALTER TABLE
    maintenance_work_mem: "1GB"

    # temp_buffers: memory for temp tables per session
    temp_buffers: "32MB"

    # huge_pages: try to use huge pages (requires OS config)
    huge_pages: "try"

WAL اور چیک پوائنٹ کنفیگریشن

postgresql:
  parameters:
    # WAL settings
    wal_buffers: "64MB"           # 1/32 of shared_buffers, max 64MB
    wal_compression: "zstd"        # Compress WAL (PG 15+)
    max_wal_size: "8GB"            # Before forced checkpoint
    min_wal_size: "2GB"            # WAL disk reservation
    wal_level: "replica"           # Required for replication

    # Checkpoint settings
    checkpoint_completion_target: "0.9"  # Spread I/O over 90% of interval
    checkpoint_timeout: "15min"          # Max time between checkpoints

Query Planner اور I/O

postgresql:
  parameters:
    # Cost parameters for SSD storage
    random_page_cost: "1.1"          # SSD: close to seq_page_cost
    seq_page_cost: "1.0"             # Sequential I/O baseline
    effective_io_concurrency: "200"   # Concurrent I/O for SSD

    # Planner behavior
    default_statistics_target: "200"  # More accurate statistics
    from_collapse_limit: 12           # JOIN planning threshold
    join_collapse_limit: 12           # JOIN planning threshold

    # Parallel queries
    max_parallel_workers_per_gather: "4"
    max_parallel_workers: "8"
    max_parallel_maintenance_workers: "4"
    parallel_tuple_cost: "0.01"
    parallel_setup_cost: "1000"

کنکشن اور لاگنگ

postgresql:
  parameters:
    # Connection limits
    max_connections: "200"                   # Keep low, use PgBouncer
    superuser_reserved_connections: "5"       # Reserve for admin access

    # Logging for troubleshooting
    log_statement: "ddl"                     # Log DDL statements
    log_min_duration_statement: "500"         # Log queries > 500ms
    log_checkpoints: "on"                    # Log checkpoint activity
    log_connections: "off"                   # Too noisy in production
    log_disconnections: "off"                # Too noisy in production
    log_lock_waits: "on"                     # Log lock waits
    log_temp_files: "0"                      # Log all temp file usage
    log_autovacuum_min_duration: "1000"       # Log slow autovacuum

    # Statement timeouts
    statement_timeout: "60000"               # 60 second query timeout
    lock_timeout: "30000"                    # 30 second lock timeout
    idle_in_transaction_session_timeout: "600000"  # 10 min idle txn timeout

رولنگ اپ ڈیٹس اور ورژن اپ گریڈ

معمولی ورژن

کو اپ گریڈ کرتا ہے۔ جب آپ اسپیلو امیج ٹیگ کو اپ ڈیٹ کرتے ہیں تو آپریٹر کے ذریعہ

معمولی ورژن کے اپ گریڈ (جیسے 16.2 سے 16.3) خود بخود سنبھالے جاتے ہیں۔ آپریٹر رولنگ ری اسٹارٹ کرتا ہے:

# Update the operator configuration to use a new Spilo image
helm upgrade postgres-operator postgres-operator-charts/postgres-operator \
  --namespace postgres-operator \
  --set configGeneral.docker_image=ghcr.io/zalando/spilo-16:3.1-p1 \
  --reuse-values

# The operator will perform rolling updates:
# 1. Restart replicas one at a time
# 2. Failover the primary to a freshly updated replica
# 3. Restart the old primary (now a replica)

بڑے ورژن کے اپ گریڈز

بڑے ورژن کے اپ گریڈز (مثال کے طور پر، PostgreSQL 15 سے 16) زیادہ محتاط منصوبہ بندی کی ضرورت ہے۔ Zalando آپریٹرpg_upgrade:

کا استعمال کرتے ہوئے جگہ جگہ بڑے اپ گریڈ کی حمایت کرتا ہے
# Step 1: Update the CRD to the new major version
spec:
  postgresql:
    version: "16"  # Changed from "15"

# Step 2: The operator detects the version change and:
# a) Scales down the StatefulSet to 1 replica
# b) Runs pg_upgrade on the primary pod
# c) Scales back up to the desired numberOfInstances
# d) Replicas are rebuilt from the upgraded primary

# Step 3: Verify the upgrade
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "psql -c 'SELECT version()'"

# Step 4: Run ANALYZE to update statistics after upgrade
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "psql -c 'ANALYZE VERBOSE'"

بڑے اپ گریڈ کے لیے اہم تحفظات:

  • کو اپ گریڈ کرنے سے پہلے ہمیشہ تازہ بیک اپ لیں۔
  • پہلے
  • کلون کلسٹر پر اپ گریڈ کی جانچ کریں۔
  • بڑے اپ گریڈ کے لیے ڈاؤن ٹائم کی ضرورت ہوتی ہے (عام طور پر ڈیٹا بیس کے سائز کے لحاظ سے 5-30 منٹ)
  • کو توڑنے والی تبدیلیوں کے لیے PostgreSQL ریلیز نوٹ کا جائزہ لیں۔
  • ریپلیکا کی دوبارہ تعمیر کے بعد
  • مانیٹر کی نقل تیار کرنے میں قریب سے وقفہ
  • استفسار پلانر کے اعداد و شمار
  • کو دوبارہ تخلیق کرنے کے لیے تمام ڈیٹا بیس پرANALYZEچلائیں

ایڈوانسڈ آپریشنل پیٹرنز

منطقی بیک اپ

فزیکل WAL-G بیک اپ کے علاوہ، آپریٹرpg_dumpکا استعمال کرتے ہوئے منطقی بیک اپ کو سپورٹ کرتا ہے۔ منطقی بیک اپ کراس ورژن کی منتقلی اور سلیکٹیو ٹیبل کی بحالی کے لیے مفید ہیں:

# Enable logical backups in the operator configuration
helm upgrade postgres-operator postgres-operator-charts/postgres-operator \
  --namespace postgres-operator \
  --set configLogicalBackup.logical_backup_schedule="0 3 * * *" \
  --set configLogicalBackup.logical_backup_s3_bucket="my-pg-logical-backups" \
  --set configLogicalBackup.logical_backup_s3_region="us-east-1" \
  --set configLogicalBackup.logical_backup_s3_sse="AES256" \
  --reuse-values

# The operator creates a CronJob for each cluster that:
# 1. Connects to the primary PostgreSQL instance
# 2. Runs pg_dumpall (or pg_dump per database)
# 3. Compresses and uploads to S3

کسٹم پوڈ انوائرمنٹ ویری ایبلز

آپ ConfigMap کا استعمال کرتے ہوئے اسپیلو پوڈز میں ماحولیاتی متغیرات کو انجیکشن کر سکتے ہیں۔ یہ WAL-G، حسب ضرورت اسکرپٹس، یا OS سطح کے پیرامیٹرز کو ٹیوننگ کرنے کے لیے مفید ہے:

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-pod-config
  namespace: databases
data:
  # Custom Spilo configurations
  SPILO_CONFIGURATION: |
    bootstrap:
      dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 33554432
        postgresql:
          use_pg_rewind: true
          use_slots: true
          parameters:
            archive_mode: "on"
            archive_timeout: 1800s
  # Enable pg_stat_statements
  POSTGRESQL_SHARED_PRELOAD_LIBRARIES: "bg_mon,pg_stat_statements,pgextwlist,pg_auth_mon,set_user,timescaledb,pg_cron,pg_stat_kcache"
  # Cron jobs inside PostgreSQL
  ENABLE_PG_CRON: "true"
سیکیورٹی کے لیے

نیٹ ورک کی پالیسیاں

پیداوار میں، Kubernetes نیٹ ورک پالیسیوں کا استعمال کرتے ہوئے PostgreSQL پوڈز تک نیٹ ورک کی رسائی کو محدود کریں:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-network-policy
  namespace: databases
spec:
  podSelector:
    matchLabels:
      application: spilo
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: app-namespace
    - podSelector:
        matchLabels:
          app: backend
    ports:
    - protocol: TCP
      port: 5432
    - protocol: TCP
      port: 8008   # Patroni REST API
  - from:
    - namespaceSelector:
        matchLabels:
          name: monitoring
    ports:
    - protocol: TCP
      port: 9187   # Prometheus exporter
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 443    # S3/GCS/Azure for backups

ٹربل شوٹنگ عام مسائل

آٹومیشن کے ساتھ بھی مسائل پیدا ہوتے ہیں۔ Zalando آپریٹر کے ساتھ PostgreSQL چلاتے وقت سب سے عام مسائل اور ان کے حل یہ ہیں:

1. Pod Stuck in Pending State

# Check events for the pod
kubectl describe pod pg-production-cluster-0 -n databases

# Common causes:
# - No nodes with matching tolerations/affinity
# - Insufficient CPU or memory on nodes
# - PVC cannot be provisioned (check StorageClass)

# Fix: Check node resources and storage availability
kubectl get nodes -o custom-columns=NAME:.metadata.name,CPU:.status.allocatable.cpu,MEM:.status.allocatable.memory
kubectl get pvc -n databases

2. Replication Lag Growing

# Check replication status on the primary
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "psql -c 'SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn, write_lag, flush_lag, replay_lag FROM pg_stat_replication'"

# Common causes:
# - Replica CPU/IO saturation
# - Network bandwidth limits
# - Long-running queries on replica blocking WAL replay
# - Insufficient wal_keep_size

# Fix: Check replica resources and cancel blocking queries
kubectl exec -it pg-production-cluster-1 -n databases -- \
  su postgres -c "psql -c 'SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state = \"active\" AND query_start < now() - interval \"5 minutes\"'"

3. فیل اوور

کو متحرک نہیں کر رہا ہے۔
# Check Patroni cluster status
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "patronictl list"

# Check Patroni logs
kubectl logs pg-production-cluster-0 -n databases -c postgres | grep -i patroni

# Manual failover (if auto-failover is stuck)
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "patronictl failover --candidate pg-production-cluster-1 --force"

4. بیک اپ کی ناکامیاں

# Check WAL-G backup status
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "envdir /run/etc/wal-e.d/env wal-g backup-list"

# Check backup CronJob logs
kubectl logs -l application=spilo,cluster-name=pg-production-cluster -n databases | grep -i wal-g

# Verify S3/GCS credentials
kubectl exec -it pg-production-cluster-0 -n databases -- \
  su postgres -c "envdir /run/etc/wal-e.d/env aws s3 ls s3://my-pg-backups/"

سیکیورٹی کے بہترین طرز عمل

Kubernetes پر PostgreSQL کو محفوظ کرنے کے لیے ایک دفاعی انداز کی ضرورت ہے:

  • TLS انکرپشن— تمام کلائنٹ کنکشنز کے لیے SSL کو فعال کریں۔ آپریٹر سرٹیفکیٹ مینیجر کا استعمال کرتے ہوئے خود بخود سرٹیفکیٹ فراہم کر سکتا ہے۔
  • خفیہ انتظام— ڈیٹا بیس کی اسناد کے لیے Kubernetes راز (یا بیرونی خفیہ مینیجرز جیسے والٹ) کا استعمال کریں۔ ConfigMaps میں پاس ورڈز کو کبھی اسٹور نہ کریں۔
  • RBAC— آپریٹر سروس اکاؤنٹ کی اجازتوں کو محدود کریں۔ ایپلیکیشن ڈیٹا بیس کے صارفین کے لیے کم از کم استحقاق والی رسائی کا استعمال کریں۔
  • نیٹ ورک پالیسیز— پوڈ سے پوڈ مواصلات کو محدود کریں جیسا کہ پچھلے حصے میں دکھایا گیا ہے۔
  • pg_hba.conf— میزبان پر مبنی توثیق کو اس بات کو محدود کرنے کے لیے کنفیگر کریں کہ کون سے IPs اور صارفین منسلک ہو سکتے ہیں۔
  • آڈٹ لاگنگ— ریگولیٹڈ ماحول میں SQL آڈٹ لاگنگ کے لیےpgauditایکسٹینشن کو فعال کریں۔
  • انکرپٹڈ اسٹوریج— انکرپٹڈ سٹوریج کلاسز استعمال کریں (EBS انکرپشن، Azure ڈسک انکرپشن، وغیرہ)۔
  • Pod سیکیورٹی کے معیارات— سپیلو پوڈ کو غیر جڑ کے طور پر محدود حفاظتی سیاق و سباق کے ساتھ چلائیں۔
# Security-hardened CRD settings
spec:
  spiloRunAsUser: 101
  spiloRunAsGroup: 103
  spiloFSGroup: 103
  enableShmVolume: true
  patroni:
    pg_hba:
    - hostssl all all 0.0.0.0/0 md5
    - host    replication standby all md5
    - hostssl replication standby all md5
  postgresql:
    parameters:
      ssl: "on"
      ssl_min_protocol_version: "TLSv1.3"
      password_encryption: "scram-sha-256"
  additionalVolumes:
  - name: postgres-tls
    mountPath: /tls
    secret:
      secretName: pg-tls-cert
      defaultMode: 0640

صلاحیت کی منصوبہ بندی اور سائز

مناسب سائزنگ مستحکم کارکردگی اور لاگت کی کارکردگی کو یقینی بناتی ہے۔ ان رہنما خطوط کو نقطہ آغاز کے طور پر استعمال کریں اور اپنے کام کے بوجھ کی نگرانی کے ڈیٹا کی بنیاد پر ایڈجسٹ کریں:

کام کا بوجھCPUمیموریاسٹوریجمثالیں
ترقی500m1Gi10Gi1
چھوٹی پیداوار2 cores8Gi50Gi SSD3
درمیانی پیداوار4 cores16Gi200Gi SSD3
بڑی پیداوار8 cores32Gi500Gi SSD5
انٹرپرائز / تجزیات16+ cores64Gi+1Ti+ SSD5+

مکمل اختتام سے آخر تک تعیناتی کی مثال

آئیے ایک تازہ Kubernetes کلسٹر پر شروع سے مکمل تعیناتی کے ساتھ سب کچھ ایک ساتھ رکھیں:

# Step 1: Create namespace and configure storage
kubectl create namespace databases
kubectl create namespace postgres-operator

# Step 2: Install the Zalando Postgres Operator
helm repo add postgres-operator-charts \
  https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm repo update

helm install postgres-operator postgres-operator-charts/postgres-operator \
  --namespace postgres-operator \
  --set configKubernetes.enable_pod_antiaffinity=true \
  --set configKubernetes.pod_environment_configmap=databases/postgres-pod-config

# Step 3: Create backup configuration
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-pod-config
  namespace: databases
data:
  USE_WALG_BACKUP: "true"
  USE_WALG_RESTORE: "true"
  WALG_S3_PREFIX: "s3://my-pg-backups/\$(SCOPE)"
  BACKUP_SCHEDULE: "0 1 * * *"
  BACKUP_NUM_TO_RETAIN: "14"
EOF

# Step 4: Deploy the PostgreSQL cluster
kubectl apply -f - <<EOF
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  name: pg-app-cluster
  namespace: databases
  labels:
    team: platform
spec:
  teamId: "platform"
  volume:
    size: 50Gi
  numberOfInstances: 3
  enableConnectionPooler: true
  enableReplicaConnectionPooler: true
  users:
    app_user:
    - superuser
    - createdb
  databases:
    app_db: app_user
  postgresql:
    version: "16"
    parameters:
      shared_buffers: "2GB"
      work_mem: "64MB"
      effective_cache_size: "6GB"
  resources:
    requests:
      cpu: "2"
      memory: 8Gi
    limits:
      cpu: "4"
      memory: 16Gi
EOF

# Step 5: Wait for cluster readiness
kubectl wait --for=condition=Running postgresql/pg-app-cluster \
  -n databases --timeout=300s

# Step 6: Verify cluster status
kubectl get postgresql -n databases
kubectl get pods -n databases -l cluster-name=pg-app-cluster
kubectl get svc -n databases -l cluster-name=pg-app-cluster

# Step 7: Get connection credentials
export PGPASSWORD=$(kubectl get secret app-user.pg-app-cluster.credentials.postgresql.acid.zalan.do \
  -n databases -o jsonpath='{.data.password}' | base64 -d)

# Step 8: Connect and verify
kubectl run pg-client --rm -it --image=postgres:16 -n databases -- \
  psql -h pg-app-cluster-pooler -U app_user -d app_db -c "SELECT version();"

نتیجہ

Zalando Postgres آپریٹر PostgreSQL کو Kubernetes پر ایک پیچیدہ آپریشنل چیلنج سے ایک قابل انتظام، خودکار تعیناتی میں تبدیل کرتا ہے۔ اتفاق رائے پر مبنی فیل اوور کے لیے Patroni، بیٹریوں میں شامل کنٹینر امیج کے لیے Spilo، مسلسل بیک اپ اور ریکوری کے لیے WAL-G، اور موثر کنکشن پولنگ کے لیے PgBouncer کا فائدہ اٹھا کر، آپ کو ایک پروڈکشن گریڈ ڈیٹا بیس پلیٹ فارم ملتا ہے جو AWS EKS، Azure، Azure، Azure، Google AKS-18 اور باریکرز پر مسلسل کام کرتا ہے۔

اس گائیڈ سے اہم نکات یہ ہیں:

  • ہر چیز کو خودکار کریں— آپریٹر کو StatefulSet مینجمنٹ، فیل اوور، اور بیک اپ شیڈولنگ کو سنبھالنے دیں۔ دستی مداخلت مستثنیٰ ہونی چاہیے۔
  • جارحانہ طور پرکی نگرانی کریں — پہلے دن سے Prometheus اور Grafana کو تعینات کریں۔ نقل کا وقفہ، کنکشن کی گنتی، اور لاک تنازعہ آپ کے ابتدائی انتباہی سگنل ہیں۔
  • آفت کے لیے منصوبہ— WAL-G بیک اپ کو ترتیب دیں، باقاعدگی سے PITR کی جانچ کریں، اور کام کے اہم بوجھ کے لیے اسٹینڈ بائی کلسٹر کو برقرار رکھیں۔
  • آپ کے کام کے بوجھ کے لیے
  • ٹیون— پہلے سے طے شدہ PostgreSQL پیرامیٹرز قدامت پسند ہیں۔ اپنے وسائل کی تقسیم اور استفسار کے نمونوں کی بنیاد پر shared_buffers، work_mem، اور چیک پوائنٹ کی ترتیبات کو ایڈجسٹ کریں۔
  • ڈیفالٹسے محفوظ — TLS کو فعال کریں، SCRAM-SHA-256 کی توثیق کا استعمال کریں، نیٹ ورک تک رسائی کو محدود کریں، اور باقی جگہ پر اسٹوریج کو خفیہ کریں۔
  • ٹیسٹ اپ گریڈ— ہمیشہ اپنے کلسٹر کو کلون کریں اور بڑے ورژن اپ گریڈ کو پروڈکشن میں لاگو کرنے سے پہلے ان کی جانچ کریں۔

اس جامع فاؤنڈیشن کے ساتھ، آپ کسی بھی Kubernetes پلیٹ فارم پر انتہائی دستیاب PostgreSQL کلسٹرز کو تعینات کرنے اور چلانے کے لیے اچھی طرح سے لیس ہیں، ایسی ایپلی کیشنز پیش کرتے ہیں جو پیمانے پر قابل اعتماد، کارکردگی، اور ڈیٹا کی سالمیت کا مطالبہ کرتے ہیں۔