Workstation Logo
পণ্য
এআই ল্যাবসOpenAI এজেন্টClaude এজেন্টGrok BotWorkstation CRM (WSL CRM)মার্কেটিংসব পণ্য
এআই সমাধান
এআই ওয়ার্কস্টেশনAI SME Packagesপ্রাইভেট এআইজিপিইউ ক্লাস্টারএজ এআইএন্টারপ্রাইজ এআই ল্যাবশিল্প অনুযায়ী এআই
সেবাসমূহ
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous Operationsএআই পরামর্শDevOps অটোমেশনসাইবার নিরাপত্তাসফটওয়্যার ডেভেলপমেন্টএজেন্ট নির্মাণMLOps সেটআপ
আমাদের সম্পর্কে
অংশীদারগ্রাহক গল্প
প্রবন্ধ
ডকুমেন্টেশন
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
ব্লগ
যোগাযোগ করুনLogin
Workstation

আধুনিক ব্যবসার জন্য AI ওয়ার্কস্টেশন, AI মাল্টি-এজেন্টিক সফটওয়্যার, GPU অবকাঠামো এবং বুদ্ধিমান এজেন্ট সমাধান।

যোগাযোগ করুন

AI সমাধান

এআই ওয়ার্কস্টেশনAI SME Packagesপ্রাইভেট এআইজিপিইউ ক্লাস্টারএজ এআইএন্টারপ্রাইজ এআই ল্যাবশিল্প অনুযায়ী এআই

পণ্য

সব পণ্যWSL CRM ও ERPমার্কেটিংOpenAI এজেন্টWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

কোম্পানি

আমাদের সম্পর্কেকেন Workstationঅংশীদারগ্রাহক গল্পমূল্যযোগাযোগ

রিসোর্স

প্রবন্ধডকুমেন্টেশনব্লগখুঁজুনসাইটম্যাপ
যুক্তরাজ্য অফিস
77-79 Marlowes, Hemel Hempstead HP1 1LFদিকনির্দেশ - M25 আউটার লন্ডন থেকে জংশন ২০ নিনকোম্পানি নং: 11641870সোম - শুক্র: সকাল ৯:০০ - সন্ধ্যা ৬:০০ GMT
+44 7515 356 146
বেলজিয়াম অফিস
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683সোম - শুক্র: সকাল ৯:০০ - সন্ধ্যা ৬:০০ 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 নেটিভ উচ্চ প্রাপ্যতা: Patroni, স্ট্রিমিং প্রতিলিপি, এবং উত্পাদন ব্যর্থতা কৌশল

Patroni, স্ট্রিমিং রেপ্লিকেশন, এবং HAProxy সহ PostgreSQL নেটিভ HA

Balinder Walia১২ এপ্রিল, ২০২৬30 min read

একটি একক PostgreSQL দৃষ্টান্ত চালানো সহজবোধ্য যতক্ষণ না প্রথম অপরিকল্পিত বিভ্রাট আপনাকে মনে করিয়ে দেয় যে একটি ডাটাবেস তার প্রাপ্যতার মতোই মূল্যবান। ডিস্ক ব্যর্থতা, কার্নেল প্যানিক, নেটওয়ার্ক পার্টিশন, এবং বচড আপগ্রেডগুলি তাত্ত্বিক ঝুঁকি নয় — এগুলি যথেষ্ট দীর্ঘ সময়রেখায় কার্যকরী নিশ্চিততা। PostgreSQL অন্তর্নির্মিত স্বয়ংক্রিয় ব্যর্থতার সাথে শিপ করে না, তবে এটি একটি অত্যন্ত উপলব্ধ ক্লাস্টার তৈরি করার জন্য প্রয়োজনীয় সমস্ত প্রতিলিপি আদিম প্রদান করে। Patroni, Zalando দ্বারা রক্ষণাবেক্ষণ করা একটি ওপেন-সোর্স HA ফ্রেমওয়ার্ক, সেই আদিমদেরকে একটি প্রোডাকশন-গ্রেড ফেইলওভার সিস্টেমে অর্কেস্ট্রেট করে যা বিশ্বব্যাপী হাজার হাজার PostgreSQL ক্লাস্টার জুড়ে স্কেলে যুদ্ধ-পরীক্ষিত হয়েছে।

এই নিবন্ধটি একটি গভীর-ডাইভ ইঞ্জিনিয়ারিং গাইড। আমরা PostgreSQL স্ট্রিমিং রেপ্লিকেশন (সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস), প্যাট্রোনি আর্কিটেকচার এবং কনফিগারেশন, ইত্যাদিকে ডিস্ট্রিবিউটেড কনফিগারেশন স্টোর হিসেবে কভার করব, রিড-রাইট স্প্লিটিংয়ের সাথে কানেকশন রাউটিং-এর জন্য HAProxy, কানেকশন পুলিংয়ের জন্য PgBouncer, WAL আর্কাইভিং এবং পয়েন্ট-ইন-টাইম সিলেক্টিভ ডেটা রিকোভার, সিলেক্টিভ ডেটা রিকোভার। প্রাথমিক স্ট্যান্ডবাই প্রভিশনিংয়ের জন্য pg_basebackup, Patroni-এর বিকল্প হিসাবে repmgr, AWS, Azure, এবং GCP-এর জন্য ক্লাউড-নির্দিষ্ট স্থাপনার ধরণ, Rancher এবং Longhorn-এর সাথে বেয়ার মেটাল k3s স্থাপনা, pg_stat_replication এবং Prometheus/Grafana-এর পদ্ধতির সঙ্গে নিরীক্ষণ, এফপিআর-এক্সপিআর-এক্সপিআর-এক্স-ওভারের পদ্ধতি ব্যর্থতা যাচাইকরণের জন্য প্রতিরোধ, উত্পাদন টিউনিং এবং বিশৃঙ্খলা প্রকৌশল।

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ইউটিলিটি প্রাথমিকের ডেটা ডিরেক্টরির একটি ফিজিক্যাল কপি তৈরি করে, যা একটি নতুন স্ট্যান্ডবাইয়ের সূচনা পয়েন্ট হয়ে ওঠে। এটি বেস ব্যাকআপ এবং ওয়াল স্ট্রিমিংকে পারমাণবিকভাবে পরিচালনা করে, তাই ফলস্বরূপ অনুলিপিটি সামঞ্জস্যপূর্ণ।

# 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পতাকা গুরুত্বপূর্ণ — এটিpostgresql.auto.conf-এprimary_conninfoলিখে এবং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');

Patroni: স্বয়ংক্রিয় HA অর্কেস্ট্রেশন

স্ট্রিমিং রেপ্লিকেশন আপনাকে ডেটা রিডানডেন্সি দেয়, কিন্তু এটি আপনাকে স্বয়ংক্রিয় ব্যর্থতা দেয় না। প্রাথমিক ক্র্যাশ হলে, কেউ - একজন মানব অপারেটর বা একটি অটোমেশন সিস্টেম -কে অবশ্যই একটি স্ট্যান্ডবাইকে প্রাইমারিতে উন্নীত করতে হবে, নতুন প্রাথমিক অনুসরণ করার জন্য অবশিষ্ট স্ট্যান্ডবাইগুলিকে পুনরায় কনফিগার করতে হবে এবং সংযোগ রাউটিং আপডেট করতে হবে। Patroni এই সব স্বয়ংক্রিয়.

Patroni হল একটি Python ডেমন যা প্রতিটি PostgreSQL উদাহরণের পাশাপাশি চলে। এটি একটি ডিস্ট্রিবিউটেড কনফিগারেশন স্টোর (ডিসিএস) ব্যবহার করে - সাধারণত etcd, কিন্তু এছাড়াও ZooKeeper বা Consul - নেতা নির্বাচন এবং ক্লাস্টার স্টেট সমন্বয় করতে। প্রতিটি Patroni নোড ক্রমাগত DCS এর কাছে তার স্বাস্থ্যের অবস্থা লেখে। যখন নেতা (প্রাথমিক) কনফিগার করা TTL-এর মধ্যে তার DCS কী পুনর্নবীকরণ করতে ব্যর্থ হয়, তখন Patroni সুস্থ স্ট্যান্ডবাইদের মধ্যে একটি নেতা নির্বাচন শুরু করে। বিজয়ীকে প্রাইমারিতে উন্নীত করা হয়, এবং অবশিষ্ট নোডগুলি নতুন প্রাইমারীর স্ট্যান্ডবাই হিসাবে নিজেদেরকে পুনরায় কনফিগার করে — সমস্ত স্বয়ংক্রিয়ভাবে, সাধারণত 10-30 সেকেন্ডের মধ্যে।

Patroni HA আর্কিটেকচার — 3-নোড PostgreSQL ক্লাস্টারঅ্যাপ্লিকেশন ক্লায়েন্ট৷HAProxy লোড ব্যালেন্সারপোর্ট 5000 (RW) · পোর্ট 5001 (RO)প্রাথমিক (লিডার)PostgreSQL 16 + Patroninode1 — 10.0.1.10:5432স্ট্যান্ডবাই 1 (সিঙ্ক)PostgreSQL 16 + Patroninode2 — 10.0.1.11:5432স্ট্যান্ডবাই 2 (Async)PostgreSQL 16 + Patroninode3 — 10.0.1.12:5432সিঙ্ক স্ট্রিমিং৷অ্যাসিঙ্ক স্ট্রিমিং৷etcd ক্লাস্টার (DCS)3 নোড — নেতা নির্বাচন & কনফিগার স্টোরপ্রাথমিক৷স্ট্যান্ডবাইetcd DCSHAProxy

Patroni 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মানগুলির সাথে একটি অভিন্ন কনফিগারেশন ব্যবহার করে৷ প্যাট্রোনি বাকিগুলি পরিচালনা করে — এটি ডিসিএস অবস্থার উপর ভিত্তি করে একটি নোডটি লিডার বা একটি প্রতিরূপ হওয়া উচিত কিনা তা সনাক্ত করে এবং সেই অনুযায়ী PostgreSQL কনফিগার করে।

বিতরণকৃত কনফিগারেশন স্টোরহিসাবে

etcd

etcd হল একটি Patroni ক্লাস্টারের স্নায়ুতন্ত্র। এটি বর্তমান নেতা পরিচয়, ক্লাস্টার টপোলজি, পছন্দসই কনফিগারেশন এবং প্রতিটি নোডের স্বাস্থ্যের অবস্থা সংরক্ষণ করে। একটি তিন-নোড 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 প্রতিটি নোডে একটি REST API প্রকাশ করে (ডিফল্টভাবে পোর্ট 8008) যেটি রিপোর্ট করে যে নোডটি বর্তমান নেতা নাকি একটি প্রতিরূপ। 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এন্ডপয়েন্ট শুধুমাত্র বর্তমান Patroni লিডারে 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)সিঙ্ক স্ট্যান্ডবাইpg-node2 (RO)সিঙ্ক৷HAProxy (স্থানীয়)অঞ্চল 2 — Azure westeuropeAsync স্ট্যান্ডবাইpg-node3 (RO)Async স্ট্যান্ডবাইpg-node4 (RO)সিঙ্কHAProxy (স্থানীয়)অঞ্চল 3 — GCP ইউরোপ-ওয়েস্ট1Async স্ট্যান্ডবাইpg-node5 (RO)Async স্ট্যান্ডবাইpg-node6 (RO)সিঙ্ক৷HAProxy (স্থানীয়)অ্যাসিঙ্ক WAL৷async WAL শিপিং৷শেয়ার্ড ওয়াল আর্কাইভ (S3 / Blob / GCS)pgBackRest বা WAL-G — ক্রস-অঞ্চল PITRগ্লোবাল DNS (Route53 / ট্রাফিক ম্যানেজার / ক্লাউড DNS)কিংবদন্তি:সিঙ্ক প্রতিলিপি (অঞ্চলের মধ্যে)অ্যাসিঙ্ক প্রতিলিপি (ক্রস-অঞ্চল)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"}'

একটি স্যুইচওভারের সময়, Patroni বর্তমান প্রাইমারিটিকে স্ট্যান্ডবাইতে অবনমিত করে, টার্গেট প্রার্থীকে প্রচার করে এবং নতুন প্রাইমারি অনুসরণ করার জন্য অন্যান্য সমস্ত স্ট্যান্ডবাইকে পুনরায় কনফিগার করে। প্রক্রিয়াটি 5-15 সেকেন্ড সময় নেয়। HAProxy স্বাস্থ্য পরীক্ষার মাধ্যমে পরিবর্তন শনাক্ত করে এবং স্বয়ংক্রিয়ভাবে ট্রাফিক পুনঃনির্দেশ করে।

অটোমেটিক ফেইলওভার সিকোয়েন্স

যখন প্রাথমিকটি অপ্রত্যাশিতভাবে ব্যর্থ হয়, তখন Patroni পরিষেবা পুনরুদ্ধার করার জন্য একটি সুনির্দিষ্ট ক্রম অনুসরণ করে। নিম্নলিখিত চিত্রটি পদক্ষেপগুলিকে চিত্রিত করে।

Patroni অটোমেটিক ফেইলওভার সিকোয়েন্স1প্রাথমিক ব্যর্থ৷ক্র্যাশ, নেটওয়ার্ক পার্টিশন, বা৷ নোড1-এডিস্ক ব্যর্থতা2Patroni DCSএর মাধ্যমে সনাক্ত করে৷লিডার কী TTL etcd-এ মেয়াদ শেষ হয়৷(ডিফল্ট 30s TTL)3নেতা নির্বাচনঅর্জনের জন্যস্ট্যান্ডবাই রেসলিডার লক ইন etcd৷4স্ট্যান্ডবাই প্রচারিতবিজয়ী pg_ctlপ্রচার চালায়এবং নতুন প্রাথমিকহয়ে যায়5HAProxy আপডেটস্বাস্থ্য পরীক্ষা নতুন প্রাথমিকশনাক্ত করে৷/প্রাথমিক নতুন লিডার-এ 200 ফেরত দেয়6ক্লায়েন্টরাপুনরায় সংযোগ করেছে৷অ্যাপ্লিকেশনগুলি HAProxyএর মাধ্যমে পুনরায় সংযোগ করে৷থেকে নতুন প্রাথমিক স্বচ্ছভাবেসাধারণ মোট ব্যর্থতার সময়DCS TTL মেয়াদ শেষ: ~15-30sনির্বাচন: ~2-5sHAProxy সনাক্তকরণ: ~3-10sপুনরায় সংযোগ করুন৷≈ 20-45 সেকেন্ড মোটকী প্যারামিটারগুলি ব্যর্থতার গতিকে প্রভাবিত করে:• ttl (ডিফল্ট 30s) — DCS-এ লিডার কী মেয়াদ শেষ হওয়ার কতক্ষণ আগে• loop_wait (ডিফল্ট 10s) — কত ঘন ঘন Patroni ক্লাস্টার স্টেট চেক করে• retry_timeout (ডিফল্ট 10s) — DCS এবং PostgreSQL অপারেশনের জন্য সময়সীমা• সর্বাধিক_ল্যাগ_অন_ফেলওভার (1MB) — শুধুমাত্র এই রেপ্লিকেশন ল্যাগের মধ্যে স্ট্যান্ডবাই প্রচার করুন

স্প্লিট-ব্রেন প্রতিরোধ

স্প্লিট-ব্রেন - যেখানে দুটি নোড একই সাথে বিশ্বাস করে যে তারা প্রাথমিক - যে কোনও HA সিস্টেমে সবচেয়ে বিপজ্জনক ব্যর্থতার মোড। প্যাট্রোনি বিভিন্ন প্রক্রিয়ার মাধ্যমে বিভক্ত-মস্তিষ্ক প্রতিরোধ করে:

  1. DCS-ভিত্তিক লিডার লক:শুধুমাত্র একটি নোড যেকোনো সময় etcd-এ লিডার কী ধরে রাখতে পারে। কীটিতে একটি TTL রয়েছে এবং নেতাকে অবশ্যই এটি ক্রমাগত পুনর্নবীকরণ করতে হবে। যদি একটি নেটওয়ার্ক পার্টিশন লিডারকে etcd থেকে বিচ্ছিন্ন করে, তাহলে কীটির মেয়াদ শেষ হয়ে যায় এবং লিডার নিজেকে অবনমিত করে।
  2. ওয়াচডগ:Patroni একটি Linux ওয়াচডগ ডিভাইস কনফিগার করতে পারে (/dev/watchdog)। প্যাট্রোনি যদি DCS-এ অ্যাক্সেস হারায় এবং নিশ্চিত করতে না পারে যে এটি নেতা থাকা উচিত, তাহলে ওয়াচডগ নোডটিকে পুনরায় বুট করবে বা পাওয়ার-অফ করবে — একটি শক্ত ফেন্সিং মেকানিজম যা গ্যারান্টি দেয় যে পুরানো প্রাথমিক লেখাগুলি গ্রহণ করা চালিয়ে যাবে না।
  3. pg_rewind:যখন প্রাক্তন প্রাইমারি অনলাইনে ফিরে আসে, তখন এতে WAL রেকর্ড থাকতে পারে যা কখনও প্রতিলিপি করা হয়নি।pg_rewindটাইমলাইনকে ডাইভারজেন্স বিন্দুতে রিওয়াইন্ড করে, নোডটিকে সম্পূর্ণ বেস ব্যাকআপ ছাড়াই স্ট্যান্ডবাই হিসাবে পুনরায় যোগদান করার অনুমতি দেয়। Patroni এর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
Patroniএর বিকল্প হিসাবে

repmgr

repmgrহল PostgreSQL এর জন্য আরেকটি জনপ্রিয় HA টুল। এটি স্ট্যান্ডবাই ম্যানেজমেন্ট, স্বয়ংক্রিয় ব্যর্থতা এবং সুইচওভার ক্ষমতা প্রদান করে। যাইহোক, এটি Patroni থেকে একটি মৌলিকভাবে ভিন্ন পদ্ধতি গ্রহণ করে। 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

নতুন স্থাপনার জন্য, Patroni এর শক্তিশালী বিভাজন-মস্তিষ্ক প্রতিরোধ গ্যারান্টি এবং আরও সক্রিয় উন্নয়ন সম্প্রদায়ের কারণে প্রস্তাবিত পছন্দ। repmgr সহজতর সেটআপ বা সংস্থাগুলির জন্য একটি যুক্তিসঙ্গত বিকল্প হিসাবে রয়ে গেছে যা ইতিমধ্যে টুলটিতে বিনিয়োগ করেছে।

ক্লাউড ডিপ্লয়মেন্ট প্যাটার্ন

AWS স্থাপনা: EC2, EBS, এবং Route53

AWS-এ, প্রতিটি PostgreSQL + Patroni নোডকে 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 Persistent Disks সহ n2-highmem-8 ইন্সট্যান্স (8 vCPU, 64GB RAM) ব্যবহার করুন। একটি অঞ্চলের মধ্যে অঞ্চল জুড়ে বিতরণ করুন। Patroni স্বাস্থ্য পরীক্ষার সাথে একটি অভ্যন্তরীণ 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 রেঞ্চার এবং লংহর্ন

এর সাথে স্থাপনা

যে সংস্থাগুলি তাদের নিজস্ব হার্ডওয়্যার পরিচালনা করে, তাদের জন্য k3s, Rancher, এবং Longhorn-এর সাথে বেয়ার মেটালে PostgreSQL HA স্থাপন করা একটি সম্পূর্ণ ওপেন সোর্স, ক্লাউড-স্বাধীন পরিকাঠামো প্রদান করে। k3s হল একটি লাইটওয়েট Kubernetes ডিস্ট্রিবিউশন যা সম্পূর্ণ Kubernetes ডিস্ট্রিবিউশনের ওভারহেড ছাড়াই বেয়ার মেটাল সার্ভারে দক্ষতার সাথে চলে।

বেয়ার মেটাল k3s HA — PostgreSQL Patroniএর সাথেভার্চুয়াল আইপি (কিপলিভড VRRP) — 10.0.0.100HAProxy সক্রিয়/স্ট্যান্ডবাইএর জন্যফ্লোটিং ভিআইপিHAProxy (সক্রিয়)বেয়ার-মেটাল-lb1HAProxy (স্ট্যান্ডবাই)বেয়ার-মেটাল-lb2k3s ক্লাস্টার (Rancher দ্বারা পরিচালিত)k3s নোড 1 (সার্ভার)PostgreSQL প্রাথমিকPatroni + PgBouncerলংহর্ন ভলিউম (500GB)NVMe SSD — বেয়ার-মেটাল-srv1k3s নোড 2 (সার্ভার)PostgreSQL স্ট্যান্ডবাই 1Patroni + PgBouncerলংহর্ন ভলিউম (500GB)NVMe SSD — bare-metal-srv2k3s নোড 3 (সার্ভার)PostgreSQL স্ট্যান্ডবাই 2Patroni + PgBouncerলংহর্ন ভলিউম (500GB)NVMe SSD — bare-metal-srv3এক্সটার্নাল etcd ক্লাস্টার (3 ডেডিকেটেড নোড)etcd1 (10.0.3.10) · etcd2 (10.0.3.11) · etcd3 (10.0.3.12)রানচার ম্যানেজমেন্টUI + ক্লাস্টার লাইফসাইকেলপ্রাথমিকস্ট্যান্ডবাইetcdলংহর্নHAProxyস্ট্রিমিং প্রতিলিপি ড্যাশ করা সবুজ তীরহিসাবে দেখানো হয়েছে

k3s এবং লংহর্ন সেটআপ

# 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

টিউনিং Patroni DCS পরামিতি

Patroni এরttl,loop_wait, এবংretry_timeoutপ্যারামিটারগুলির মধ্যে সম্পর্ক সরাসরি ব্যর্থতার গতি এবং মিথ্যা-ইতিবাচক ঝুঁকিকে প্রভাবিত করে৷ একটি সংক্ষিপ্ত TTL মানে দ্রুত ব্যর্থতা সনাক্তকরণ কিন্তু সংক্ষিপ্ত নেটওয়ার্ক ব্লিপসের সময় অপ্রয়োজনীয় ব্যর্থতার ঝুঁকি বাড়ায়।

# 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

ক্যাওস ইঞ্জিনিয়ারিং এবং ফেইলওভার টেস্টিং

একটি ব্যর্থতা সিস্টেম যা কখনও পরীক্ষা করা হয়নি এমন একটি সিস্টেম যা কাজ করে না। ক্যাওস ইঞ্জিনিয়ারিং নিয়ন্ত্রিত ব্যর্থতাগুলিকে যাচাই করতে প্রয়োগ করে যে আপনার HA সেটআপ বাস্তব ব্যর্থতার শর্তে সঠিকভাবে আচরণ করে। প্রতিটি Patroni ক্লাস্টার নিয়মিত ফেইলওভার ড্রিলের অধীন হওয়া উচিত।

ফেইলওভার টেস্ট প্লেবুক

# 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'

একটিবিলম্বিত স্ট্যান্ডবাইইচ্ছাকৃতভাবে সময় বিলম্বের সাথে WAL রেকর্ড প্রয়োগ করে — সাধারণত 1-4 ঘন্টা। এটি যৌক্তিক ত্রুটির বিরুদ্ধে একটি প্রতিরক্ষা প্রদান করে (দুর্ঘটনাজনিত মুছে ফেলা, খারাপ স্থানান্তর) যা অবিলম্বে সিঙ্ক্রোনাস স্ট্যান্ডবাইতে প্রতিলিপি করা হয়। যদি একটি বিপর্যয় ঘটে, আপনি বিলম্বিত স্ট্যান্ডবাইতে WAL রিপ্লে বন্ধ করতে পারেন এবং ত্রুটির আগে থেকে ডেটা পুনরুদ্ধার করতে পারেন।

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

সংযোগ স্ট্রিং কৌশল

একটি Patroni-পরিচালিত ক্লাস্টারে সংযোগকারী অ্যাপ্লিকেশনগুলিকে সর্বদা 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 ক্লাস্টারএর জন্য

ব্যাকআপ কৌশল

Patroni ক্লাস্টারগুলির জন্য একটি ব্যাপক ব্যাকআপ কৌশলের মধ্যে অবিচ্ছিন্ন 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

উপসংহার

Patroni-এর সাথে

PostgreSQL নেটিভ উচ্চ প্রাপ্যতা একটি একক-টুল সমাধান নয় - এটি স্ট্রিমিং প্রতিলিপি, বিতরণকৃত ঐক্যমত, সংযোগ রাউটিং, সংযোগ পুলিং, WAL সংরক্ষণাগার, পর্যবেক্ষণ, এবং অপারেশনাল শৃঙ্খলার একটি সমন্বিত সিস্টেম। প্রতিটি স্তর একটি নির্দিষ্ট ব্যর্থতা মোডকে সম্বোধন করে: স্ট্রিমিং রেপ্লিকেশন ডেটা রিডানডেন্সি পরিচালনা করে, প্যাট্রোনি স্বয়ংক্রিয় ব্যর্থতা সমন্বয় পরিচালনা করে, ইত্যাদি বিভক্ত-মস্তিষ্ক ছাড়াই নেতা নির্বাচনের জন্য প্রয়োজনীয় বিতরণকৃত ঐক্যমত্য প্রদান করে, সঠিক নেতার সাথে HAProxy রুট সংযোগ, PgBouncer স্কেলে সংযোগের ওভারহেড পরিচালনা করে, এবং WAL আর্কাইভিং-এর বিরুদ্ধে সর্বশেষ রক্ষণাবেক্ষণের লাইন এবং ডিফেন্স রেখার সাথে। দুর্যোগ পুনরুদ্ধার

পরিবেশ জুড়ে স্থাপনার ধরণ পরিবর্তিত হয় — NLB এবং Route53 সহ AWS, উপলব্ধতা অঞ্চল এবং Azure লোড ব্যালেন্সার, আঞ্চলিক পরিচালিত উদাহরণ গোষ্ঠীগুলির সাথে GCP, বা k3s, লংহর্ন এবং কিপলাইভের সাথে বেয়ার মেটাল — তবে মূল স্থাপত্য একই থাকে৷ Patroni দ্বারা পরিচালিত তিনটি বা ততোধিক PostgreSQL নোড, একটি থ্রি-নোড etcd ক্লাস্টার দ্বারা সমর্থিত, একটি লোড ব্যালেন্সার দ্বারা ফ্রন্টেড যা Patroni এর হেলথ চেক এন্ডপয়েন্ট অনুসরণ করে।

আপনি যে সবচেয়ে গুরুত্বপূর্ণ বিনিয়োগ করতে পারেন তা কনফিগারেশনে নয় - এটি পরীক্ষায়। মাসিক ফেইলওভার ড্রিল চালান। নেটওয়ার্ক পার্টিশন ইনজেক্ট করুন। অপ্রত্যাশিতভাবে প্রক্রিয়া হত্যা. পুনরুদ্ধারের সময় এবং ডেটা ক্ষতি পরিমাপ করুন। ড্যাশবোর্ড তৈরি করুন যা রিপ্লিকেশন ল্যাগ, ওয়াল জেনারেশন রেট, সংযোগ পুল স্যাচুরেশন এবং রিয়েল টাইমে DCS স্বাস্থ্য দেখায়। পদ্ধতিগত পরীক্ষা থেকে আপনি যে আত্মবিশ্বাস অর্জন করেন তা হল এমন একটি ক্লাস্টারকে আলাদা করে যা তার প্রথম বাস্তব বিভ্রাট থেকে বেঁচে থাকে যা একটি সার্ভার ব্যর্থতাকে ব্যবসা-প্রতিঘাত সৃষ্টিকারী ঘটনায় পরিণত করে।

PostgreSQL আপনাকে সমস্ত প্রতিলিপি আদিম দেয়৷ পাত্রোনি আপনাকে অর্কেস্ট্রেশন দেয়। etcd আপনাকে ঐকমত্য দেয়। আপনার কাজ হল সেগুলিকে সঠিকভাবে একত্রিত করা, আপনার কাজের চাপের জন্য তাদের টিউন করা এবং ক্রমাগত যাচাই করা। এই নির্দেশিকা আপনাকে ব্লুপ্রিন্ট দিয়েছে — এখন তৈরি করুন, পরীক্ষা করুন এবং আত্মবিশ্বাসের সাথে পরিচালনা করুন।