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

PostgreSQL مقامی اعلی دستیابی: پیٹرونی، سٹریمنگ ریپلیکیشن، اور پروڈکشن فیل اوور کی حکمت عملی

پیٹرونی، سٹریمنگ ریپلیکیشن، اور HAProxy کے ساتھ PostgreSQL Native HA

Balinder Walia12 اپریل، 202636 min read

ایک PostgreSQL مثال کو چلانا اس وقت تک سیدھا ہے جب تک کہ پہلی غیر منصوبہ بند بندش آپ کو یاد دلائے کہ ڈیٹا بیس صرف اتنا ہی قیمتی ہے جتنا اس کی دستیابی ہے۔ ڈسک کی ناکامی، کرنل کی گھبراہٹ، نیٹ ورک پارٹیشنز، اور بوچڈ اپ گریڈ نظریاتی خطرات نہیں ہیں - یہ کافی طویل ٹائم لائن پر آپریشنل یقینی ہیں۔ PostgreSQL بلٹ ان آٹومیٹک فیل اوور کے ساتھ جہاز نہیں بھیجتا ہے، لیکن یہ ایک انتہائی دستیاب کلسٹر بنانے کے لیے درکار تمام نقل کی ابتدائی چیزیں فراہم کرتا ہے۔ Patroni، Zalando کے زیر انتظام ایک اوپن سورس HA فریم ورک، ان پرائمٹیوز کو پروڈکشن گریڈ فیل اوور سسٹم میں ترتیب دیتا ہے جس کا دنیا بھر میں ہزاروں PostgreSQL کلسٹرز میں بڑے پیمانے پر تجربہ کیا گیا ہے۔

یہ مضمون ایک گہری ڈوبکی انجینئرنگ گائیڈ ہے۔ ہم PostgreSQL اسٹریمنگ ریپلیکیشن (مطابقت پذیر اور غیر مطابقت پذیر)، پیٹرونی آرکیٹیکچر اور کنفیگریشن وغیرہ کا احاطہ کریں گے بطور تقسیم کنفیگریشن اسٹور، HAProxy کنکشن روٹنگ کے لیے ریڈ رائٹ اسپلٹنگ، پی جی باؤنسر کنکشن پولنگ کے لیے، WAL آرکائیونگ اور پوائنٹ ان ٹائم لاجیکل ڈیٹا کو منتخب کرنے کے لیے، ڈیٹا کو منتخب کرنے کے لیے۔ ابتدائی اسٹینڈ بائی پروویژننگ کے لیے pg_basebackup، پیٹرونی کے متبادل کے طور پر repmgr، AWS، Azure، اور GCP کے لیے کلاؤڈ مخصوص تعیناتی پیٹرن، رینچر اور لانگ ہورن کے ساتھ ننگی دھاتی k3s تعیناتی، pg_stat_replication کے ساتھ نگرانی اور Prometheus/Prometheus/Grafana کے طریقہ کار، sp-litovers کے ساتھ نگرانی۔ فیل اوور کی توثیق کے لیے روک تھام، پروڈکشن ٹیوننگ، اور افراتفری انجینئرنگ۔

PostgreSQL سٹریمنگ ریپلیکیشن کے بنیادی اصول

سٹریمنگ نقل PostgreSQL اعلی دستیابی کی ریڑھ کی ہڈی ہے۔ یہ ایک پرائمری سرور سے ایک یا زیادہ اسٹینڈ بائی سرورز پر رائٹ-ایڈ لاگ (WAL) ریکارڈز کو مسلسل بھیج کر کام کرتا ہے۔ اسٹینڈ بائی ان WAL ریکارڈز کو حقیقی وقت میں لاگو کرتا ہے، پرائمری کے ڈیٹا کی قریب قریب ایک جیسی کاپی کو برقرار رکھتا ہے۔ یہ طریقہ کار PostgreSQL 9.0 میں متعارف کرایا گیا تھا اور اس کے بعد کی ہر ریلیز میں اسے بہتر کیا گیا ہے۔

سلسلہ بندی کی نقل کے دو طریقے ہیں:غیر مطابقت پذیراورمطابقت پذیر۔ غیر مطابقت پذیر موڈ میں، پرائمری لین دین کرنے سے پہلے WAL ریکارڈز کی وصولی کی تصدیق کے لیے اسٹینڈ بائی کا انتظار نہیں کرتا ہے۔ یہ زیادہ سے زیادہ تحریری کارکردگی فراہم کرتا ہے لیکن ممکنہ ڈیٹا کے نقصان کی ونڈو متعارف کراتا ہے — اگر اسٹینڈ بائی کو حالیہ WAL موصول ہونے سے پہلے پرائمری ناکام ہو جاتی ہے، تو وہ لین دین ضائع ہو جاتا ہے۔ سنکرونس موڈ میں، پرائمری اس بات کی تصدیق کرنے کے لیے کم از کم ایک اسٹینڈ بائی کا انتظار کرتی ہے کہ کسی لین دین کی کمٹمنٹ کی اطلاع دینے سے پہلے WAL ریکارڈز پائیدار اسٹوریج پر لکھے گئے ہیں۔ یہ کمٹ لیٹینسی میں اضافے کی قیمت پر ڈیٹا کے نقصان کو ختم کرتا ہے، کیونکہ ہر تحریر کو اسٹینڈ بائی کے لیے راؤنڈ ٹرپ کرنا چاہیے۔

ہم وقت ساز اور غیر مطابقت پذیر نقل کے درمیان انتخاب بائنری نہیں ہے۔ PostgreSQL سیشن کی سطح پرsynchronous_commitکو سپورٹ کرتا ہے، اس لیے تاخیر سے متعلق حساس کام کا بوجھ غیر مطابقت پذیر کمٹ میں آپٹ کر سکتا ہے جب کہ اہم مالیاتی لین دین اسی کلسٹر کے اندر مطابقت پذیر کمٹ کا استعمال کرتے ہیں۔

نقل

کے لیے بنیادی ترتیب دینا

پرائمری سرور کو WAL ریکارڈ بنانے کے لیے ترتیب دیا جانا چاہیے تاکہ نقل کے لیے کافی ہو اور اسٹینڈ بائی کنکشنز کی اجازت دی جا سکے۔ درج ذیلpostgresql.confترتیبات ضروری ہیں۔

# postgresql.conf on the primary
wal_level = replica                    # minimum for streaming replication
max_wal_senders = 10                   # max concurrent replication connections
max_replication_slots = 10             # prevent WAL removal before standby consumption
wal_keep_size = 2GB                    # retain WAL as fallback if slots are unused
hot_standby = on                       # allow read queries on standbys
synchronous_commit = on                # 'on' for sync, 'off' for pure async
synchronous_standby_names = 'ANY 1 (standby1, standby2)'  # sync replication targets
archive_mode = on                      # enable WAL archiving for PITR
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
listening_addresses = '*'
port = 5432
نقل کنکشن کے لیے

توثیقpg_hba.confمیں ہینڈل کی جاتی ہے۔ نقل کنکشن ایک وقف کنکشن کی قسم کا استعمال کرتے ہیں.

# pg_hba.conf — replication entries
# TYPE   DATABASE        USER            ADDRESS              METHOD
host     replication     replicator      10.0.1.0/24          scram-sha-256
host     replication     replicator      10.0.2.0/24          scram-sha-256
host     all             all             10.0.0.0/16          scram-sha-256

پرائمری پر نقل صارف بنائیں۔

CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'strong_replication_password';

pg_basebackup

کے ساتھ اسٹینڈ بائی کی فراہمی

pg_basebackupیوٹیلیٹی پرائمری کی ڈیٹا ڈائرکٹری کی ایک فزیکل کاپی بناتی ہے، جو ایک نئے اسٹینڈ بائی کا نقطہ آغاز بن جاتی ہے۔ یہ بیس بیک اپ اور WAL اسٹریمنگ کو جوہری طور پر ہینڈل کرتا ہے، لہذا نتیجے میں آنے والی کاپی مستقل ہے۔

# On the standby server
pg_basebackup -h primary-host -U replicator -D /var/lib/postgresql/16/main \
  -Fp -Xs -P -R

# -Fp: plain format
# -Xs: stream WAL during backup
# -P:  show progress
# -R:  create standby.signal and configure primary_conninfo in postgresql.auto.conf

-Rجھنڈا اہم ہے — یہprimary_conninfoکوpostgresql.auto.confمیں لکھتا ہے اورstandby.signalبناتا ہے، جو PostgreSQL کو سٹینڈ بائی موڈ میں شروع کرنے کو کہتا ہے۔ PostgreSQL 12 اور بعد میں،recovery.confکو ان دو میکانزم سے بدل دیا گیا ہے۔

# postgresql.auto.conf (generated by pg_basebackup -R)
primary_conninfo = 'host=primary-host port=5432 user=replicator password=strong_replication_password application_name=standby1'
primary_slot_name = 'standby1_slot'

اسٹینڈ بائی شروع کرنے سے پہلے پرائمری پر ریپلیکیشن سلاٹ بنائیں، تاکہ اسٹینڈ بائی کے استعمال ہونے سے پہلے WAL کو صاف ہونے سے روکا جا سکے۔

SELECT pg_create_physical_replication_slot('standby1_slot');
SELECT pg_create_physical_replication_slot('standby2_slot');

پیٹرونی: خودکار HA آرکیسٹریشن

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

پیٹرونی ایک Python ڈیمون ہے جو ہر PostgreSQL مثال کے ساتھ چلتا ہے۔ یہ لیڈر الیکشن اور کلسٹر اسٹیٹ کو مربوط کرنے کے لیے ڈسٹری بیوٹڈ کنفیگریشن اسٹور (DCS) - عام طور پر etcd، بلکہ ZooKeeper یا Consul کا استعمال کرتا ہے۔ ہر پیٹرونی نوڈ مسلسل اپنی صحت کی حیثیت DCS کو لکھتا ہے۔ جب لیڈر (پرائمری) تشکیل شدہ TTL کے اندر اپنی DCS کلید کی تجدید کرنے میں ناکام ہو جاتا ہے، تو Patroni صحت مند اسٹینڈ بائی کے درمیان لیڈر کا انتخاب شروع کرتا ہے۔ جیتنے والے کو پرائمری میں ترقی دی جاتی ہے، اور بقیہ نوڈس خود کو نئے پرائمری کے اسٹینڈ بائی کے طور پر دوبارہ ترتیب دیتے ہیں - یہ سب خود بخود، عام طور پر 10-30 سیکنڈ کے اندر۔

پیٹرونی HA آرکیٹیکچر - 3-نوڈ PostgreSQL کلسٹرایپلیکیشن کلائنٹسHAProxy لوڈ بیلنسرپورٹ 5000 (RW) · پورٹ 5001 (RO)پرائمری (لیڈر)PostgreSQL 16 + Patroninode1 — 10.0.1.10:5432اسٹینڈ بائی 1 (Sync)PostgreSQL 16 + Patroninode2 — 10.0.1.11:5432اسٹینڈ بائی 2 (Async)PostgreSQL 16 + Patroninode3 — 10.0.1.12:5432سنک سٹریمنگasync سٹریمنگetcd کلسٹر (DCS)3 نوڈس — لیڈر الیکشن اور amp; ترتیب اسٹورپرائمریاسٹینڈ بائیetcd DCSHAProxy

پیٹرونی YAML کنفیگریشن

Patroni کو ایک YAML فائل کے ذریعے ترتیب دیا گیا ہے جو DCS کنکشن، PostgreSQL پیرامیٹرز، نقل کے رویے، اور بوٹسٹریپ کی ترتیبات کی وضاحت کرتی ہے۔ پرائمری نوڈ کے لیے مندرجہ ذیل پروڈکشن گریڈ کنفیگریشن ہے۔

# /etc/patroni/patroni.yml — Node 1 (Primary)
scope: pg-ha-cluster
namespace: /postgresql-ha/
name: node1

restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.0.1.10:8008

etcd3:
  hosts:
    - 10.0.2.10:2379
    - 10.0.2.11:2379
    - 10.0.2.12:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576  # 1MB — only promote standbys within this lag
    synchronous_mode: true
    synchronous_mode_strict: false
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        wal_level: replica
        hot_standby: 'on'
        max_connections: 200
        max_wal_senders: 10
        max_replication_slots: 10
        wal_keep_size: 2GB
        synchronous_commit: 'on'
        archive_mode: 'on'
        archive_command: 'test ! -f /archive/%f && cp %p /archive/%f'
        archive_timeout: 60
        wal_log_hints: 'on'
        shared_preload_libraries: 'pg_stat_statements'
        track_commit_timestamp: 'on'
      pg_hba:
        - host replication replicator 10.0.0.0/16 scram-sha-256
        - host all all 10.0.0.0/16 scram-sha-256
        - host all all 0.0.0.0/0 scram-sha-256

  initdb:
    - encoding: UTF8
    - data-checksums

  users:
    admin:
      password: 'admin_secure_password'
      options:
        - createrole
        - createdb
    replicator:
      password: 'repl_secure_password'
      options:
        - replication

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 10.0.1.10:5432
  data_dir: /var/lib/postgresql/16/main
  bin_dir: /usr/lib/postgresql/16/bin
  config_dir: /var/lib/postgresql/16/main
  pgpass: /tmp/pgpass0
  authentication:
    superuser:
      username: postgres
      password: 'postgres_secure_password'
    replication:
      username: replicator
      password: 'repl_secure_password'
    rewind:
      username: postgres
      password: 'postgres_secure_password'
  parameters:
    unix_socket_directories: '/var/run/postgresql'
  create_replica_methods:
    - basebackup
  basebackup:
    max-rate: 100M
    checkpoint: fast

tags:
  nofailover: false
  noloadbalance: false
  clonefrom: false
  nosync: false

اسٹینڈ بائی نوڈس اپنیname،connect_address، اورlistenاقدار کے ساتھ ایک جیسی ترتیب کا استعمال کرتے ہیں۔ Patroni باقی کو سنبھالتا ہے - یہ پتہ لگاتا ہے کہ آیا نوڈ لیڈر ہونا چاہئے یا DCS ریاست پر مبنی ایک نقل اور اس کے مطابق PostgreSQL کو ترتیب دیتا ہے۔

etcd بطور تقسیم شدہ کنفیگریشن اسٹور

etcd پیٹرونی کلسٹر کا اعصابی نظام ہے۔ یہ موجودہ لیڈر کی شناخت، کلسٹر ٹوپولوجی، مطلوبہ ترتیب، اور ہر نوڈ کی صحت کی حیثیت کو محفوظ کرتا ہے۔ تین نوڈ وغیرہ کا کلسٹر پیداوار کے لیے کم از کم ہے، کورم کو برقرار رکھتے ہوئے ایک نوڈ کی ناکامی کو برداشت کرتا ہے۔

# Install and configure etcd on three dedicated nodes
# /etc/etcd/etcd.conf.yml — Node etcd1 (10.0.2.10)
name: etcd1
data-dir: /var/lib/etcd
listen-client-urls: http://0.0.0.0:2379
listen-peer-urls: http://0.0.0.0:2380
advertise-client-urls: http://10.0.2.10:2379
initial-advertise-peer-urls: http://10.0.2.10:2380
initial-cluster: etcd1=http://10.0.2.10:2380,etcd2=http://10.0.2.11:2380,etcd3=http://10.0.2.12:2380
initial-cluster-state: new
initial-cluster-token: patroni-etcd-cluster

# Start etcd
systemctl enable --now etcd

# Verify cluster health
etcdctl endpoint health --cluster \
  --endpoints=http://10.0.2.10:2379,http://10.0.2.11:2379,http://10.0.2.12:2379

پروڈکشن کی تعیناتی کے لیے، etcd ساتھیوں کے درمیان اور etcd اور Patroni کلائنٹس کے درمیان TLS کو فعال کریں۔ غیر خفیہ کردہ etcd ٹریفک کلسٹر اسناد اور کنفیگریشن کو نیٹ ورک کی سطح کے حملہ آوروں کے سامنے لاتا ہے۔

HAProxy برائے کنکشن روٹنگ

Patroni ہر نوڈ (پورٹ 8008 بذریعہ ڈیفالٹ) پر ایک REST API کو ظاہر کرتا ہے جو یہ بتاتا ہے کہ آیا نوڈ موجودہ لیڈر ہے یا ایک نقل۔ HAProxy ان ہیلتھ چیک اینڈ پوائنٹس کو ٹریفک کو روٹ کرنے کے لیے استعمال کرتا ہے: لکھتا ہے لیڈر کو جاتا ہے، پڑھتا ہے صحت مند نقلوں پر جاتا ہے۔ یہ آپ کو بغیر کسی ایپلیکیشن کی سطح کی تبدیلیوں کے خودکار پڑھنے لکھنے کی تقسیم فراہم کرتا ہے۔

# /etc/haproxy/haproxy.cfg
global
    maxconn 2000
    log /dev/log local0
    stats socket /var/run/haproxy.sock mode 660 level admin

defaults
    mode tcp
    log global
    retries 3
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s
    maxconn 1000

listen pg_write
    bind *:5000
    option httpchk GET /primary
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server node1 10.0.1.10:5432 check port 8008
    server node2 10.0.1.11:5432 check port 8008
    server node3 10.0.1.12:5432 check port 8008

listen pg_read
    bind *:5001
    balance roundrobin
    option httpchk GET /replica
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server node1 10.0.1.10:5432 check port 8008
    server node2 10.0.1.11:5432 check port 8008
    server node3 10.0.1.12:5432 check port 8008

listen stats
    bind *:7000
    mode http
    stats enable
    stats uri /
    stats refresh 10s

/primaryاینڈ پوائنٹ صرف موجودہ پیٹرونی لیڈر پر HTTP 200 واپس کرتا ہے۔/replicaاینڈ پوائنٹ صحت مند اسٹینڈ بائی پر 200 واپس کرتا ہے۔ فیل اوور ہونے پر، نیا پرائمری/primaryپر 200 واپس آنا شروع کر دیتا ہے، اور HAProxy خود بخود تحریری ٹریفک کو ری ڈائریکٹ کرتا ہے — عام طور پر ایک ہی ہیلتھ چیک وقفہ (3 سیکنڈ) کے اندر۔on-marked-down shutdown-sessionsہدایت ایک ناکام پرائمری سے موجودہ کنکشن کو فوری طور پر ختم کر دیتی ہے، جو کلائنٹس کو نئے لیڈر سے دوبارہ جڑنے پر مجبور کرتی ہے۔

PgBouncer برائے کنکشن پولنگ

PostgreSQL ہر کلائنٹ کنکشن کے لیے ایک نیا بیک اینڈ پروسیس بناتا ہے۔ پیمانے پر - سیکڑوں یا ہزاروں مائیکرو سروسز ہر ایک کنکشن پول کو برقرار رکھتی ہے - عمل کی تخلیق اور میموری کی کھپت کا اوور ہیڈ اہم ہو جاتا ہے۔ PgBouncer ایپلی کیشن اور PostgreSQL کے درمیان بیٹھتا ہے، سرور سائیڈ کنکشنز اور ان پر ملٹی پلیکسنگ کلائنٹ کنکشن کا ایک تالاب برقرار رکھتا ہے۔

# /etc/pgbouncer/pgbouncer.ini
[databases]
* = host=127.0.0.1 port=5432 dbname=appdb

[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt

pool_mode = transaction
max_client_conn = 1000
default_pool_size = 50
min_pool_size = 10
reserve_pool_size = 10
reserve_pool_timeout = 3
server_lifetime = 3600
server_idle_timeout = 600
server_connect_timeout = 5
server_login_retry = 3

log_connections = 1
log_disconnections = 1
stats_period = 60

جب Patroni کے ساتھ استعمال ہوتا ہے، PgBouncer عام طور پر ہر PostgreSQL نوڈ یا HAProxy نوڈس پر شریک ہوتا ہے۔transactionپول موڈ زیادہ تر کام کے بوجھ کے لیے بہترین انتخاب ہے — یہ ٹرانزیکشن کی مدت کے لیے سرور کنکشن تفویض کرتا ہے اور اسے لین دین کے درمیان پول میں واپس کر دیتا ہے۔ یہsessionموڈ سے کہیں زیادہ موثر ہے، جو کلائنٹ کے پورے سیشن کے لیے ایک کنکشن رکھتا ہے۔

وال آرکائیونگ اور پوائنٹ ان ٹائم ریکوری

سٹریمنگ ریپلیکیشن سرور کی ناکامی سے تحفظ فراہم کرتی ہے، لیکن یہ منطقی غلطیوں سے تحفظ نہیں دیتی — ایک حادثاتیDROP TABLEیا خراب ایپلیکیشن کی منتقلی کو فوری طور پر تمام اسٹینڈ بائیز پر نقل کیا جاتا ہے۔ پوائنٹ ان ٹائم ریکوری (PITR) کے ساتھ مل کر WAL آرکائیونگ آپ کو غلطی کے پیش آنے سے پہلے کسی بھی لمحے بحال کرنے دیتی ہے۔

WAL آرکائیونگ کاپیوں نے WAL سیگمنٹس کو ایک پائیدار آرکائیو میں مکمل کیا — عام طور پر ایک S3 بالٹی، ایک NFS ماؤنٹ، یا ایک وقف شدہ بیک اپ سرور۔pgBackRestاورWAL-Gجیسے ٹولز کمپریشن، انکرپشن اور متوازی منتقلی کے ساتھ آرکائیونگ کو موثر طریقے سے ہینڈل کرتے ہیں۔

# pgBackRest configuration — /etc/pgbackrest/pgbackrest.conf
[global]
repo1-type=s3
repo1-s3-bucket=pg-wal-archive
repo1-s3-endpoint=s3.eu-west-1.amazonaws.com
repo1-s3-region=eu-west-1
repo1-s3-key=AKIAIOSFODNN7EXAMPLE
repo1-s3-key-secret=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
repo1-path=/pgbackrest
repo1-retention-full=4
repo1-retention-diff=7
repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=strong_encryption_passphrase
compress-type=zst
compress-level=3
process-max=4

[pg-ha-cluster]
pg1-path=/var/lib/postgresql/16/main
pg1-port=5432

# In postgresql.conf
archive_command = 'pgbackrest --stanza=pg-ha-cluster archive-push %p'
restore_command = 'pgbackrest --stanza=pg-ha-cluster archive-get %f "%p"'

پوائنٹ ان ٹائم ریکوری کرنے کے لیے، ٹارگٹ ٹائم اسٹیمپ کی وضاحت کریں۔

# Restore to a specific point in time
pgbackrest --stanza=pg-ha-cluster --type=time \
  --target="2026-04-12 11:25:00" \
  --target-action=promote \
  restore
منتخب ڈیٹا کی مطابقت پذیریکے لیے

منطقی نقل

جب کہ سٹریمنگ ریپلیکیشن پورے ڈیٹا بیس کلسٹر کی ایک درست فزیکل کاپی بناتی ہے، منطقی نقل ٹیبل کی سطح پر کام کرتی ہے، انفرادی ٹیبلز یا ڈیٹا کے ذیلی سیٹوں کو آزاد PostgreSQL مثالوں کے درمیان نقل کرتی ہے۔ یہ صفر-ڈاؤن ٹائم بڑے ورژن اپ گریڈ، کراس ریجن ریڈ ریپلیکس کے لیے مفید ہے جن کو صرف مخصوص ٹیبلز، ڈیٹا گودام فیڈنگ، اور کثیر کرایہ دار ڈیٹا کی تقسیم کی ضرورت ہوتی ہے۔

# On the publisher (source database)
wal_level = logical  # must be 'logical' — higher than 'replica'

CREATE PUBLICATION app_pub FOR TABLE orders, customers, products;

# On the subscriber (target database)
CREATE SUBSCRIPTION app_sub
  CONNECTION 'host=publisher-host port=5432 dbname=appdb user=replicator password=pass'
  PUBLICATION app_pub;

منطقی نقل سٹریمنگ نقل کے ساتھ چل سکتی ہے۔ ایک عام نمونہ یہ ہے کہ HA (تیز فزیکل فیل اوور) کے لیے اسٹریمنگ ریپلیکیشن اور کراس ریجن اینالیٹکس ریپلیکس کے لیے منطقی نقل کا استعمال کیا جائے جس کے لیے صرف ٹیبلز کے سب سیٹ کی ضرورت ہوتی ہے۔

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

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

ملٹی ریجن PostgreSQL سٹریمنگ ریپلیکیشنریجن 1 — AWS eu-west-1پرائمریpg-node1 (RW)Sync سٹینڈ بائیpg-node2 (RO)مطابقت پذیریHAProxy (مقامی)ریجن 2 — Azure ویسٹیورپAsync اسٹینڈ بائیpg-node3 (RO)Async اسٹینڈ بائیpg-node4 (RO)مطابقت پذیریHAProxy (مقامی)ریجن 3 — GCP europe-west1Async اسٹینڈ بائیpg-node5 (RO)Async اسٹینڈ بائیpg-node6 (RO)مطابقت پذیریHAProxy (مقامی)async WALasync WAL شپنگمشترکہ وال آرکائیو (S3 / Blob / GCS)pgBackRest یا WAL-G — کراس ریجن PITRگلوبل DNS (Route53 / ٹریفک مینیجر / کلاؤڈ DNS)لیجنڈ:مطابقت پذیری کی نقل (علاقے کے اندر)Async نقل (کراس ریجن)WAL کو آبجیکٹ اسٹوریجمیں آرکائیو کرناپرائمریاسٹینڈ بائی

فیل اوور اور سوئچ اوور کے طریقہ کار

فیل اوور اور سوئچ اوور کے درمیان فرق کو سمجھنا بہت ضروری ہے۔ ایکفیل اوورایک غیر منصوبہ بند پروموشن ہے جو موجودہ پرائمری کی ناکامی سے شروع ہوتا ہے۔ ایکسوئچ اوورایک منصوبہ بند، شاندار کردار کی تبدیلی ہے — جو عام طور پر دیکھ بھال سے پہلے انجام دی جاتی ہے۔ پیٹرونی دونوں کی حمایت کرتا ہے۔

منصوبہ بند سوئچ اوور

# List cluster members
patronictlctl -c /etc/patroni/patroni.yml list

# Perform switchover to a specific node
patronictlctl -c /etc/patroni/patroni.yml switchover \
  --master node1 --candidate node2 --force

# Or use the Patroni REST API
curl -s http://10.0.1.10:8008/switchover -XPOST \
  -d '{"leader": "node1", "candidate": "node2"}'

سوئچ اوور کے دوران، پیٹرونی موجودہ پرائمری کو اسٹینڈ بائی میں گھٹا دیتا ہے، ہدف والے امیدوار کو فروغ دیتا ہے، اور نئے پرائمری کی پیروی کرنے کے لیے دیگر تمام اسٹینڈ بائیز کو دوبارہ ترتیب دیتا ہے۔ اس عمل میں 5-15 سیکنڈ لگتے ہیں۔ HAProxy صحت کی جانچ کے ذریعے تبدیلی کا پتہ لگاتا ہے اور ٹریفک کو خود بخود ری ڈائریکٹ کرتا ہے۔

آٹومیٹک فیل اوور تسلسل

جب پرائمری غیر متوقع طور پر ناکام ہو جاتی ہے، Patroni سروس کو بحال کرنے کے لیے ایک درست ترتیب کی پیروی کرتا ہے۔ درج ذیل خاکہ ان اقدامات کی وضاحت کرتا ہے۔

پیٹرونی آٹومیٹک فیل اوور تسلسل1پرائمری ناکامکریش، نیٹ ورک پارٹیشن، یانوڈ1پرڈسک کی ناکامی۔2Patroni DCSکے ذریعے پتہ لگاتا ہے۔لیڈر کلید TTL etcdمیں ختم ہو جاتی ہے۔(پہلے سے طے شدہ 30s TTL)3لیڈر الیکشنحاصل کرنے کے لیےاسٹینڈ بائی ریسلیڈر لاک in etcd4اسٹینڈ بائی پروموٹ شدہفاتح pg_ctlکو فروغ دیتا ہے۔اور نیا بنیادیبن جاتا ہے۔5HAProxy اپڈیٹسہیلتھ چیک نئے پرائمریکا پتہ لگاتے ہیں۔/پرائمری نئے لیڈرپر 200 لوٹاتا ہے۔6کلائنٹس دوبارہ منسلک ہو گئےایپلیکیشنز HAProxyکے ذریعے دوبارہ منسلک ہوتی ہیں۔سے نئے پرائمری شفاف طور پرعام ٹوٹل فیل اوور ٹائمDCS TTL کی میعاد ختم: ~15-30sالیکشن: ~2-5sHAProxy کا پتہ لگانا: ~3-10sکو دوبارہ جوڑیں۔≈ 20-45 سیکنڈ کلفیل اوور کی رفتار کو متاثر کرنے والےکلیدی پیرامیٹرز:• ttl (پہلے سے طے شدہ 30s) — DCSمیں لیڈر کلید کی میعاد ختم ہونے سے کتنا عرصہ پہلے• loop_wait (پہلے سے طے شدہ 10s) — پیٹرونی کتنی بار کلسٹر اسٹیٹ کو چیک کرتا ہے• retry_timeout (پہلے سے طے شدہ 10s) — DCS اور PostgreSQL آپریشنز کے لیے ٹائم آؤٹ• زیادہ سے زیادہ_lag_on_failover (1MB) — صرف اس نقل کے وقفے کے اندر اسٹینڈ بائی کو فروغ دیں

سپلٹ برین پریوینشن

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

  1. DCS پر مبنی لیڈر لاک:صرف ایک نوڈ کسی بھی وقت etcd میں لیڈر کلید کو پکڑ سکتا ہے۔ کلید میں TTL ہے، اور لیڈر کو اسے مسلسل تجدید کرنا چاہیے۔ اگر نیٹ ورک پارٹیشن لیڈر کو etcd سے الگ کر دیتا ہے تو کلید ختم ہو جاتی ہے، اور لیڈر خود کو ڈیمو کر دیتا ہے۔
  2. واچ ڈاگ:پیٹرونی لینکس واچ ڈاگ ڈیوائس (/dev/watchdog) کو ترتیب دے سکتا ہے۔ اگر Patroni DCS تک رسائی کھو دیتا ہے اور اس بات کی تصدیق نہیں کر سکتا کہ اسے لیڈر رہنا چاہیے، تو واچ ڈاگ نوڈ کو دوبارہ شروع کر دے گا یا پاور آف کر دے گا - ایک سخت باڑ لگانے کا طریقہ کار جو اس بات کی ضمانت دیتا ہے کہ پرانی پرائمری تحریروں کو قبول کرنا جاری نہیں رکھے گی۔
  3. pg_rewind:جب کوئی سابقہ پرائمری واپس آن لائن آتا ہے، تو اس میں WAL ریکارڈز ہو سکتے ہیں جو کبھی نقل نہیں کیے گئے تھے۔pg_rewindٹائم لائن کو موڑ کے نقطہ پر ریوائنڈ کرتا ہے، نوڈ کو مکمل بیس بیک اپ کے بغیر اسٹینڈ بائی کے طور پر دوبارہ شامل ہونے کی اجازت دیتا ہے۔ پیٹرونی کیuse_pg_rewind: trueترتیب اسے خودکار بناتی ہے۔
# Enable watchdog in Patroni config
bootstrap:
  dcs:
    postgresql:
      use_pg_rewind: true
      parameters:
        wal_log_hints: 'on'  # required for pg_rewind

# Watchdog configuration
watchdog:
  mode: required        # 'off', 'automatic', or 'required'
  device: /dev/watchdog
  safety_margin: 5      # seconds before TTL expiry to trigger watchdog
پیٹرونیکے متبادل کے طور پر

repmgr

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

# repmgr.conf on the primary
node_id=1
node_name='node1'
conninfo='host=10.0.1.10 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/postgresql/16/main'
failover=automatic
promote_command='repmgr standby promote -f /etc/repmgr.conf --log-to-file'
follow_command='repmgr standby follow -f /etc/repmgr.conf --log-to-file --upstream-node-id=%n'
monitoring_history=yes
monitor_interval_secs=5
reconnect_attempts=6
reconnect_interval=10

نئی تعیناتیوں کے لیے، پیٹرونی اس کی مضبوط تقسیم دماغی روک تھام کی ضمانتوں اور زیادہ فعال ترقیاتی کمیونٹی کی وجہ سے تجویز کردہ انتخاب ہے۔ repmgr آسان سیٹ اپس یا تنظیموں کے لیے ایک معقول آپشن ہے جو پہلے سے ٹول میں سرمایہ کاری کر چکے ہیں۔

کلاؤڈ تعیناتی پیٹرنز

AWS تعیناتی: EC2، EBS، اور Route53

AWS پر، ہر PostgreSQL + پیٹرونی نوڈ کو EBS gp3 یا io2 والیوم کے ساتھ EC2 مثال پر تعینات کریں۔ HA کے لیے متعدد دستیابی زونز میں الگ الگ مثالیں استعمال کریں۔ etcd نوڈس کو AZs تک بھی پھیلانا چاہیے۔

# Terraform sketch for PostgreSQL HA on AWS
resource "aws_instance" "pg_node" {
  count                = 3
  ami                  = "ami-0abcdef1234567890"  # Ubuntu 22.04
  instance_type        = "r6g.2xlarge"             # 8 vCPU, 64GB RAM
  subnet_id            = aws_subnet.private[count.index].id
  vpc_security_group_ids = [aws_security_group.pg_sg.id]
  availability_zone    = element(["eu-west-1a", "eu-west-1b", "eu-west-1c"], count.index)

  root_block_device {
    volume_size = 50
    volume_type = "gp3"
  }

  tags = {
    Name = "pg-node-${count.index + 1}"
    Role = "patroni"
  }
}

resource "aws_ebs_volume" "pg_data" {
  count             = 3
  availability_zone = element(["eu-west-1a", "eu-west-1b", "eu-west-1c"], count.index)
  size              = 500
  type              = "gp3"
  iops              = 6000
  throughput        = 250
  encrypted         = true

  tags = {
    Name = "pg-data-${count.index + 1}"
  }
}

resource "aws_route53_health_check" "pg_primary" {
  count             = 3
  ip_address        = aws_instance.pg_node[count.index].private_ip
  port              = 8008
  type              = "HTTP"
  resource_path     = "/primary"
  failure_threshold = 3
  request_interval  = 10
}
اگر آپ AWS کے زیر انتظام حل کو ترجیح دیتے ہیں تو

HAProxy کے بجائے نیٹ ورک لوڈ بیلنسر (NLB) استعمال کریں۔ NLB موجودہ پرائمری تک ٹریفک کو روٹ کرنے کے لیے Patroni REST API کے خلاف ٹارگٹ گروپ ہیلتھ چیکس کا استعمال کر سکتا ہے۔

Azure تعیناتی: VMs، منظم ڈسکیں، اور Azure LB

Azure پر، ڈیٹا والیومز کے لیے پریمیم SSD مینیجڈ ڈسک کے ساتھ Standard_E8s_v5 VMs (میموری سے بہتر) استعمال کریں۔ دستیابی والے علاقوں میں تعینات کریں۔ Azure لوڈ بیلنسر Patroni REST API کے خلاف صحت کی تحقیقات کے ساتھ HAProxy کے برابر فراہم کرتا ہے۔

# Azure CLI — create PostgreSQL VM with Managed Disk
az vm create \
  --resource-group pg-ha-rg \
  --name pg-node-1 \
  --image Canonical:0001-com-ubuntu-server-jammy:22_04-lts:latest \
  --size Standard_E8s_v5 \
  --zone 1 \
  --vnet-name pg-vnet \
  --subnet pg-subnet \
  --nsg pg-nsg \
  --admin-username pgadmin \
  --ssh-key-value ~/.ssh/id_rsa.pub

az disk create \
  --resource-group pg-ha-rg \
  --name pg-data-1 \
  --size-gb 512 \
  --sku Premium_LRS \
  --zone 1

az vm disk attach \
  --resource-group pg-ha-rg \
  --vm-name pg-node-1 \
  --name pg-data-1

# Azure Load Balancer health probe for Patroni
az network lb probe create \
  --resource-group pg-ha-rg \
  --lb-name pg-lb \
  --name patroni-primary-probe \
  --protocol Http \
  --port 8008 \
  --path /primary \
  --interval 5 \
  --threshold 3

GCP تعیناتی: کمپیوٹ انجن اور کلاؤڈ لوڈ بیلنسنگ

GCP پر، SSD پرسسٹنٹ ڈسک کے ساتھ n2-highmem-8 مثالیں (8 vCPU، 64GB RAM) استعمال کریں۔ ایک علاقے کے اندر زونز میں تقسیم کریں۔ پیٹرونی ہیلتھ چیکس کے ساتھ اندرونی TCP/UDP لوڈ بیلنس استعمال کریں۔

# GCP — create instance and persistent disk
gcloud compute instances create pg-node-1 \
  --zone=europe-west1-b \
  --machine-type=n2-highmem-8 \
  --image-family=ubuntu-2204-lts \
  --image-project=ubuntu-os-cloud \
  --boot-disk-size=50GB \
  --network=pg-network \
  --subnet=pg-subnet

gcloud compute disks create pg-data-1 \
  --zone=europe-west1-b \
  --size=500GB \
  --type=pd-ssd

gcloud compute instances attach-disk pg-node-1 \
  --disk=pg-data-1 \
  --zone=europe-west1-b

# Health check for Patroni primary endpoint
gcloud compute health-checks create http patroni-primary-check \
  --port=8008 \
  --request-path=/primary \
  --check-interval=5s \
  --timeout=5s \
  --unhealthy-threshold=3 \
  --healthy-threshold=2
رینچر اور لانگ ہارنکے ساتھ

ننگی دھاتی k3s تعیناتی

ان تنظیموں کے لیے جو اپنا ہارڈویئر چلاتی ہیں، PostgreSQL HA کو k3s، Rancher، اور Longhorn کے ساتھ ننگی دھات پر تعینات کرنا ایک مکمل طور پر اوپن سورس، کلاؤڈ سے آزاد انفراسٹرکچر فراہم کرتا ہے۔ k3s ایک ہلکا پھلکا Kubernetes ڈسٹری بیوشن ہے جو مکمل Kubernetes ڈسٹری بیوشن کے اوور ہیڈ کے بغیر ننگے میٹل سرورز پر موثر انداز میں چلتا ہے۔

ننگی دھات k3s HA — PostgreSQL پیٹرونیکے ساتھورچوئل IP (Keepalived VRRP) — 10.0.0.100فلوٹنگ VIP برائے HAProxy ایکٹیو/سٹینڈ بائیHAProxy (فعال)bare-metal-lb1HAProxy (اسٹینڈ بائی)bare-metal-lb2k3s کلسٹر (رینچر کے زیر انتظام)k3s نوڈ 1 (سرور)PostgreSQL پرائمریPatroni + PgBouncerلانگ ہارن والیوم (500GB)NVMe SSD — bare-metal-srv1k3s نوڈ 2 (سرور)PostgreSQL اسٹینڈ بائی 1Patroni + PgBouncerلانگ ہارن والیوم (500GB)NVMe SSD — bare-metal-srv2k3s نوڈ 3 (سرور)PostgreSQL اسٹینڈ بائی 2Patroni + PgBouncerلانگ ہارن والیوم (500GB)NVMe SSD — bare-metal-srv3External etcd کلسٹر (3 سرشار نوڈس)etcd1 (10.0.3.10) · etcd2 (10.0.3.11) · etcd3 (10.0.3.12)رینچر مینجمنٹUI + کلسٹر لائف سائیکلپرائمریاسٹینڈ بائیetcdلانگ ہارنHAProxyسٹریمنگ کی نقل ڈیشڈ سبز تیروں کے بطور دکھائی گئی ہے

k3s اور Longhorn سیٹ اپ

# Install k3s on the first server node
curl -sfL https://get.k3s.io | K3S_TOKEN=my-cluster-token \
  INSTALL_K3S_EXEC="server --cluster-init --disable traefik --disable servicelb" sh -

# Join additional server nodes
curl -sfL https://get.k3s.io | K3S_TOKEN=my-cluster-token \
  K3S_URL=https://10.0.0.1:6443 \
  INSTALL_K3S_EXEC="server" sh -

# Install Longhorn for distributed block storage
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system --create-namespace \
  --set defaultSettings.defaultDataPath=/mnt/longhorn \
  --set defaultSettings.replicaCount=3 \
  --set defaultSettings.storageMinimalAvailablePercentage=15

# Deploy PostgreSQL with Patroni using the Zalando Postgres Operator
helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm install postgres-operator postgres-operator-charts/postgres-operator \
  --namespace postgres-system --create-namespace
# PostgreSQL cluster manifest for the Zalando Postgres Operator
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  name: pg-ha-cluster
  namespace: production
spec:
  teamId: "platform"
  numberOfInstances: 3
  volume:
    size: 500Gi
    storageClass: longhorn
  users:
    appuser:
      - superuser
      - createdb
    replicator: []
  databases:
    appdb: appuser
  postgresql:
    version: "16"
    parameters:
      shared_buffers: "16GB"
      effective_cache_size: "48GB"
      work_mem: "256MB"
      maintenance_work_mem: "2GB"
      max_connections: "200"
      max_wal_senders: "10"
      wal_level: replica
      synchronous_commit: "on"
      wal_keep_size: "2GB"
      archive_mode: "on"
      track_commit_timestamp: "on"
  patroni:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: true
  resources:
    requests:
      cpu: "4"
      memory: 32Gi
    limits:
      cpu: "8"
      memory: 64Gi

HAProxy VIP

کے لیے زندہ رکھا
# /etc/keepalived/keepalived.conf on lb1
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}

vrrp_instance VI_PG {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass pgha_vip_pass
    }
    virtual_ipaddress {
        10.0.0.100/24
    }
    track_script {
        chk_haproxy
    }
}

مانیٹرنگ PostgreSQL نقل

مانیٹرنگ ریپلیکیشن ہیلتھ پروڈکشن میں غیر گفت و شنید ہے۔ PostgreSQL اس مقصد کے لیے کئی بلٹ ان ویوز فراہم کرتا ہے، اور Grafana کے ساتھ Prometheus آپ کو درکار طویل مدتی مرئیت اور الرٹ فراہم کرتا ہے۔

بلٹ ان مانیٹرنگ سوالات

-- Check replication status on the primary
SELECT
    client_addr,
    application_name,
    state,
    sync_state,
    sent_lsn,
    write_lsn,
    flush_lsn,
    replay_lsn,
    (sent_lsn - replay_lsn) AS replication_lag_bytes,
    write_lag,
    flush_lag,
    replay_lag
FROM pg_stat_replication;

-- Check replication slot status
SELECT
    slot_name,
    slot_type,
    active,
    wal_status,
    pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS slot_lag
FROM pg_replication_slots;

-- Check standby recovery status (run on standby)
SELECT
    pg_is_in_recovery() AS is_standby,
    pg_last_wal_receive_lsn() AS last_received,
    pg_last_wal_replay_lsn() AS last_replayed,
    pg_last_xact_replay_timestamp() AS last_replayed_timestamp,
    EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::int AS replay_lag_seconds;

-- Monitor WAL generation rate
SELECT
    pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0')) AS total_wal_generated,
    pg_size_pretty(sum(size)) AS wal_directory_size
FROM pg_ls_waldir();

-- Check for long-running queries that could block replication
SELECT
    pid,
    now() - pg_stat_activity.query_start AS duration,
    query,
    state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes'
  AND state != 'idle'
ORDER BY duration DESC;

Prometheus اور Grafana اسٹیک

postgres_exporterPrometheus فارمیٹ میں PostgreSQL میٹرکس کو ظاہر کرتا ہے۔patroni_exporterکے ساتھ مل کر، آپ کو ڈیٹا بیس کی کارکردگی اور HA کلسٹر حالت دونوں میں مکمل مرئیت ملتی ہے۔

# Deploy postgres_exporter as a sidecar or standalone
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# Custom queries for postgres_exporter
# /etc/postgres_exporter/queries.yaml
pg_replication_lag:
  query: |
    SELECT
      CASE WHEN pg_is_in_recovery() THEN
        EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::float
      ELSE 0 END AS lag_seconds
  master: true
  metrics:
    - lag_seconds:
        usage: "GAUGE"
        description: "Replication lag in seconds"

pg_replication_slots:
  query: |
    SELECT
      slot_name,
      active::int AS active,
      pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)::float AS slot_lag_bytes
    FROM pg_replication_slots
  master: true
  metrics:
    - slot_name:
        usage: "LABEL"
    - active:
        usage: "GAUGE"
        description: "Whether the slot is active"
    - slot_lag_bytes:
        usage: "GAUGE"
        description: "Slot lag in bytes"
# PrometheusRule for PostgreSQL HA alerts
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: postgresql-ha-alerts
  namespace: monitoring
spec:
  groups:
    - name: postgresql-replication
      rules:
        - alert: PostgreSQLReplicationLagHigh
          expr: pg_replication_lag_seconds > 30
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "PostgreSQL replication lag exceeds 30s on {{ $labels.instance }}"

        - alert: PostgreSQLReplicationSlotInactive
          expr: pg_replication_slots_active == 0
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "Replication slot {{ $labels.slot_name }} is inactive"

        - alert: PostgreSQLReplicationSlotLagHigh
          expr: pg_replication_slots_slot_lag_bytes > 1073741824
          for: 10m
          labels:
            severity: warning
          annotations:
            summary: "Replication slot lag exceeds 1GB on {{ $labels.slot_name }}"

        - alert: PatroniClusterUnhealthy
          expr: patroni_cluster_members_count < 3
          for: 2m
          labels:
            severity: critical
          annotations:
            summary: "Patroni cluster has fewer than 3 members"

پروڈکشن ٹیوننگ پیرامیٹرز

PostgreSQL کی ڈیفالٹ کنفیگریشن قدامت پسند ہے، ایک چھوٹے مشترکہ ہوسٹنگ ماحول کے لیے بنائی گئی ہے۔ پروڈکشن HA کلسٹرز کو نقل، میموری، اور WAL پیرامیٹرز کی محتاط ٹیوننگ کی ضرورت ہوتی ہے۔ مندرجہ ذیل جدول NVMe سٹوریج کے ساتھ 64GB RAM سرور کے لیے انتہائی اہم ترتیبات کا خلاصہ کرتا ہے۔

# postgresql.conf — Production HA tuning

# === Replication ===
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
wal_keep_size = 4GB
synchronous_commit = on
synchronous_standby_names = 'ANY 1 (standby1, standby2)'
track_commit_timestamp = on
wal_log_hints = on

# === WAL ===
min_wal_size = 1GB
max_wal_size = 8GB
wal_buffers = 64MB
wal_compression = zstd
archive_mode = on
archive_timeout = 300
checkpoint_completion_target = 0.9
checkpoint_timeout = 15min

# === Memory ===
shared_buffers = 16GB              # 25% of RAM
effective_cache_size = 48GB        # 75% of RAM
work_mem = 256MB                   # per-operation sort/hash memory
maintenance_work_mem = 2GB         # for VACUUM, CREATE INDEX
huge_pages = try

# === Connections ===
max_connections = 200              # use PgBouncer for higher client counts
superuser_reserved_connections = 5

# === Query Performance ===
random_page_cost = 1.1             # SSD storage
effective_io_concurrency = 200     # NVMe SSD
default_statistics_target = 500
jit = on

# === Logging ===
log_min_duration_statement = 500   # log queries > 500ms
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
log_autovacuum_min_duration = 0

# === Autovacuum ===
autovacuum_max_workers = 4
autovacuum_naptime = 30s
autovacuum_vacuum_cost_limit = 2000
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02

ٹیوننگ پیٹرونی DCS پیرامیٹرز

پیٹرونی کےttl،loop_wait، اورretry_timeoutپیرامیٹرز کے درمیان تعلق براہ راست فیل اوور کی رفتار اور غلط مثبت خطرے کو متاثر کرتا ہے۔ مختصر ٹی ٹی ایل کا مطلب ہے تیزی سے فیل اوور کا پتہ لگانا لیکن مختصر نیٹ ورک بلپس کے دوران غیر ضروری فیل اوور کا خطرہ بڑھاتا ہے۔

# Conservative (production default)
ttl: 30
loop_wait: 10
retry_timeout: 10
# Failover detection: ~30-40 seconds

# Aggressive (low-latency failover)
ttl: 15
loop_wait: 5
retry_timeout: 5
# Failover detection: ~15-20 seconds
# Warning: Higher risk of false failovers in unstable networks

Chaos انجینئرنگ اور فیل اوور ٹیسٹنگ

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

فیل اوور ٹیسٹ پلے بک

# 1. Verify cluster health before testing
patronictlctl -c /etc/patroni/patroni.yml list
+----------+---------+---------+----+-----------+
| Member   | Host    | Role    | TL | Lag in MB |
+----------+---------+---------+----+-----------+
| node1    | 10.0.1.10| Leader |  5 |           |
| node2    | 10.0.1.11| Replica |  5 |         0 |
| node3    | 10.0.1.12| Replica |  5 |         0 |
+----------+---------+---------+----+-----------+

# 2. Simulate primary crash (on node1)
sudo systemctl stop patroni
# Or more aggressive: sudo kill -9 $(pgrep -f patroni)

# 3. Monitor failover (from any node with patronictl)
watch -n 1 'patronictl -c /etc/patroni/patroni.yml list'

# 4. Verify new leader is elected (within 30-45 seconds)
# Expected: node2 or node3 promoted to Leader

# 5. Test write availability through HAProxy
PGPASSWORD=app_password psql -h haproxy-host -p 5000 -U appuser -d appdb \
  -c "INSERT INTO health_check (ts) VALUES (now()) RETURNING *;"

# 6. Restart the former primary
sudo systemctl start patroni
# Patroni will use pg_rewind to rejoin as a replica

# 7. Verify the former primary rejoins as replica
patronictlctl -c /etc/patroni/patroni.yml list

نیٹ ورک پارٹیشن ٹیسٹنگ

# Simulate network partition on the primary using iptables
# Block all traffic to etcd from the primary
sudo iptables -A OUTPUT -d 10.0.2.10 -j DROP
sudo iptables -A OUTPUT -d 10.0.2.11 -j DROP
sudo iptables -A OUTPUT -d 10.0.2.12 -j DROP

# Expected behaviour:
# 1. Primary loses DCS access
# 2. Leader key TTL expires
# 3. Primary demotes itself (with watchdog, node may reboot)
# 4. Standby acquires leader lock and promotes
# 5. After clearing iptables rules, former primary rejoins as replica

# Clean up
sudo iptables -D OUTPUT -d 10.0.2.10 -j DROP
sudo iptables -D OUTPUT -d 10.0.2.11 -j DROP
sudo iptables -D OUTPUT -d 10.0.2.12 -j DROP
Toxiproxyکے ساتھ

خودکار افراتفری کی جانچ
# Run Toxiproxy alongside your Patroni cluster
# Create proxies for etcd and replication connections
toxiproxy-cli create etcd_proxy -l 0.0.0.0:12379 -u 10.0.2.10:2379
toxiproxy-cli create pg_repl_proxy -l 0.0.0.0:15432 -u 10.0.1.10:5432

# Add latency to etcd connections (simulates degraded network)
toxiproxy-cli toxic add etcd_proxy -t latency -a latency=500 -a jitter=200

# Add bandwidth limit to replication (simulates WAN replication)
toxiproxy-cli toxic add pg_repl_proxy -t bandwidth -a rate=1024

# Completely sever the connection (simulates network partition)
toxiproxy-cli toxic add etcd_proxy -t timeout -a timeout=0

# Monitor Patroni behaviour and verify correct failover
watch -n 2 'curl -s http://10.0.1.10:8008/patroni | python3 -m json.tool'

مسلسل توثیق کا اسکرپٹ

#!/bin/bash
# continuous_ha_check.sh — Run during chaos tests to measure availability

HAPROXY_HOST="10.0.0.100"
WRITE_PORT=5000
READ_PORT=5001
DATABASE="appdb"
USER="appuser"
LOGFILE="/var/log/ha_test_$(date +%Y%m%d_%H%M%S).log"

write_count=0
write_fail=0
read_count=0
read_fail=0

while true; do
    ts=$(date '+%Y-%m-%d %H:%M:%S.%3N')

    # Test write path
    if PGPASSWORD=app_password psql -h $HAPROXY_HOST -p $WRITE_PORT \
       -U $USER -d $DATABASE -c "SELECT 1" &>/dev/null; then
        ((write_count++))
    else
        ((write_fail++))
        echo "$ts WRITE_FAIL total_fails=$write_fail" >> $LOGFILE
    fi

    # Test read path
    if PGPASSWORD=app_password psql -h $HAPROXY_HOST -p $READ_PORT \
       -U $USER -d $DATABASE -c "SELECT 1" &>/dev/null; then
        ((read_count++))
    else
        ((read_fail++))
        echo "$ts READ_FAIL total_fails=$read_fail" >> $LOGFILE
    fi

    total=$((write_count + write_fail))
    if (( total % 100 == 0 )); then
        write_avail=$(echo "scale=2; $write_count * 100 / $total" | bc)
        read_total=$((read_count + read_fail))
        read_avail=$(echo "scale=2; $read_count * 100 / $read_total" | bc)
        echo "$ts Writes: ${write_avail}% ($write_count/$total) Reads: ${read_avail}% ($read_count/$read_total)"
    fi

    sleep 0.5
done

ایڈوانسڈ: کاسکیڈنگ ریپلیکیشن اور تاخیر سے اسٹینڈ بائیز

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

# postgresql.auto.conf on a cascading standby
primary_conninfo = 'host=standby1-host port=5432 user=replicator application_name=cascade1'
primary_slot_name = 'cascade1_slot'

Aتاخیری اسٹینڈ بائیجان بوجھ کر WAL ریکارڈز کو وقت کی تاخیر کے ساتھ لاگو کرتا ہے — عام طور پر 1-4 گھنٹے۔ یہ منطقی غلطیوں (حادثاتی طور پر حذف، خراب منتقلی) کے خلاف دفاع فراہم کرتا ہے جو فوری طور پر ہم وقت ساز اسٹینڈ بائیز میں نقل کی جاتی ہیں۔ اگر کوئی آفت آتی ہے، تو آپ تاخیر سے ہونے والے اسٹینڈ بائی پر WAL ری پلے کو روک سکتے ہیں اور خرابی سے پہلے ڈیٹا کو بازیافت کر سکتے ہیں۔

# postgresql.conf on delayed standby
recovery_min_apply_delay = '1h'

کنکشن سٹرنگ کی حکمت عملی

پیٹرونی کے زیر انتظام کلسٹر سے منسلک ہونے والی

ایپلیکیشنز کو ہمیشہ HAProxy کے ذریعے جڑنا چاہیے یاtarget_session_attrsکے ساتھ PostgreSQL کی بلٹ ان ملٹی ہوسٹ کنکشن سٹرنگ کا استعمال کرنا چاہیے۔ یہ لوڈ بیلنسر پر انحصار کیے بغیر کلائنٹ سائیڈ فیل اوور فراہم کرتا ہے۔

# Multi-host connection string with target_session_attrs
# The client tries each host in order and connects to the one matching the target attribute
postgresql://appuser:password@node1:5432,node2:5432,node3:5432/appdb?target_session_attrs=read-write&sslmode=require

# For read-only connections
postgresql://appuser:password@node1:5432,node2:5432,node3:5432/appdb?target_session_attrs=prefer-standby&sslmode=require

یہ طریقہ ان ایپلی کیشنز کے لیے اچھی طرح کام کرتا ہے جنہیں HAProxy VIP کی طرف اشارہ کرنے کے لیے آسانی سے دوبارہ تشکیل نہیں دیا جا سکتا۔ PostgreSQL کلائنٹ لائبریری (libpq) فیل اوور کو شفاف طریقے سے ہینڈل کرتی ہے۔

سیکیورٹی سخت

ایک پروڈکشن PostgreSQL HA کلسٹر کو ٹرانزٹ اور آرام میں خفیہ کاری کو نافذ کرنا چاہیے، مضبوط تصدیق کا استعمال کریں، اور نیٹ ورک کی نمائش کو محدود کریں۔

# Enable TLS in postgresql.conf
ssl = on
ssl_cert_file = '/etc/postgresql/certs/server.crt'
ssl_key_file = '/etc/postgresql/certs/server.key'
ssl_ca_file = '/etc/postgresql/certs/ca.crt'
ssl_min_protocol_version = 'TLSv1.3'

# Require TLS for all connections in pg_hba.conf
hostssl replication replicator 10.0.0.0/16 scram-sha-256
hostssl all         all        10.0.0.0/16 scram-sha-256

# etcd TLS
# In Patroni config
etcd3:
  hosts:
    - 10.0.2.10:2379
    - 10.0.2.11:2379
    - 10.0.2.12:2379
  protocol: https
  cacert: /etc/patroni/certs/etcd-ca.crt
  cert: /etc/patroni/certs/etcd-client.crt
  key: /etc/patroni/certs/etcd-client.key

بیک اپ حکمت عملی برائے HA کلسٹرز

پیٹرونی کلسٹرز کے لیے بیک اپ کی ایک جامع حکمت عملی میں مسلسل WAL آرکائیونگ، باقاعدہ مکمل بیک اپ، اور مکمل بیک اپ کے درمیان تفریق یا اضافی بیک اپ شامل ہونا چاہیے۔ pgBackRest پیداوار PostgreSQL بیک اپ مینجمنٹ کے لیے تجویز کردہ ٹول ہے۔

# Schedule backups via cron
# Full backup weekly (Sunday 2 AM)
0 2 * * 0 pgbackrest --stanza=pg-ha-cluster --type=full backup

# Differential backup daily (2 AM, Mon-Sat)
0 2 * * 1-6 pgbackrest --stanza=pg-ha-cluster --type=diff backup

# Verify backup integrity
pgbackrest --stanza=pg-ha-cluster --set=latest info

# Verify backup can be restored (dry run)
pgbackrest --stanza=pg-ha-cluster --set=latest verify

# List all backups
pgbackrest --stanza=pg-ha-cluster info
            full backup: 20260412-020000F
                timestamp: 2026-04-12 02:00:00 +0000
                wal start/stop: 000000050000000000000040 / 000000050000000000000042
                database size: 150GB, backup size: 150GB
                repository size: 45GB (compressed)
            diff backup: 20260412-020000F_20260413-020000D
                timestamp: 2026-04-13 02:00:00 +0000
                database size: 151GB, backup size: 2.1GB
                repository size: 650MB (compressed)

آپریشنل رن بک کا خلاصہ

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

# === Quick Reference Commands ===

# Cluster status
patronictlctl -c /etc/patroni/patroni.yml list
patronictlctl -c /etc/patroni/patroni.yml history

# Planned switchover
patronictlctl -c /etc/patroni/patroni.yml switchover --master node1 --candidate node2

# Restart PostgreSQL on a specific node (rolling restart)
patronictlctl -c /etc/patroni/patroni.yml restart pg-ha-cluster node2

# Reload PostgreSQL configuration without restart
patronictlctl -c /etc/patroni/patroni.yml reload pg-ha-cluster

# Pause automatic failover (during maintenance)
patronictlctl -c /etc/patroni/patroni.yml pause

# Resume automatic failover
patronictlctl -c /etc/patroni/patroni.yml resume

# Edit DCS configuration (applies to all nodes)
patronictlctl -c /etc/patroni/patroni.yml edit-config

# Reinitialise a failed replica
patronictlctl -c /etc/patroni/patroni.yml reinit pg-ha-cluster node3

# Check Patroni REST API directly
curl -s http://10.0.1.10:8008/patroni | python3 -m json.tool
curl -s http://10.0.1.10:8008/cluster | python3 -m json.tool

کارکردگی بینچ مارکنگ

پروڈکشن میں جانے سے پہلے، اپنے HA کلسٹر کو بینچ مارک کریں تاکہ بنیادی کارکردگی کو قائم کیا جا سکے اور اس بات کی توثیق کی جا سکے کہ مطابقت پذیر نقل میں تاخیر آپ کے کام کے بوجھ کے لیے قابل قبول ہے۔

# Benchmark with pgbench — initialise test data
pgbench -i -s 100 -h haproxy-host -p 5000 -U appuser appdb

# Run write-heavy benchmark (measures sync replication impact)
pgbench -h haproxy-host -p 5000 -U appuser -c 32 -j 8 -T 300 appdb
# Compare with async: temporarily set synchronous_commit = off

# Run read-only benchmark through read replica port
pgbench -h haproxy-host -p 5001 -U appuser -c 64 -j 16 -T 300 -S appdb

# Measure failover impact on transactions
# Run pgbench in background, then trigger a failover
pgbench -h haproxy-host -p 5000 -U appuser -c 8 -j 4 -T 600 appdb &
sleep 60 && patronictl switchover --master node1 --candidate node2 --force

نتیجہ

پیٹرونی کے ساتھ

PostgreSQL مقامی اعلی دستیابی ایک واحد ٹول حل نہیں ہے - یہ سلسلہ بندی کی نقل، تقسیم شدہ اتفاق رائے، کنکشن روٹنگ، کنکشن پولنگ، WAL آرکائیونگ، نگرانی، اور آپریشنل نظم و ضبط کا ایک مربوط نظام ہے۔ ہر پرت ایک مخصوص ناکامی کے موڈ کو ایڈریس کرتی ہے: سٹریمنگ ریپلیکیشن ڈیٹا ریڈنڈنسی کو ہینڈل کرتی ہے، پیٹرونی خودکار فیل اوور کوآرڈینیشن کو ہینڈل کرتی ہے، وغیرہ بغیر تقسیم دماغ کے لیڈر کے انتخاب کے لیے ضروری تقسیم شدہ اتفاق رائے فراہم کرتا ہے، HAProxy درست لیڈر سے کنکشن کا راستہ بناتا ہے، PgBouncer پیمانے پر کنکشن اوور ہیڈ کا انتظام کرتا ہے، اور WAL آرکائیونگ آخری لائن آرکائیونگ کے خلاف دفاعی لائن فراہم کرتا ہے۔ تباہی کی بحالی.

تمام ماحول میں تعیناتی کے پیٹرن مختلف ہوتے ہیں — NLB اور Route53 کے ساتھ AWS، دستیابی زونز کے ساتھ Azure اور Azure لوڈ بیلنسر، علاقائی منظم مثال کے گروپوں کے ساتھ GCP، یا k3s، Longhorn، اور Keepalived کے ساتھ ننگی دھات — لیکن بنیادی ڈھانچہ وہی رہتا ہے۔ پیٹرونی کے زیر انتظام تین یا اس سے زیادہ PostgreSQL نوڈس، جنہیں تھری نوڈ etcd کلسٹر کی حمایت حاصل ہے، جو ایک لوڈ بیلنسر کے ذریعے فرنٹڈ ہے جو Patroni کے ہیلتھ چیک اینڈ پوائنٹس کی پیروی کرتا ہے۔

آپ جو سب سے اہم سرمایہ کاری کر سکتے ہیں وہ کنفیگریشن میں نہیں ہے — یہ جانچ میں ہے۔ فیل اوور ڈرل ماہانہ چلائیں۔ نیٹ ورک پارٹیشنز انجیکشن کریں۔ غیر متوقع طور پر عمل کو مار ڈالو۔ وصولی کے وقت اور ڈیٹا کے نقصان کی پیمائش کریں۔ ڈیش بورڈز بنائیں جو ریپلیکشن لیگ، WAL جنریشن ریٹ، کنکشن پول سیچوریشن، اور DCS ہیلتھ کو حقیقی وقت میں دکھاتے ہیں۔ منظم جانچ سے آپ کو جو اعتماد حاصل ہوتا ہے وہ ایک ایسے کلسٹر کو الگ کرتا ہے جو اپنی پہلی حقیقی بندش سے بچ جاتا ہے جو سرور کی ناکامی کو کاروبار کو متاثر کرنے والے واقعے میں بدل دیتا ہے۔

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