मुख्य सामग्री पर जाएं
यह दस्तावेज़ EKB AWS/EKS अवसंरचना के लिए आपदा वसूली (DR) रणनीति, वसूली समय लक्ष्य (RTO), और वसूली बिंदु लक्ष्य (RPO) का वर्णन करता है। इसमें अंतर्निहित HA क्षमताएँ, सक्रिय बैकअप सिस्टम, वसूली प्रक्रियाएँ और ज्ञात अंतराल शामिल हैं।
तैनाती निर्देशों के लिए, Terragrunt तैनाती गाइड देखें।

वास्तुकला और उच्च उपलब्धता सारांश

अवसंरचना घटक

घटककार्यान्वयनHA मॉडल
कम्प्यूटिंगEKS (Kubernetes 1.33) + KarpenterMulti-AZ नोड्स, Spot + On-Demand
Pod autoscalingKEDACPU/Memory-आधारित, न्यूनतम 2 रेप्लिकास
Ingress / SSLALB + ACMMulti-AZ, हेल्थ-चेक रूटिंग
कैशElastiCache Redis (शर्तबद्ध)स्वचालित failover के साथ Multi-AZ
मैसेज क्यूAmazon MQ / RabbitMQ (शर्तबद्ध)सिंगल-इंस्टैंस या active/standby
डेटाबेस (सेल्फ़-होस्टेड)CloudNativePG HA क्लस्टर + PgBouncerPrimary + replicas, स्वचालित failover
डेटाबेस (क्लाउड)Supabase Cloudप्रबंधित, प्रदाता द्वारा क्रॉस-क्षेत्र
अवलोकनSigNoz + k8s-infra (शर्तबद्ध)क्लस्टर के अंदर, कोई एकल विफलता बिंदु नहीं
IaC स्टेटS3 (वर्शन्ड) + DynamoDB lockएन्क्रिप्टेड, वर्शन्ड
स्थायी volumesEBS (EBS CSI Driver के माध्यम से)AWS Data Lifecycle Manager के माध्यम से snapshots

वर्तमान HA क्षमताएँ

क्षमतावसूली समयडेटा हानिस्थिति
AZ विफलता (pods)0–5 मिनटकोई नहींसक्रिय
Pod विफलता / क्रैश0–2 मिनटकोई नहींसक्रिय
ALB हेल्थ चेक री-रूटिंग0–1 मिनटकोई नहींसक्रिय
Redis Multi-AZ failover< 1 मिनटकोई नहींसक्रिय (जब सक्षम)
Karpenter node प्रतिस्थापन0–10 मिनटकोई नहींसक्रिय
EBS snapshot रिस्टोर15–30 मिनट24 घंटे तकसक्रिय
CloudNativePG PITR रिस्टोर15–60 मिनटWAL लैग तकसक्रिय (जब सक्षम)
पूर्ण अवसंरचना पुनर्निर्माण30–60 मिनटकोई नहीं (IaC)Terragrunt के माध्यम से

RTO / RPO लक्ष्य

परिदृश्यRTO लक्ष्यRPO लक्ष्यवर्तमान क्षमता
एकल pod विफलता< 2 मिनट0पूरा (KEDA न्यूनतम रेप्लिकास)
एकल node विफलता< 10 मिनट0पूरा (Karpenter प्रतिस्थापन)
AZ विफलता< 5 मिनट0पूरा (Multi-AZ स्प्रेड)
Redis विफलता< 1 मिनट0पूरा (Multi-AZ failover)
Postgres primary विफलता< 5 मिनट0–सेकंड WAL लैगपूरा (CNPG स्वचालित failover)
EBS volume हानि15–30 मिनट< 24 घंटेआंशिक — DLM दैनिक snapshots
पूर्ण क्षेत्र विफलता> 60 मिनटबैकअप आवृत्ति पर निर्भरवर्तमान में स्वचालित नहीं

बैकअप सिस्टम

1. Terraform / Terragrunt स्टेट — S3

क्या बैकअप लिया जाता है: सभी अवसंरचना स्टेट (EKS, नेटवर्किंग, IAM, Helm releases)। कार्यान्वयन:
  • प्रति वातावरण S3 bucket: ekb-terraform-state-<env-name> (terragrunt/environments/<env-name>/state/ के माध्यम से बूटस्ट्रैप)
  • वर्शनिंग सक्षम — कोई भी पिछला स्टेट संस्करण पुनर्स्थापित किया जा सकता है
  • सर्वर-साइड एन्क्रिप्शन (AES-256)
  • स्टेट लॉकिंग के लिए DynamoDB टेबल
वसूली: S3 में किसी भी पिछली स्थिति संस्करण पर वापस जाएँ, फिर terragrunt apply पुनः चलाएँ। RPO: प्रत्येक terragrunt apply कमिट — लगातार।

2. EBS स्थायी volumes — AWS Data Lifecycle Manager

क्या बैकअप लिया जाता है: pods से जुड़े EBS volumes (Automator PostgreSQL, Supabase MinIO, कोई भी स्टेटफुल वर्कलोड)। कार्यान्वयन: वातावरण टैग्स को लक्षित करने वाली AWS Data Lifecycle Manager (DLM) नीति।
# अपने वातावरण के नाम से EBS volumes को टैग करें, फिर DLM नीति बनाएँ:
# - संसाधन: EBS volumes
# - लक्ष्य टैग: Environment=<your-env-name>
# - शेड्यूल: 02:00 UTC पर दैनिक
# - प्रतिधारण: 7 snapshots
वसूली:
# 1. रिस्टोर करने के लिए snapshot पहचानें
aws ec2 describe-snapshots --filters "Name=tag:Environment,Values=<your-env-name>"
 
# 2. snapshot से volume बनाएँ
aws ec2 create-volume \
  --snapshot-id snap-xxxxxxxxxxxxxxxxx \
  --availability-zone <your-az> \
  --volume-type gp3
 
# 3. Kubernetes में PersistentVolume को नए volume ID को संदर्भित करने के लिए अपडेट करें
kubectl patch pv <pv-name> -p '{"spec":{"awsElasticBlockStore":{"volumeID":"<new-vol-id>"}}}'
RPO: 24 घंटे तक (दैनिक snapshots)। DLM शेड्यूल आवृत्ति बढ़ाकर कम करें।

3. CloudNativePG (HA Supabase DB) — Barman Cloud बैकअप

लागू: ENABLE_CNPG=true और ENABLE_HA_SUPABASE_DB=true वाले वातावरण। क्या बैकअप लिया जाता है: CloudNativePG Postgres क्लस्टर (ha-supabase-db), जिसमें S3 या MinIO तक लगातार WAL (Write-Ahead Log) streaming, और CNPG ScheduledBackup CRD के माध्यम से अनुसूचित पूर्ण base backups शामिल हैं। कार्यान्वयन (values/ha-supabase-db.yaml में कॉन्फ़िगर):
postgres:
  backup:
    enabled: true                    # barman-cloud backups टॉगल करें
    # barmanObjectStore S3 bucket या MinIO endpoint की ओर इशारा करता है
    # IRSA / service account के पास s3:PutObject, s3:GetObject, s3:ListBucket होना चाहिए
    retentionPolicy: "30d"           # बैकअप 30 दिन रखें
    compression: gzip
बैकअप स्थिति सत्यापित करें:
# क्लस्टर के लिए सभी बैकअप सूचीबद्ध करें
kubectl get backup -n ha-supabase-db
 
# विशिष्ट बैकअप जाँचें
kubectl describe backup <backup-name> -n ha-supabase-db
 
# माँग पर बैकअप ट्रिगर करें
kubectl cnpg backup ha-supabase-db -n ha-supabase-db
बिंदु-समय वसूली (PITR):
# एक नया CNPG Cluster बनाएँ जो backup से रिस्टोर कर रहा है
# (नए namespace में या मूल को हटाने के बाद)
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: ha-supabase-db-restored
  namespace: ha-supabase-db-restore
spec:
  instances: 3
  bootstrap:
    recovery:
      source: ha-supabase-db
      recoveryTarget:
        targetTime: "2026-03-19T03:00:00.000000+00:00"  # लक्ष्य बिंदु-समय
  externalClusters:
    - name: ha-supabase-db
      barmanObjectStore:
        # स्रोत क्लस्टर जैसा ही S3/MinIO कॉन्फ़िगरेशन
        serverName: ha-supabase-db
RPO: WAL-सक्षम क्लस्टर्स के लिए लगभग शून्य (सेकंड का लैग, WAL अपलोड अंतराल से सीमित)।

4. ElastiCache Redis — Multi-AZ रिप्लिकेशन

लागू: ENABLE_AWS_SERVICES=true वाले वातावरण। Redis प्राथमिक डेटा स्टोर नहीं है — यह अस्थायी कैश और सत्र डेटा रखता है। DR का ध्यान बैकअप/रिस्टोर की तुलना में तेज़ failover पर है। कार्यान्वयन:
  • स्वचालित failover के साथ Multi-AZ सक्षम
  • रेस्ट और ट्रांज़िट में एन्क्रिप्शन
  • प्राथमिक node विफलता स्वचालित रूप से replica को प्रमोट करती है (< 1 मिनट)
RPO: Redis डेटा डिज़ाइन के अनुसार अस्थायी है। failover के बाद कैश मिस होने की उम्मीद है; एप्लिकेशन डेटाबेस से पुनः भरता है।

5. Amazon MQ (RabbitMQ) — मैसेज क्यू

लागू: ENABLE_AWS_SERVICES=true वाले वातावरण। कार्यान्वयन:
  • सिंगल-इंस्टैंस (डिफ़ॉल्ट) या active/standby तैनाती
  • broker पुनरारंभ के दौरान in-flight संदेश खो सकते हैं; consumers को idempotent बनाएँ
  • Management UI पोर्ट 15671 (SSL) पर उपलब्ध
RPO: सिंगल-इंस्टैंस — विफलता के समय in-flight संदेश खो सकते हैं। इस जोखिम को कम करने के लिए active/standby तैनाती मोड का उपयोग करें।

स्वतः वसूली तंत्र

Karpenter — Node प्रोविज़निंग और वसूली

  • समेकन: WhenEmptyOrUnderutilized — निष्क्रिय नोड्स स्वचालित रूप से समाप्त हो जाते हैं
  • Spot interruption handling: SQS interruption events सुनता है; समाप्ति से पहले Spot नोड्स को drain और प्रतिस्थापित करता है
  • Node drift: पुराने AMIs या कॉन्फ़िगरेशन का उपयोग करने वाले नोड्स enable_drift = true होने पर स्वचालित रूप से प्रतिस्थापित हो जाते हैं
  • वसूली समय: नया node 0–10 मिनट में प्रोविज़न

KEDA — Pod Autoscaling

  • न्यूनतम रेप्लिकास: सभी सेवाओं (Web, API, Celery, Automator) के लिए 2 — एकल-विफलता बिंदु को रोकता है
  • CPU सीमा: 60–70% स्केल-आउट ट्रिगर करता है
  • मेमोरी सीमा: 80% स्केल-आउट ट्रिगर करता है
  • स्केल-डाउन स्थिरता: 30 सेकंड — flapping से बचाता है
  • वसूली समय: विफल pods 0–2 मिनट में पुनः शेड्यूल

Kubernetes Pod Anti-Affinity

सभी रहित सेवाएँ nodes और AZs में pods को फैलाने के लिए kubernetes.io/hostname पर preferredDuringSchedulingIgnoredDuringExecution anti-affinity का उपयोग करती हैं।
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: ["web", "fastapi-backend", "celery-worker", "automator"]
        topologyKey: kubernetes.io/hostname

वसूली प्रक्रियाएँ

परिदृश्य 1: AZ विफलता

अपेक्षित व्यवहार: Karpenter शेष AZs में प्रतिस्थापन नोड्स प्रोविज़न करता है; KEDA pods को पुनः शेड्यूल करता है; ALB अस्वस्थ लक्ष्यों पर रूटिंग बंद कर देता है। सत्यापन:
kubectl get nodes -o wide     # पुष्टि करें कि नोड्स स्वस्थ AZs में हैं
kubectl get pods -A -o wide   # पुष्टि करें कि pods चल रहे हैं
kubectl get ingress            # पुष्टि करें कि ALB सही ढंग से रूट कर रहा है
सामान्य परिस्थितियों में कोई मैनुअल हस्तक्षेप आवश्यक नहीं है।

परिदृश्य 2: Postgres Primary Node विफलता (CloudNativePG)

CloudNativePG एक replica को primary में स्वचालित रूप से प्रमोट करता है।
# failover की निगरानी करें
kubectl get cluster ha-supabase-db -n ha-supabase-db -w
 
# नए primary की पुष्टि करें
kubectl cnpg status ha-supabase-db -n ha-supabase-db
 
# जाँचें कि PgBouncer pooler नए primary की ओर इशारा कर रहा है
kubectl get svc -n ha-supabase-db | grep pooler
एप्लिकेशन PgBouncer के माध्यम से पुनः कनेक्ट करते हैं — कनेक्शन स्ट्रिंग बदलने की आवश्यकता नहीं।

परिदृश्य 3: Snapshot से EBS Volume रिस्टोर

# 1. वातावरण के लिए snapshots खोजें
aws ec2 describe-snapshots \
  --filters "Name=tag:Environment,Values=<your-env-name>" \
  --query 'Snapshots[*].[SnapshotId,StartTime,VolumeSize]' \
  --output table
 
# 2. चयनित snapshot से नया volume बनाएँ
aws ec2 create-volume \
  --snapshot-id snap-xxxxxxxxxxxxxxxxx \
  --availability-zone <target-az> \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Environment,Value=<your-env-name>}]'
 
# 3. प्रभावित वर्कलोड को स्केल-डाउन करें
kubectl scale deployment <workload> --replicas=0
 
# 4. PV को नए EBS volume को संदर्भित करने के लिए अपडेट करें, फिर स्केल-अप करें
kubectl patch pv <pv-name> -p '{"spec":{"csi":{"volumeHandle":"<new-volume-id>"}}}'
kubectl scale deployment <workload> --replicas=2

परिदृश्य 4: पूर्ण अवसंरचना पुनर्निर्माण

विनाशकारी विफलता या क्षेत्र के पुनर्निर्माण के बाद उपयोग किया जाता है।
# 1. स्टेट bucket बूटस्ट्रैप करें (यदि मौजूद नहीं है)
cd terragrunt/environments/<your-env-name>/state
terragrunt apply
 
# 2. EKS क्लस्टर और मूल अवसंरचना पुनर्निर्मित करें
cd terragrunt/environments/<your-env-name>
terragrunt apply
 
# 3. क्रम में सेवाएँ तैनात करें (Terragrunt तैनाती गाइड § चरण 6 देखें)
ENABLE_CNPG=true terragrunt apply --target='helm_release.local["cloudnative-pg"]'
ENABLE_HA_SUPABASE_DB=true terragrunt apply --target='helm_release.local["ha-supabase-db"]'
ENABLE_SUPABASE=true terragrunt apply --target='helm_release.local["supabase"]'
अनुमानित RTO: पूर्ण क्लस्टर के लिए 30–60 मिनट; यदि EBS/CNPG डेटा रिस्टोर करना हो तो 60–120 मिनट।

परिदृश्य 5: Terragrunt स्टेट वापसी

# S3 में स्टेट संस्करण सूचीबद्ध करें
aws s3api list-object-versions \
  --bucket ekb-terraform-state-<your-env-name> \
  --prefix <state-key>
 
# विशिष्ट संस्करण पुनर्स्थापित करें
aws s3api get-object \
  --bucket ekb-terraform-state-<your-env-name> \
  --key <state-key> \
  --version-id <version-id> \
  terraform.tfstate
 
# पुनर्स्थापित स्टेट के साथ पुनः आयात या लागू करें

अवलोकन और अलर्टिंग (SigNoz)

ENABLE_SIGNOZ=true होने पर, SigNoz monitoring namespace में तैनात होता है और प्रदान करता है:
  • सभी EKB सेवाओं के लिए वितरित tracing
  • k8s-infra DaemonSet agent के माध्यम से क्लस्टर मेट्रिक्स (CPU, मेमोरी, pod स्थिति)
  • सभी pods से लॉग एकत्रीकरण
  • अलर्टिंग — pod crash loops, उच्च त्रुटि दरों, या node दबाव पर सूचित करने के लिए SigNoz में अलर्ट नियम कॉन्फ़िगर करें
DR उद्देश्यों के लिए, SigNoz डैशबोर्ड घटना के बाद निदान और वसूली की पुष्टि करने का प्राथमिक उपकरण हैं। SigNoz डेटा स्वयं EBS PVs पर संग्रहीत है और EBS snapshot नीति के अंतर्गत आता है।

अंतराल और सिफारिशें

अंतरालजोखिमसिफारिश
कोई क्रॉस-क्षेत्र रिप्लिकेशन नहींपूर्ण क्षेत्र विफलता = विस्तारित RTOCNPG बैकअप के लिए RDS क्रॉस-क्षेट्र read replica या S3 क्रॉस-क्षेत्र रिप्लिकेशन पर विचार करें
EBS snapshots दैनिक हैंEBS-समर्थित वर्कलोड के लिए 24 घंटे तक डेटा हानिमहत्वपूर्ण volumes के लिए DLM आवृत्ति प्रति घंटा बढ़ाएँ
RabbitMQ सिंगल-इंस्टैंस (डिफ़ॉल्ट)broker विफलता पर in-flight संदेश खोएउत्पादन के लिए ACTIVE_STANDBY_MULTI_AZ तैनाती मोड में स्विच करें
कोई स्वचालित DR ड्रिल नहींवसूली प्रक्रियाएँ आवश्यक होने तक परखी नहीं जातींत्रैमासिक वसूली ड्रिल शेड्यूल करें; staging वातावरण में CNPG PITR रिस्टोर का परीक्षण करें
एक ही क्लस्टर पर SigNozक्लस्टर विफलता के दौरान अवलोकन खो जाता हैअलग हल्का निगरानी endpoint या CloudWatch फ़ॉलबैक अलर्ट पर विचार करें