ক্রাঞ্চি ডেটা পিজিও সহ PostgreSQL উচ্চ উপলব্ধতা: এন্টারপ্রাইজ Kubernetes স্থাপনা
Kubernetes এ ক্রাঞ্চি ডেটা পিজিও সহ এন্টারপ্রাইজ PostgreSQL HA
Kubernetes উৎপাদনে PostgreSQL চলমান একটি স্থায়ী ভলিউম সহ একটি StatefulSet এর চেয়ে বেশি দাবি করে। আপনার প্রয়োজন স্বয়ংক্রিয় ব্যর্থতা, ক্রমাগত ব্যাকআপ এবং পয়েন্ট-ইন-টাইম পুনরুদ্ধার, সংযোগ পুলিং, TLS এনক্রিপশন, পর্যবেক্ষণ, এবং ক্লাউড সরবরাহকারী এবং বেয়ার মেটাল জুড়ে ধারাবাহিকভাবে স্থাপন করার ক্ষমতা। Crunchy Data PGO (Postgres অপারেটর) v5 এই সবগুলিকে একটি একক Kubernetes-নেটিভ কাস্টম রিসোর্সের মাধ্যমে সরবরাহ করে —PostgresClusterCRD — যুদ্ধ-পরীক্ষিত উপাদানগুলির দ্বারা সমর্থিত: সম্মতি-ভিত্তিক HA-এর জন্য Patroni, এন্টারপ্রাইজ ব্যাকআপের জন্য pgBackRest, সংযোগ পুলিংয়ের জন্য PgBouncer-এবং XPR0-এর জন্য observable-এর জন্য।
এই নির্দেশিকাটি র্যাঞ্চারের সাথে AWS EKS, Azure AKS, GCP GKE, এবং বেয়ার মেটাল k3s জুড়ে প্রাথমিক স্থাপনা থেকে শুরু করে প্রোডাকশন-গ্রেড অপারেশন পর্যন্ত একটি PGO-পরিচালিত PostgreSQL ক্লাস্টার নেওয়ার জন্য প্রয়োজনীয় সমস্ত কিছু কভার করে। প্রতিটি বিভাগে কংক্রিট YAML, Helm মান এবং অপারেশনাল পদ্ধতিগুলি অন্তর্ভুক্ত রয়েছে যা আপনি আপনার পরিবেশের সাথে মানিয়ে নিতে পারেন।
ক্রাঞ্চি ডেটা PGO v5 আর্কিটেকচার
PGO v5 হল Crunchy Postgres অপারেটরের একটি সম্পূর্ণ পুনর্লিখন। এটি পূর্ববর্তী pgcluster/pgreplica/pgpolicy CRD-কে একটি এককPostgresClusterসংস্থান দিয়ে প্রতিস্থাপন করে যা ঘোষণামূলকভাবে একটি PostgreSQL স্থাপনার প্রতিটি দিক বর্ণনা করে। অপারেটর এই রিসোর্সের পরিবর্তনের দিকে নজর রাখে এবং অন্তর্নিহিত Kubernetes অবজেক্ট - স্টেটফুলসেট, সার্ভিস, কনফিগম্যাপ, সিক্রেটস, জবস -কে কাঙ্খিত অবস্থার সাথে মেলে।
স্থাপত্যটি চারটি স্তম্ভের উপর নির্মিত।Patroniপ্রতিটি PostgreSQL পডে সাইডকার হিসেবে চলে এবং Kubernetes-নেটিভ ডিস্ট্রিবিউটেড কনসেনসাস ব্যবহার করে লিডার ইলেকশন, রেপ্লিকেশন টপোলজি এবং স্বয়ংক্রিয় ফেইলওভার পরিচালনা করে।pgBackRestসম্পূর্ণ, ডিফারেনশিয়াল, এবং ক্রমবর্ধমান ব্যাকআপ এবং অবজেক্ট স্টোরেজ (S3, GCS, Azure ব্লব) বা স্থানীয় PVCs-এ অবিচ্ছিন্ন WAL সংরক্ষণাগার পরিচালনা করে।PgBouncerলাইটওয়েট সংযোগ পুলিং প্রদান করে যা PostgreSQL কে সংযোগের ঝড় থেকে রক্ষা করে।pgMonitorএকটি Prometheus রপ্তানিকারক সাইডকারের মাধ্যমে PostgreSQL মেট্রিক্স প্রকাশ করে আপনার বিদ্যমান পর্যবেক্ষণের স্ট্যাকের সাথে একীকরণের জন্য।
অপারেটর নিজেই স্টেটলেস — সমস্ত স্থির অবস্থা PostgreSQL ক্লাস্টার এবং এর ব্যাকআপ রিপোজিটরিতে থাকে। এর মানে আপনি চলমান ডাটাবেসকে প্রভাবিত না করে অপারেটর আপগ্রেড বা পুনরায় চালু করতে পারেন। অপারেটর পুনর্মিলন লুপটি অদম্য: একইPostgresClusterস্পেক একাধিকবার প্রয়োগ করা Kubernetes বস্তুর একই সেট তৈরি করে।
PGO v5
ইনস্টল করা হচ্ছেPGO v5 Helm বা সরাসরি kubectl ম্যানিফেস্টের মাধ্যমে ইনস্টল করা যেতে পারে। Helm পদ্ধতিটি উৎপাদনের জন্য পছন্দের কারণ এটি GitOps কর্মপ্রবাহের সাথে পরিষ্কারভাবে সংহত করে এবং সংস্করণ-নিয়ন্ত্রিত আপগ্রেড প্রদান করে।
# Add the Crunchy Data Helm repository
helm repo add crunchydata https://charts.crunchydata.com
helm repo update
# Install PGO into its own namespace
helm install pgo crunchydata/pgo \
--namespace postgres-operator \
--create-namespace \
--set controllerImages.cluster=registry.crunchydata.com/crunchydata/postgres-operator:ubi8-5.7.2-0 \
--set relatedImages.postgres_16=registry.crunchydata.com/crunchydata/crunchy-postgres:ubi8-16.6-1 \
--set relatedImages.pgbackrest=registry.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.54.1-0 \
--set relatedImages.pgbouncer=registry.crunchydata.com/crunchydata/crunchy-pgbouncer:ubi8-1.23.1-0 \
--set relatedImages.pgexporter=registry.crunchydata.com/crunchydata/crunchy-postgres-exporter:ubi8-0.16.0-0এয়ার-গ্যাপড পরিবেশের জন্য, প্রয়োজনীয় ছবিগুলিকে আপনার অভ্যন্তরীণ রেজিস্ট্রিতে মিরর করুন এবং সেই অনুযায়ীrelatedImagesমানগুলি আপডেট করুন৷ PGO শুধুমাত্র Helm মান বাPostgresClusterস্পেক-এ নির্দিষ্ট করা ছবিগুলিকে টেনে আনবে — এটি কখনই রানটাইমে বহিরাগত রেজিস্ট্রির কাছে পৌঁছায় না যদি না এটি করার জন্য স্পষ্টভাবে কনফিগার করা হয়।
# Verify the operator is running
kubectl get pods -n postgres-operator
NAME READY STATUS RESTARTS AGE
pgo-controller-manager-7d8f9b6c4-xk2pt 1/1 Running 0 45sPostgresCluster CRD স্পেসিফিকেশন
PostgresClusterCRD হল আপনার সম্পূর্ণ PostgreSQL স্থাপনার একক ঘোষণামূলক পৃষ্ঠ। নীচে একটি উত্পাদন-প্রস্তুত স্পেসিফিকেশন যা মূল বিভাগগুলি প্রদর্শন করে। এই গাইডের পরবর্তী অংশগুলিতে প্রতিটি বিভাগ বিস্তারিতভাবে আলোচনা করা হয়েছে।
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: production-db
namespace: databases
spec:
postgresVersion: 16
image: registry.crunchydata.com/crunchydata/crunchy-postgres:ubi8-16.6-1
instances:
- name: pgha1
replicas: 3
resources:
requests:
cpu: "2"
memory: 8Gi
limits:
cpu: "4"
memory: 16Gi
dataVolumeClaimSpec:
storageClassName: gp3-csi
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
walVolumeClaimSpec:
storageClassName: gp3-csi
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
postgres-operator.crunchydata.com/cluster: production-db
tolerations:
- key: "workload"
operator: "Equal"
value: "database"
effect: "NoSchedule"
backups:
pgbackrest:
image: registry.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.54.1-0
configuration:
- secret:
name: pgbackrest-s3-creds
global:
repo1-retention-full: "7"
repo1-retention-diff: "14"
repo1-path: /pgbackrest/production-db/repo1
repo1-s3-uri-style: path
repos:
- name: repo1
schedules:
full: "0 2 * * 0" # Sunday 2am
differential: "0 2 * * 1-6" # Mon-Sat 2am
incremental: "0 */4 * * *" # Every 4 hours
s3:
bucket: mycompany-pg-backups
endpoint: s3.eu-west-1.amazonaws.com
region: eu-west-1
proxy:
pgBouncer:
image: registry.crunchydata.com/crunchydata/crunchy-pgbouncer:ubi8-1.23.1-0
replicas: 2
resources:
requests:
cpu: 500m
memory: 256Mi
limits:
cpu: "1"
memory: 512Mi
config:
global:
pool_mode: transaction
max_client_conn: "1000"
default_pool_size: "25"
min_pool_size: "5"
reserve_pool_size: "5"
reserve_pool_timeout: "3"
monitoring:
pgmonitor:
exporter:
image: registry.crunchydata.com/crunchydata/crunchy-postgres-exporter:ubi8-0.16.0-0
resources:
requests:
cpu: 100m
memory: 128Mi
patroni:
dynamicConfiguration:
synchronous_mode: true
postgresql:
parameters:
shared_buffers: 2GB
effective_cache_size: 6GB
work_mem: 32MB
maintenance_work_mem: 512MB
max_connections: 200
wal_buffers: 64MB
checkpoint_completion_target: 0.9
random_page_cost: 1.1
effective_io_concurrency: 200
min_wal_size: 1GB
max_wal_size: 4GB
max_worker_processes: 8
max_parallel_workers_per_gather: 4
max_parallel_workers: 8
log_min_duration_statement: 500
log_checkpoints: "on"
log_connections: "on"
log_disconnections: "on"
log_lock_waits: "on"
users:
- name: appuser
databases: ["appdb"]
options: "NOSUPERUSER"
- name: readonly
databases: ["appdb"]
options: "NOSUPERUSER"
databaseInitSQL:
name: init-sql-configmap
key: init.sqlএই স্পেসিফিকেশনটি পৃথক ডেটা এবং WAL ভলিউম সহ একটি তিন-ইনস্ট্যান্স PostgreSQL 16 ক্লাস্টার তৈরি করে, একটি সম্পূর্ণ/ডিফারেনশিয়াল/বর্ধিত সময়সূচীতে S3-ব্যাকড ব্যাকআপ, লেনদেন মোডে PgBouncer সংযোগ পুলিং, Prometheus মেট্রিক্স এক্সপোর্ট, এবং Patroni সিঙ্ক্রোনাস প্রতিলিপি। পড অ্যান্টি-অ্যাফিনিটি নিয়মটি নিশ্চিত করে যে তিনটি ঘটনাই বিভিন্ন Kubernetes নোডের উপর ল্যান্ড করে।
Patroni-ভিত্তিক HA এবং স্বয়ংক্রিয় ব্যর্থতা
Patroni হল প্রতিটি PGO-পরিচালিত PostgreSQL পডে এম্বেড করা HA ফ্রেমওয়ার্ক। এটি ডিস্ট্রিবিউটেড কনফিগারেশন স্টোর (DCS) হিসাবে Kubernetes API ব্যবহার করে — কোন আলাদা etcd বা ZooKeeper ক্লাস্টারের প্রয়োজন নেই। Patroni ক্রমাগত PostgreSQL প্রাথমিক এবং প্রতিলিপিগুলির স্বাস্থ্য পর্যবেক্ষণ করে। যখন প্রাথমিকটি প্রতিক্রিয়াহীন হয়ে যায়, তখন Patroni একটি স্বয়ংক্রিয় ব্যর্থতার সূচনা করে: এটি সবচেয়ে আপ-টু-ডেট প্রতিলিপিকে প্রাথমিকে উন্নীত করে এবং নতুন নেতাকে অনুসরণ করার জন্য অবশিষ্ট প্রতিলিপিগুলিকে পুনরায় কনফিগার করে।
PGO-তে ফেইলওভার প্রক্রিয়া নিম্নরূপ কাজ করে। প্রতিটি পডে Patroni Kubernetes-এ একটি লিডার লক রাখে (এন্ডপয়েন্ট বা কনফিগম্যাপ অবজেক্টের মাধ্যমে)। বর্তমান প্রাইমারিকে অবশ্যই কনফিগারযোগ্য ব্যবধানে এই লকটি পুনর্নবীকরণ করতে হবে (ডিফল্ট 10 সেকেন্ড TTL, 3 সেকেন্ড লুপ অপেক্ষা)। যদি প্রাইমারি রিনিউ করতে ব্যর্থ হয় - কারণ এটি ক্র্যাশ হয়ে গেছে, নোডটি মারা গেছে, বা নেটওয়ার্ক এটিকে বিভাজন করেছে - একটি রেপ্লিকা যা প্রাইমারীর WAL অবস্থানের সবচেয়ে কাছাকাছি তা লকটি অর্জন করবে এবং নিজেকে প্রচার করবে। সম্পূর্ণ প্রক্রিয়াটি সাধারণত 10 থেকে 30 সেকেন্ডের মধ্যে সম্পন্ন হয়।
সিঙ্ক্রোনাস রেপ্লিকেশন মোড, প্যাট্রোনি কনফিগারেশনেsynchronous_mode: trueএর মাধ্যমে সক্ষম করা হয়েছে, সামান্য বেশি লেখার বিলম্বের খরচে শূন্য ডেটা ক্ষতির গ্যারান্টি দেয় (RPO = 0)৷ সিঙ্ক্রোনাস মোডে, ক্লায়েন্টের কাছে একটি লেনদেন স্বীকার করা হয় না যতক্ষণ না অন্তত একটি প্রতিলিপি WAL প্রাপ্তির বিষয়টি নিশ্চিত করে। যদি কোন সিঙ্ক্রোনাস রেপ্লিকা উপলব্ধ না হয়, প্যাট্রোনি সাময়িকভাবে প্রাপ্যতা বজায় রাখতে সিঙ্ক্রোনাস মোড অক্ষম করে — আপনি যদি সামঞ্জস্যের জন্য প্রাপ্যতা ত্যাগ করতে চান তবে আপনি এটিকেsynchronous_mode_strict: trueদিয়ে ওভাররাইড করতে পারেন।
# Check Patroni cluster status
kubectl exec -it production-db-pgha1-0 -n databases -- patronictl list
+----------------------------+-------------------+---------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------------------------+-------------------+---------+---------+----+-----------+
| production-db-pgha1-0 | 10.244.0.15 | Leader | running | 3 | |
| production-db-pgha1-1 | 10.244.1.22 | Replica | running | 3 | 0 |
| production-db-pgha1-2 | 10.244.2.18 | Replica | running | 3 | 0 |
+----------------------------+-------------------+---------+---------+----+-----------+
# Manual switchover (planned, zero downtime)
kubectl exec -it production-db-pgha1-0 -n databases -- \
patronictl switchover --master production-db-pgha1-0 --candidate production-db-pgha1-1 --force
# Manual failover (forced, for emergencies)
kubectl exec -it production-db-pgha1-1 -n databases -- \
patronictl failover --candidate production-db-pgha1-1 --forcePGO স্বয়ংক্রিয়ভাবে Kubernetes পরিষেবাগুলিকে প্যাট্রোনি নেতাকে ট্র্যাক করতে কনফিগার করে৷production-db-primaryপরিষেবাটি সর্বদা যে কোনও পড বর্তমানে লিডার লক ধারণ করে তা নির্দেশ করে, তাই এই পরিষেবার মাধ্যমে সংযোগকারী অ্যাপ্লিকেশনগুলি শুধুমাত্র একটি সংক্ষিপ্ত সংযোগ পুনরায় সেট করার সাথে বিরামহীন ব্যর্থতা অনুভব করে।
pgBackRest ব্যাকআপ এবং
পুনরুদ্ধার করুনpgBackRest হল ব্যাকআপ ইঞ্জিন যা PGO-তে সংহত করা হয়েছে। এটি তিনটি ব্যাকআপ প্রকারকে সমর্থন করে — পূর্ণ, ডিফারেনশিয়াল এবং ইনক্রিমেন্টাল — প্লাস পয়েন্ট-ইন-টাইম রিকভারির জন্য অবিচ্ছিন্ন WAL সংরক্ষণাগার (PITR)। স্টোরেজ খরচ, ব্যাকআপ গতি এবং পুনরুদ্ধারের সময় ভারসাম্য রাখে এমন একটি ব্যাকআপ কৌশল ডিজাইন করার জন্য এইগুলি কীভাবে একত্রিত হয় তা বোঝা অপরিহার্য।
একটিসম্পূর্ণ ব্যাকআপসম্পূর্ণ PostgreSQL ডেটা ডিরেক্টরি অনুলিপি করে এবং অন্যান্য সমস্ত ব্যাকআপ প্রকারের জন্য বেসলাইন। একটিডিফারেনশিয়াল ব্যাকআপশুধুমাত্র সেই পৃষ্ঠাগুলি কপি করে যা শেষ সম্পূর্ণ ব্যাকআপের পর থেকে পরিবর্তিত হয়েছে৷ একটিক্রমবর্ধমান ব্যাকআপশুধুমাত্র সেই পৃষ্ঠাগুলি কপি করে যা যে কোনও ধরণের শেষ ব্যাকআপের পর থেকে পরিবর্তিত হয়েছে৷ পুনরুদ্ধারের সময়, pgBackRest স্বয়ংক্রিয়ভাবে প্রয়োজনীয় ব্যাকআপগুলিকে একত্রে চেইন করে — উদাহরণস্বরূপ, একটি ইনক্রিমেন্টাল থেকে পুনরুদ্ধার করার জন্য ইনক্রিমেন্টাল এবং পূর্বের ডিফারেনশিয়াল (বা সম্পূর্ণ) প্লাস সম্পূর্ণ ব্যাকআপ প্রয়োজন, এবং লক্ষ্য পুনরুদ্ধারের পয়েন্টে পৌঁছানোর জন্য যে কোনও WAL বিভাগ প্রয়োজন।
ব্যাকআপ শিডিউল কনফিগারেশন
ব্যাকআপ সময়সূচীPostgresClusterস্পেকের মধ্যে pgBackRest কনফিগারেশনেরreposবিভাগে সংজ্ঞায়িত করা হয়েছে। একটি কঠিন উৎপাদন সময়সূচী সাধারণত একটি সাপ্তাহিক পূর্ণ, দৈনিক ডিফারেনশিয়াল এবং আরও ঘন ঘন বর্ধিত ব্যাকআপ চালায়।
backups:
pgbackrest:
global:
repo1-retention-full: "4" # Keep 4 full backups
repo1-retention-full-type: count
repo1-retention-diff: "14" # Keep 14 differentials
repos:
- name: repo1
schedules:
full: "0 2 * * 0" # Weekly full: Sunday 2am
differential: "0 2 * * 1-6" # Daily diff: Mon-Sat 2am
incremental: "0 */6 * * *" # Every 6 hours
s3:
bucket: mycompany-pg-backups
endpoint: s3.eu-west-1.amazonaws.com
region: eu-west-1ম্যানুয়াল ব্যাকআপ এবং
পুনরুদ্ধার করুন# Trigger a manual full backup
kubectl annotate postgrescluster production-db -n databases \
postgres-operator.crunchydata.com/pgbackrest-backup="$(date +%s)" \
--overwrite
# Check backup status
kubectl exec -it production-db-pgha1-0 -n databases -- \
pgbackrest info --stanza=db
# Restore to a specific point in time
# First, update the PostgresCluster spec:
spec:
backups:
pgbackrest:
restore:
enabled: true
repoName: repo1
options:
- --type=time
- --target="2026-04-12 08:30:00+00"
- --target-action=promote
# Apply the restore annotation
kubectl annotate postgrescluster production-db -n databases \
postgres-operator.crunchydata.com/pgbackrest-restore="$(date +%s)" \
--overwriteএকটি PITR পুনরুদ্ধারের সময়, PGO সমস্ত PostgreSQL দৃষ্টান্ত বন্ধ করে, নিকটতম পূর্ণ বা ডিফারেনশিয়াল ব্যাকআপ থেকে পুনরুদ্ধার করে, টার্গেট সময় পর্যন্ত WAL সেগমেন্টগুলি রিপ্লে করে এবং তারপর ক্লাস্টার শুরু করে। পুরো অপারেশনটি অপারেটর দ্বারা সংগঠিত হয় — পৃথক পডগুলিতে কোনও ম্যানুয়াল হস্তক্ষেপের প্রয়োজন নেই।
PgBouncer সংযোগ পুলিং
PostgreSQL প্রতিটি ক্লায়েন্ট সংযোগের জন্য একটি নতুন প্রক্রিয়া তৈরি করে। স্কেলে — শত শত বা হাজার হাজার অ্যাপ্লিকেশন পড প্রতিটি সংযোগ পুল বজায় রাখে — এই মডেলটি ভেঙে যায়। PgBouncer আপনার অ্যাপ্লিকেশন এবং PostgreSQL এর মধ্যে বসে, অনেক ক্লায়েন্ট সংযোগকে অল্প সংখ্যক সার্ভার সংযোগের মাধ্যমে মাল্টিপ্লেক্স করে।
PGO PgBouncerকে তার নিজস্ব পরিষেবার সাথে একটি পৃথক স্থাপনার হিসাবে স্থাপন করে।production-db-pgbouncerপরিষেবা হল যা আপনার অ্যাপ্লিকেশনগুলির সাথে সংযুক্ত হওয়া উচিত, সরাসরি PostgreSQL প্রাথমিক পরিষেবা নয়৷ PgBouncer তিনটি পুল মোড সমর্থন করে:
- সেশন পুলিং— ক্লায়েন্ট সংযোগের আজীবনের জন্য একটি ক্লায়েন্টকে একটি সার্ভার সংযোগ বরাদ্দ করা হয়। সবচেয়ে নিরাপদ, কিন্তু কম দক্ষ।
- লেনদেন পুলিং— একটি সার্ভার সংযোগ শুধুমাত্র একটি লেনদেনের সময়কালের জন্য বরাদ্দ করা হয়৷ ওয়েব ওয়ার্কলোডের জন্য সবচেয়ে দক্ষ। এটি প্রস্তাবিত ডিফল্ট।
- স্টেটমেন্ট পুলিং— একটি একক স্টেটমেন্টের জন্য একটি সার্ভার সংযোগ বরাদ্দ করা হয়েছে। শুধুমাত্র সাধারণ, অ-লেনদেনমূলক কাজের চাপের জন্য কাজ করে।
proxy:
pgBouncer:
replicas: 3
config:
global:
pool_mode: transaction
max_client_conn: "2000"
default_pool_size: "30"
min_pool_size: "10"
reserve_pool_size: "10"
reserve_pool_timeout: "3"
server_idle_timeout: "300"
server_lifetime: "3600"
client_idle_timeout: "600"
tcp_keepalive: "1"
tcp_keepidle: "30"
tcp_keepintvl: "10"
tcp_keepcnt: "3"
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
postgres-operator.crunchydata.com/role: pgbouncertcp_keepaliveসেটিংস নোট করুন — যখন PgBouncer একটি ক্লাউড লোড ব্যালেন্সার বা Kubernetes পরিষেবার পিছনে চলে তখন এগুলি গুরুত্বপূর্ণ৷ আক্রমনাত্মক রাখা ছাড়া, নিষ্ক্রিয় সংযোগগুলি মধ্যবর্তী নেটওয়ার্ক উপাদানগুলির দ্বারা নিঃশব্দে বাদ দেওয়া হতে পারে, যার ফলে পরবর্তী ক্যোয়ারী প্রয়াসে অ্যাপ্লিকেশন ত্রুটি দেখা দেয়।
pgMonitor এবং Prometheus/Grafana মনিটরিং
PGO-এর মনিটরিং ইন্টিগ্রেশন প্রতিটি PostgreSQL পডে একটিcrunchy-postgres-exporterসাইডকার স্থাপন করে। এই রপ্তানিকারক PostgreSQL-এর অভ্যন্তরীণ পরিসংখ্যানের দৃশ্যগুলিকে স্ক্র্যাপ করে এবং পোর্ট 9187-এ Prometheus মেট্রিক্স হিসাবে তাদের প্রকাশ করে৷ রপ্তানিকারক বাক্সের বাইরে 150 টিরও বেশি মেট্রিক্স কভার করে, যার মধ্যে সংযোগ, প্রতিলিপি ল্যাগ, লেনদেনের হার, ক্যাশে হিট অনুপাত, টেবিল এবং সূচক পরিসংখ্যান, WAL জেনারেশন, কন্টেন্ট রেট সহ।
# ServiceMonitor for Prometheus Operator auto-discovery
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: postgres-monitoring
namespace: databases
labels:
release: kube-prometheus-stack
spec:
selector:
matchLabels:
postgres-operator.crunchydata.com/cluster: production-db
postgres-operator.crunchydata.com/crunchy-postgres-exporter: "true"
endpoints:
- port: exporter
interval: 15s
scrapeTimeout: 10sক্রাঞ্চি ডেটা পূর্ব-নির্মিত Grafana ড্যাশবোর্ডগুলির একটি সেট সরবরাহ করে যা আপনি সরাসরি আমদানি করতে পারেন৷ এইগুলি PostgreSQL ওভারভিউ, রেপ্লিকেশন স্ট্যাটাস, pgBackRest ব্যাকআপ স্ট্যাটাস, PgBouncer পরিসংখ্যান এবং পড-লেভেল রিসোর্স ব্যবহার কভার করে। এগুলিকে Grafana এর ড্যাশবোর্ড প্রভিশনিংয়ের মাধ্যমে বা ক্রাঞ্চি ডেটা উদাহরণ সংগ্রহস্থল থেকে ম্যানুয়ালি আমদানি করুন।
# Install Grafana dashboards as ConfigMaps
kubectl create configmap grafana-pg-overview \
--from-file=pg-overview.json=dashboards/pg-overview.json \
-n monitoring
kubectl label configmap grafana-pg-overview grafana_dashboard=1 -n monitoringPostgreSQLএর জন্যসমালোচনামূলক সতর্কতার নিয়মapiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: postgres-alerts
namespace: databases
labels:
release: kube-prometheus-stack
spec:
groups:
- name: postgresql-health
rules:
- alert: PostgresReplicationLagHigh
expr: ccp_replication_lag_size_bytes > 104857600
for: 5m
labels:
severity: warning
annotations:
summary: "Replica {{ $labels.pod }} lag exceeds 100MB"
- alert: PostgresConnectionsExhausted
expr: ccp_connection_stats_active / ccp_connection_stats_max_connections > 0.85
for: 2m
labels:
severity: critical
annotations:
summary: "PostgreSQL connections above 85% capacity"
- alert: PostgresDeadlockDetected
expr: rate(ccp_stat_database_deadlocks[5m]) > 0
for: 1m
labels:
severity: warning
annotations:
summary: "Deadlocks detected in {{ $labels.datname }}"
- alert: PostgresCacheHitRatioLow
expr: ccp_stat_database_blks_hit / (ccp_stat_database_blks_hit + ccp_stat_database_blks_read) < 0.95
for: 10m
labels:
severity: warning
annotations:
summary: "Cache hit ratio below 95% for {{ $labels.datname }}"
- alert: PgBackRestStaleBackup
expr: time() - ccp_backrest_last_full_backup_time_since_completion_seconds > 604800
for: 1h
labels:
severity: critical
annotations:
summary: "No full backup in the last 7 days"
AWS EKS স্থাপনা
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: postgres-alerts
namespace: databases
labels:
release: kube-prometheus-stack
spec:
groups:
- name: postgresql-health
rules:
- alert: PostgresReplicationLagHigh
expr: ccp_replication_lag_size_bytes > 104857600
for: 5m
labels:
severity: warning
annotations:
summary: "Replica {{ $labels.pod }} lag exceeds 100MB"
- alert: PostgresConnectionsExhausted
expr: ccp_connection_stats_active / ccp_connection_stats_max_connections > 0.85
for: 2m
labels:
severity: critical
annotations:
summary: "PostgreSQL connections above 85% capacity"
- alert: PostgresDeadlockDetected
expr: rate(ccp_stat_database_deadlocks[5m]) > 0
for: 1m
labels:
severity: warning
annotations:
summary: "Deadlocks detected in {{ $labels.datname }}"
- alert: PostgresCacheHitRatioLow
expr: ccp_stat_database_blks_hit / (ccp_stat_database_blks_hit + ccp_stat_database_blks_read) < 0.95
for: 10m
labels:
severity: warning
annotations:
summary: "Cache hit ratio below 95% for {{ $labels.datname }}"
- alert: PgBackRestStaleBackup
expr: time() - ccp_backrest_last_full_backup_time_since_completion_seconds > 604800
for: 1h
labels:
severity: critical
annotations:
summary: "No full backup in the last 7 days"AWS EKS-এ PGO স্থাপন করার জন্য স্থায়ী ভলিউমের জন্য EBS CSI ড্রাইভার এবং S3 ব্যাকআপ অ্যাক্সেসের জন্য IAM রোলস ফর সার্ভিস অ্যাকাউন্টস (IRSA) কনফিগার করা প্রয়োজন। এই পদ্ধতি Kubernetes গোপনীয়তায় দীর্ঘস্থায়ী AWS শংসাপত্র সংরক্ষণ করা এড়িয়ে যায়।
# Install the EBS CSI driver (required for gp3 volumes)
eksctl create addon --name aws-ebs-csi-driver --cluster my-cluster --region eu-west-1 \
--service-account-role-arn arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
# Create a gp3 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3-csi
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true# IAM policy for pgBackRest S3 access
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mycompany-pg-backups",
"arn:aws:s3:::mycompany-pg-backups/*"
]
}
]
}
# Create an IRSA-enabled service account
eksctl create iamserviceaccount \
--name pgbackrest-sa \
--namespace databases \
--cluster my-cluster \
--attach-policy-arn arn:aws:iam::111122223333:policy/PGBackRestS3Policy \
--approvePostgresClusterস্পেকে, S3 বালতি এবং অঞ্চল উল্লেখ করুন। PGO স্বয়ংক্রিয়ভাবে পডের পরিষেবা অ্যাকাউন্টের শংসাপত্রগুলি (IRSA-এর মাধ্যমে) ব্যবহার করবে — কোনও স্পষ্ট অ্যাক্সেস কীগুলির প্রয়োজন নেই৷
backups:
pgbackrest:
repos:
- name: repo1
s3:
bucket: mycompany-pg-backups
endpoint: s3.eu-west-1.amazonaws.com
region: eu-west-1মাল্টি-AZ স্থিতিস্থাপকতার জন্য, নিশ্চিত করুন যে আপনার EKS নোড গোষ্ঠীগুলি অন্তত তিনটি প্রাপ্যতা অঞ্চলে বিস্তৃত রয়েছে এবং তাদের জুড়ে PostgreSQL পডগুলি বিতরণ করতে আগে দেখানো টপোলজি স্প্রেড সীমাবদ্ধতাগুলি ব্যবহার করুন৷
Azure AKS স্থাপনা
Azure AKS স্থায়ী স্টোরেজের জন্য পরিচালিত ডিস্ক এবং pgBackRest ব্যাকআপের জন্য Azure ব্লব স্টোরেজ ব্যবহার করে। প্রস্তাবিত স্টোরেজ ক্লাস ডাটাবেস ওয়ার্কলোডের জন্য প্রিমিয়াম SSD v2 বা প্রিমিয়াম LRS ব্যবহার করে।
# StorageClass for Azure Premium SSD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-premium-ssd
provisioner: disk.csi.azure.com
parameters:
skuName: Premium_LRS
kind: Managed
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# pgBackRest with Azure Blob Storage
backups:
pgbackrest:
configuration:
- secret:
name: pgbackrest-azure-creds
global:
repo1-azure-account: mystorageaccount
repo1-retention-full: "7"
repos:
- name: repo1
schedules:
full: "0 2 * * 0"
differential: "0 2 * * 1-6"
azure:
container: pg-backups
---
# Secret with Azure credentials
apiVersion: v1
kind: Secret
metadata:
name: pgbackrest-azure-creds
namespace: databases
stringData:
azure.conf: |
[global]
repo1-azure-key=BASE64_STORAGE_ACCOUNT_KEYওয়ার্কলোড আইডেন্টিটির জন্য (AWS IRSA এর Azure সমতুল্য), OIDC ইস্যুকারীর সাথে AKS ক্লাস্টার কনফিগার করুন এবং pgBackRest পরিষেবা অ্যাকাউন্টের জন্য একটি ফেডারেটেড পরিচয় শংসাপত্র তৈরি করুন৷ এটি গোপনে স্টোরেজ অ্যাকাউন্ট কীগুলির প্রয়োজনীয়তা দূর করে।
GCP GKE ডিপ্লয়মেন্ট
GKE স্টোরেজের জন্য Persistent Disk (pd-ssd) এবং pgBackRest ব্যাকআপের জন্য GCS ব্যবহার করে। নিরাপদ, চাবিহীন প্রমাণীকরণের জন্য GKE ওয়ার্কলোড আইডেন্টিটি Kubernetes পরিষেবা অ্যাকাউন্টগুলিকে Google ক্লাউড পরিষেবা অ্যাকাউন্টগুলিতে ম্যাপ করে৷
# StorageClass for GKE SSD Persistent Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: pd-ssd
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-ssd
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# pgBackRest with GCS
backups:
pgbackrest:
configuration:
- secret:
name: pgbackrest-gcs-creds
repos:
- name: repo1
gcs:
bucket: mycompany-pg-backups
---
# GCS service account key secret
apiVersion: v1
kind: Secret
metadata:
name: pgbackrest-gcs-creds
namespace: databases
stringData:
gcs-key.json: |
{
"type": "service_account",
"project_id": "my-project",
...
}# Enable Workload Identity on GKE
gcloud container clusters update my-cluster \
--workload-pool=my-project.svc.id.goog
# Create and bind IAM service account
gcloud iam service-accounts create pgbackrest-gcs \
--display-name="pgBackRest GCS Access"
gcloud projects add-iam-policy-binding my-project \
--member="serviceAccount:pgbackrest-gcs@my-project.iam.gserviceaccount.com" \
--role="roles/storage.objectAdmin"
gcloud iam service-accounts add-iam-policy-binding \
pgbackrest-gcs@my-project.iam.gserviceaccount.com \
--role="roles/iam.workloadIdentityUser" \
--member="serviceAccount:my-project.svc.id.goog[databases/production-db-pgbackrest]"মাল্টি-রিজিওন ডিজাস্টার রিকভারি
PGO ক্রস-অঞ্চল দুর্যোগ পুনরুদ্ধারের জন্য স্ট্যান্ডবাই ক্লাস্টার সমর্থন করে। একটি স্ট্যান্ডবাই ক্লাস্টার ক্রমাগত প্রাথমিক ক্লাস্টারের pgBackRest সংগ্রহস্থল থেকে WAL-কে রিপ্লে করে, একটি উষ্ণ অনুলিপি বজায় রাখে যা একটি আঞ্চলিক ব্যর্থতার ক্ষেত্রে একটি স্বাধীন প্রাথমিকে উন্নীত করা যেতে পারে।
# Standby cluster in Region B
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: production-db-standby
namespace: databases
spec:
postgresVersion: 16
image: registry.crunchydata.com/crunchydata/crunchy-postgres:ubi8-16.6-1
standby:
enabled: true
repoName: repo1
instances:
- name: pgha1
replicas: 2
dataVolumeClaimSpec:
storageClassName: gp3-csi
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
backups:
pgbackrest:
image: registry.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.54.1-0
configuration:
- secret:
name: pgbackrest-s3-creds
repos:
- name: repo1
s3:
bucket: mycompany-pg-backups
endpoint: s3.us-east-1.amazonaws.com
region: us-east-1একটি দুর্যোগের সময় স্ট্যান্ডবাই ক্লাস্টার প্রচার করতে,standby.enabled: falseস্পেকে সেট করুন এবং পরিবর্তনটি প্রয়োগ করুন। PGO স্ট্যান্ডবাইকে একটি স্বাধীন প্রাথমিক ক্লাস্টারে উন্নীত করে। এই প্রচারটি অপরিবর্তনীয় — মূল প্রাথমিক অঞ্চল পুনরুদ্ধার করার পরে আপনাকে স্ক্র্যাচ থেকে প্রতিলিপি সম্পর্ক পুনর্নির্মাণ করতে হবে।
বেয়ার মেটাল k3s/Rancher ডিপ্লয়মেন্ট
রেঞ্চার ম্যানেজমেন্ট সহ বেয়ার মেটাল k3s-এ PGO চালানোর জন্য স্টোরেজ এবং নেটওয়ার্কিং-এ সতর্ক মনোযোগ প্রয়োজন, যেহেতু আপনার কাছে ক্লাউড-প্রোভাইডার পরিচালিত ডিস্ক বা লোড ব্যালেন্সার নেই।
লংহর্ন স্টোরেজ
লংহর্ন হল Kubernetes এর জন্য একটি হালকা ওজনের, বিতরণকৃত ব্লক স্টোরেজ সিস্টেম যা বেয়ার মেটাল পরিবেশের জন্য আদর্শ। এটি স্থায়িত্বের জন্য একাধিক নোড জুড়ে ভলিউম প্রতিলিপি করে এবং স্ন্যাপশট, ব্যাকআপ এবং ভলিউম সম্প্রসারণ সমর্থন করে।
# Install Longhorn via Helm
helm repo add longhorn https://charts.longhorn.io
helm repo update
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--set defaultSettings.defaultReplicaCount=3 \
--set defaultSettings.storageOverProvisioningPercentage=100 \
--set defaultSettings.storageMinimalAvailablePercentage=15
---
# Longhorn StorageClass for PostgreSQL
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-pg
provisioner: driver.longhorn.io
parameters:
numberOfReplicas: "3"
staleReplicaTimeout: "2880"
fsType: ext4
dataLocality: best-effort
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Retainলোড ব্যালেন্স করার জন্যMetalLB
# Install MetalLB
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb --namespace metallb-system --create-namespace
---
# Configure IP address pool
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: pg-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.210
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: pg-l2
namespace: metallb-system
spec:
ipAddressPools:
- pg-poolMetalLB কনফিগার করা হলে,LoadBalancerটাইপের PGO পরিষেবাগুলি আপনার পুল থেকে IP ঠিকানাগুলি গ্রহণ করবে, PostgreSQL প্রাথমিক এবং PgBouncer এন্ডপয়েন্টগুলিকে ম্যানুয়াল পোর্ট ফরওয়ার্ডিং ছাড়াই আপনার নেটওয়ার্ক থেকে সরাসরি পৌঁছানোর যোগ্য করে তুলবে৷
pgBackRest# For environments without S3/GCS/Azure Blob, use a PVC-based repo
backups:
pgbackrest:
repos:
- name: repo1
schedules:
full: "0 2 * * 0"
differential: "0 2 * * 1-6"
volume:
volumeClaimSpec:
storageClassName: longhorn-pg
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 200Gi
# For environments without S3/GCS/Azure Blob, use a PVC-based repo
backups:
pgbackrest:
repos:
- name: repo1
schedules:
full: "0 2 * * 0"
differential: "0 2 * * 1-6"
volume:
volumeClaimSpec:
storageClassName: longhorn-pg
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 200Giএয়ার-গ্যাপড পরিবেশের জন্য, আপনি একটি সেকেন্ডারি pgBackRest রিপোজিটরিও কনফিগার করতে পারেন যা একটি NFS শেয়ারে ব্যাকআপ পাঠায় বা ক্লাউড নির্ভরতা ছাড়াই একটি অফ-ক্লাস্টার ব্যাকআপ কপি প্রদান করে অন-প্রিমিসেস চলমান একটি MinIO উদাহরণে।
TLS/SSL এনক্রিপশন কনফিগারেশন
PGO ডিফল্টরূপে সমস্ত অভ্যন্তরীণ যোগাযোগের জন্য স্ব-স্বাক্ষরিত TLS শংসাপত্র তৈরি করে — PostgreSQL দৃষ্টান্ত, প্রতিলিপি, pgBackRest, এবং PgBouncer সমস্ত কোনও ম্যানুয়াল শংসাপত্র ব্যবস্থাপনা ছাড়াই এনক্রিপ্ট করা চ্যানেলগুলির মাধ্যমে যোগাযোগ করে৷ যাইহোক, উৎপাদন পরিবেশের জন্য আপনি সাধারণত আপনার প্রতিষ্ঠানের CA দ্বারা স্বাক্ষরিত শংসাপত্র ব্যবহার করতে চান।
# Create a TLS secret with your CA-signed certificates
kubectl create secret tls production-db-tls \
--cert=server.crt \
--key=server.key \
-n databases
kubectl create secret generic production-db-ca \
--from-file=ca.crt=ca.crt \
-n databases
---
# Reference in PostgresCluster spec
spec:
customTLSSecret:
name: production-db-tls
customReplicationTLSSecret:
name: production-db-replication-tlsPGOssl = onএর সাথে PostgreSQL কনফিগার করে এবং উপযুক্তssl_cert_file,ssl_key_file, এবংssl_ca_fileপ্যারামিটার সেট করে৷ PgBouncer একইভাবে ক্লায়েন্ট সংযোগের জন্য TLS প্রয়োজন এবং PostgreSQL ব্যাকএন্ডের সাথে সংযোগ করার সময় TLS ব্যবহার করার জন্য কনফিগার করা হয়েছে।
# Enforce TLS for all client connections via pg_hba.conf
spec:
patroni:
dynamicConfiguration:
postgresql:
pg_hba:
- hostssl all all 0.0.0.0/0 scram-sha-256
- hostssl replication all 0.0.0.0/0 scram-sha-256কাস্টম PostgreSQL কনফিগারেশন
PGO প্যাট্রোনি ডায়নামিক কনফিগারেশন বিভাগের মাধ্যমে PostgreSQL কনফিগারেশন প্রকাশ করে। এটি প্রস্তাবিত পদ্ধতি কারণ Patroni নিশ্চিত করে যে সমস্ত দৃষ্টান্ত সামঞ্জস্যপূর্ণ কনফিগারেশন বজায় রাখে এবং প্রয়োজন হলে পুনরায় আরম্ভ করা পরিচালনা করে।
patroni:
dynamicConfiguration:
postgresql:
parameters:
# Memory
shared_buffers: 4GB
effective_cache_size: 12GB
work_mem: 64MB
maintenance_work_mem: 1GB
huge_pages: "try"
# WAL
wal_buffers: 128MB
min_wal_size: 2GB
max_wal_size: 8GB
checkpoint_completion_target: 0.9
wal_compression: lz4
# Query Planning
random_page_cost: 1.1
effective_io_concurrency: 200
default_statistics_target: 200
# Parallelism
max_worker_processes: 16
max_parallel_workers_per_gather: 4
max_parallel_workers: 8
max_parallel_maintenance_workers: 4
# Connections
max_connections: 200
idle_in_transaction_session_timeout: 60000
statement_timeout: 300000
# Logging
log_min_duration_statement: 250
log_checkpoints: "on"
log_connections: "on"
log_disconnections: "on"
log_lock_waits: "on"
log_temp_files: 0
log_autovacuum_min_duration: 0
# Autovacuum Tuning
autovacuum_max_workers: 5
autovacuum_naptime: 30
autovacuum_vacuum_cost_limit: 800
autovacuum_vacuum_scale_factor: 0.02
autovacuum_analyze_scale_factor: 0.01এই প্যারামিটারগুলি 16 CPU কোর এবং 32 GB RAM PostgreSQL-এ উত্সর্গীকৃত একটি নোড ধরে নেয়।shared_buffersকে উপলব্ধ RAM এর প্রায় 25% এবংeffective_cache_sizeমোটামুটি 75% এ সামঞ্জস্য করুন৷ WAL এবং চেকপয়েন্ট সেটিংস রাইট-হেভি ওয়ার্কলোডের জন্য টিউন করা হয়েছে — রিড-হেভি সিস্টেমের জন্যmax_wal_sizeকম করুন যেখানে চেকপয়েন্ট ফ্রিকোয়েন্সি কম গুরুত্বপূর্ণ।
ব্যবহারকারী এবং ডেটাবেস ব্যবস্থাপনা
PGOPostgresClusterস্পেকেরusersবিভাগের মাধ্যমে ঘোষণামূলকভাবে PostgreSQL ব্যবহারকারী এবং ডাটাবেস পরিচালনা করে। আপনি যখন একজন ব্যবহারকারীকে যুক্ত করেন, তখন PGO PostgreSQL-এ ভূমিকা তৈরি করে, একটি এলোমেলো পাসওয়ার্ড তৈরি করে এবং একটি Kubernetes গোপনে শংসাপত্রগুলি সঞ্চয় করে৷
users:
- name: appuser
databases: ["appdb"]
options: "NOSUPERUSER NOCREATEDB NOCREATEROLE"
- name: readonly
databases: ["appdb"]
options: "NOSUPERUSER NOCREATEDB NOCREATEROLE"
- name: migrations
databases: ["appdb"]
options: "NOSUPERUSER CREATEDB"
- name: monitoring
databases: ["postgres"]
options: "NOSUPERUSER LOGIN"
---
# Access credentials from the generated secret
kubectl get secret production-db-pguser-appuser -n databases -o jsonpath='{.data.password}' | base64 -d
# The secret also contains a full connection URI
kubectl get secret production-db-pguser-appuser -n databases -o jsonpath='{.data.uri}' | base64 -d
# postgresql://appuser:PASSWORD@production-db-primary.databases.svc:5432/appdbশুধুমাত্র-পঠন অ্যাক্সেস দেওয়ার জন্য, ক্লাস্টার তৈরিতে SQL চালানোর জন্যdatabaseInitSQLবৈশিষ্ট্যটি ব্যবহার করুন যা একটি শুধুমাত্র-পঠন ভূমিকা তৈরি করে এবং এটিকে সমস্ত টেবিলে SELECT মঞ্জুর করে৷
# init.sql ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: init-sql-configmap
namespace: databases
data:
init.sql: |
-- Read-only role for reporting users
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
GRANT CONNECT ON DATABASE appdb TO readonly;
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
-- Extensions
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE EXTENSION IF NOT EXISTS pg_trgm;রোলিং আপডেট এবং প্রধান সংস্করণ আপগ্রেড
PGO রোলিং আপডেটের মাধ্যমে ক্ষুদ্র সংস্করণ আপগ্রেড পরিচালনা করে। আপনি যখনPostgresClusterস্পেকের ইমেজ ট্যাগটিকে একটি নতুন প্যাচ রিলিজে পরিবর্তন করেন, তখন PGO প্রতিলিপি দিয়ে শুরু করে এবং প্রাইমারি দিয়ে শেষ করে (যা ডাউনটাইম কমাতে একটি Patroni সুইচওভার ট্রিগার করে) একের পর এক দৃষ্টান্ত আপডেট করে।
# Minor version upgrade: change the image tag
spec:
image: registry.crunchydata.com/crunchydata/crunchy-postgres:ubi8-16.7-0প্রধান সংস্করণ আপগ্রেডের (যেমন, PostgreSQL 15 থেকে 16) প্রয়োজনpg_upgrade, যা PGO একটি পৃথকPGUpgradeCRD এর মাধ্যমে অর্কেস্ট্রেট করে।
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PGUpgrade
metadata:
name: production-db-upgrade
namespace: databases
spec:
postgresClusterName: production-db
fromPostgresVersion: 15
toPostgresVersion: 16
image: registry.crunchydata.com/crunchydata/crunchy-upgrade:ubi8-5.7.2-0আপগ্রেড প্রক্রিয়া বিদ্যমান ক্লাস্টার বন্ধ করে দেয়, হার্ড লিঙ্ক ব্যবহার করে একটি ইন-প্লেস আপগ্রেড করতেpg_upgrade --linkচালায় (ডেটা কপি করা কম করে), আপগ্রেড যাচাই করে এবং নতুন সংস্করণে ক্লাস্টার শুরু করে। একটি প্রধান সংস্করণ আপগ্রেড শুরু করার আগে সর্বদা একটি সম্পূর্ণ ব্যাকআপ নিন এবং প্রথমে একটি অ-উৎপাদন ক্লাস্টারে পদ্ধতিটি পরীক্ষা করুন৷
# Pre-upgrade checklist
# 1. Take a full backup
kubectl annotate postgrescluster production-db -n databases \
postgres-operator.crunchydata.com/pgbackrest-backup="$(date +%s)" \
--overwrite
# 2. Verify backup completed
kubectl exec -it production-db-pgha1-0 -n databases -- pgbackrest info --stanza=db
# 3. Shutdown the cluster (set replicas to 0 or use PGO shutdown annotation)
kubectl annotate postgrescluster production-db -n databases \
postgres-operator.crunchydata.com/shutdown="$(date +%s)" \
--overwrite
# 4. Apply the PGUpgrade resource
kubectl apply -f pg-upgrade.yaml
# 5. Update the PostgresCluster spec with the new version and image
# 6. Remove the shutdown annotation to start the upgraded clusterউৎপাদন টিউনিং সুপারিশ
উৎপাদনে পিজিও চালানোর জন্য প্রাথমিক স্থাপনার বাইরে বেশ কয়েকটি অপারেশনাল ক্ষেত্রে মনোযোগ দেওয়া প্রয়োজন।
স্টোরেজ পারফরম্যান্স
- পৃথক ডেটা এবং WAL ভলিউম: একটি ডেডিকেটেড PVC-এ WAL স্থাপন করতে সর্বদা
walVolumeClaimSpecব্যবহার করুন। এটি লিখিত-ভারী WAL কার্যকলাপকে ডেটা I/O-এর সাথে প্রতিদ্বন্দ্বিতা করতে বাধা দেয়। - বেয়ার মেটালে উচ্চ-IOPS স্টোরেজ: gp3 (AWS), প্রিমিয়াম SSD v2 (Azure), pd-ssd (GCP), বা NVMe-ব্যাকড লংহর্ন ব্যবহার করুন। PostgreSQL-এর র্যান্ডম I/O প্যাটার্নগুলি কম লেটেন্সি স্টোরেজের দাবি করে।
- ভলিউম এক্সটেনশন: আপনার স্টোরেজক্লাসে
allowVolumeExpansion: trueআছে তা নিশ্চিত করুন। PGO সমর্থিত স্টোরেজ প্রদানকারীর উপর অ-ব্যহতভাবে PVCs প্রসারিত করতে পারে।
পড ব্যাহত বাজেট
PGO স্বয়ংক্রিয়ভাবে আপনার PostgreSQL দৃষ্টান্তগুলির জন্য PDB তৈরি করে, কিন্তু যাচাই করুন যে সেগুলি আপনার HA প্রয়োজনীয়তার জন্য উপযুক্ত।
# Check PDBs
kubectl get pdb -n databases
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
production-db-pgha1 1 N/A 2 7dরিসোর্স অনুরোধ এবং সীমা
৷- OOM হত্যা প্রতিরোধ করতে এবং নিশ্চিত QoS ক্লাস নিশ্চিত করতে ডাটাবেস পডের সীমার সমান মেমরি অনুরোধ সেট করুন।
- CPU অনুরোধগুলি রক্ষণশীলভাবে সেট করুন এবং ভ্যাকুয়াম বা রক্ষণাবেক্ষণ অপারেশনের সময় বিস্ফোরণের অনুমতি দেওয়ার জন্য উচ্চতর সীমাবদ্ধ করুন।
- pgMonitor মেট্রিক্সের মাধ্যমে প্রকৃত ব্যবহার মনিটর করুন এবং ত্রৈমাসিক সমন্বয় করুন।
সংযোগ ব্যবস্থাপনা
- সর্বদা PgBouncer এর মাধ্যমে সংযোগ করুন, সরাসরি PostgreSQL এর সাথে নয়।
- PostgreSQL-এ
max_connectionsসেট করুন এমন একটি মান যা PgBouncer এর পুল সাইজ প্লাস সিস্টেম কানেকশন (প্রতিলিপি, মনিটরিং, সুপার ইউজার) জন্য অ্যাকাউন্ট করে। - ওয়েব অ্যাপ্লিকেশনের জন্য লেনদেন পুলিং মোড ব্যবহার করুন৷ আপনার অ্যাপ্লিকেশন প্রস্তুত বিবৃতি বা সেশন-স্তরের অবস্থা (যেমন,
SETকমান্ড, অস্থায়ী টেবিল) ব্যবহার করলেই সেশন পুলিং-এ স্যুইচ করুন।
ব্যাকআপ বৈধতা
- নিয়মিতভাবে ব্যাকআপ থেকে একটি ক্লোন ক্লাস্টার তৈরি করে এবং অ্যাপ্লিকেশন-স্তরের ধোঁয়া পরীক্ষা চালিয়ে পুনরুদ্ধারের পরীক্ষা করে।
PgBackRestStaleBackupসতর্কতা নিরীক্ষণ করুন যাতে ব্যাকআপগুলি সময়সূচীতে সম্পূর্ণ হচ্ছে তা নিশ্চিত করুন৷- নির্দিষ্ট টাইমস্ট্যাম্পে পুনরুদ্ধার করে এবং ডেটা সামঞ্জস্য যাচাই করে PITR যাচাই করুন।
# Clone cluster for backup validation
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: backup-validation
namespace: databases
spec:
postgresVersion: 16
image: registry.crunchydata.com/crunchydata/crunchy-postgres:ubi8-16.6-1
dataSource:
postgresCluster:
clusterName: production-db
repoName: repo1
options:
- --type=time
- --target="2026-04-12 06:00:00+00"
instances:
- name: pgha1
replicas: 1
dataVolumeClaimSpec:
storageClassName: gp3-csi
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
backups:
pgbackrest:
repos:
- name: repo1
volume:
volumeClaimSpec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Giনেটওয়ার্ক নীতিগুলি
৷# Restrict PostgreSQL traffic to known namespaces
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-network-policy
namespace: databases
spec:
podSelector:
matchLabels:
postgres-operator.crunchydata.com/cluster: production-db
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
app-access: database
- podSelector:
matchLabels:
postgres-operator.crunchydata.com/cluster: production-db
ports:
- port: 5432
protocol: TCP
- port: 9187
protocol: TCPমনিটরিং চেকলিস্ট
- রেপ্লিকেশন ল্যাগ: যেকোন রেপ্লিকা 100MB বা 60 সেকেন্ড ল্যাগ অতিক্রম করলে সতর্ক করুন৷
- সংযোগ স্যাচুরেশন: সক্রিয় সংযোগগুলি
max_connectionsএর 80% অতিক্রম করলে সতর্কতা। - লেনদেনের হারের অসঙ্গতিগুলি: আপনার TPS বেসলাইন এবং উল্লেখযোগ্য বিচ্যুতির বিষয়ে সতর্কতা।
- ডিস্ক ব্যবহার: ভলিউম সম্প্রসারণ রানবুক সহ 70% এবং 85% থ্রেশহোল্ডে সতর্কতা।
- ব্যাকআপ সতেজতা: শেষ পূর্ণ ব্যাকআপ আপনার আরপিও উইন্ডোর থেকে পুরানো হলে সতর্ক করুন৷
- লক বিতর্ক: দীর্ঘ সময় ধরে রাখা লকগুলিতে সতর্কতা (> 30 সেকেন্ড) যা অ্যাপ্লিকেশন বাগ নির্দেশ করতে পারে৷
- অটোভ্যাকুয়াম হেলথ: 24 ঘন্টারও বেশি সময় টেবিল ভ্যাকুয়াম করা না হলে সতর্ক করুন৷
দুর্যোগ পুনরুদ্ধার রানবুক
একটি দুর্যোগ পুনরুদ্ধারের পরিকল্পনা শুধুমাত্র তখনই কার্যকর যদি এটি পরীক্ষা করা হয়। নিম্নলিখিত রানবুক সাধারণ ব্যর্থতার পরিস্থিতি থেকে পুনরুদ্ধার করার জন্য মূল পদ্ধতির রূপরেখা দেয়।
একক পড ব্যর্থতা
Patroni এবং Kubernetes এটি স্বয়ংক্রিয়ভাবে পরিচালনা করে। প্রাথমিক পড ক্র্যাশ হলে, Patroni 10-30 সেকেন্ডের মধ্যে একটি প্রতিরূপ প্রচার করে। Kubernetes ব্যর্থ পড পুনরায় চালু করে, যা একটি প্রতিরূপ হিসাবে পুনরায় যোগদান করে।
একক নোড ব্যর্থতা
যদি একটি PostgreSQL পড চলমান একটি নোড মারা যায়, Kubernetes একটি সুস্থ নোডে পডটিকে পুনরায় নির্ধারণ করে৷ পডটি তার বিদ্যমান PVC এর সাথে সংযুক্ত থাকে (যদি স্টোরেজ নেটওয়ার্ক-সংযুক্ত থাকে) বা ব্যাকআপ থেকে পুনরুদ্ধার করা হয় (যদি স্থানীয় স্টোরেজ ব্যবহার করা হয়)। পড অ্যান্টি-অ্যাফিনিটি নিয়মগুলি নিশ্চিত করে যে অবশিষ্ট দৃষ্টান্তগুলি ট্র্যাফিক পরিবেশন চালিয়ে যাচ্ছে।
সম্পূর্ণ ক্লাস্টার লস
যদি পুরো Kubernetes ক্লাস্টারটি হারিয়ে যায়, একটি নতুন ক্লাস্টার স্থাপন করুন, PGO ইনস্টল করুন এবং একটিPostgresClusterব্যাকআপ সংগ্রহস্থলের দিকে নির্দেশ করে একটি নতুন PostgresCluster তৈরি করুন৷ PGO সর্বশেষ ব্যাকআপ পুনরুদ্ধার করে এবং WAL-কে সাম্প্রতিক উপলব্ধ পয়েন্টে রিপ্লে করে।
আঞ্চলিক ব্যর্থতা
যদি প্রাথমিক অঞ্চল হারিয়ে যায়,standby.enabled: falseসেট করে স্ট্যান্ডবাই ক্লাস্টার প্রচার করুন। নতুন প্রাথমিক অঞ্চলে নির্দেশ করতে আপনার DNS বা লোড ব্যালেন্সার আপডেট করুন। একবার আসল অঞ্চলটি পুনরুদ্ধার হয়ে গেলে, আপনি বিপরীতে স্ট্যান্ডবাই সম্পর্ক পুনর্নির্মাণ করতে পারেন।
# Promote standby cluster
kubectl patch postgrescluster production-db-standby -n databases --type merge \
-p '{"spec":{"standby":{"enabled":false}}}'
# Verify the cluster is now an independent primary
kubectl exec -it production-db-standby-pgha1-0 -n databases -- patronictl listঅপারেশনাল কমান্ড দ্রুত রেফারেন্স
# Cluster status
kubectl get postgrescluster -n databases
kubectl describe postgrescluster production-db -n databases
# Patroni status
kubectl exec -it production-db-pgha1-0 -n databases -- patronictl list
kubectl exec -it production-db-pgha1-0 -n databases -- patronictl history
# Connect to PostgreSQL
kubectl exec -it production-db-pgha1-0 -n databases -- psql -U postgres
# Backup info
kubectl exec -it production-db-pgha1-0 -n databases -- pgbackrest info --stanza=db
# Manual backup
kubectl annotate postgrescluster production-db -n databases \
postgres-operator.crunchydata.com/pgbackrest-backup="$(date +%s)" --overwrite
# Restart PostgreSQL (rolling)
kubectl annotate postgrescluster production-db -n databases \
postgres-operator.crunchydata.com/restart="$(date +%s)" --overwrite
# Logs
kubectl logs production-db-pgha1-0 -n databases -c database
kubectl logs production-db-pgha1-0 -n databases -c pgbackrest
kubectl logs production-db-pgha1-0 -n databases -c exporter
# PgBouncer status
kubectl exec -it $(kubectl get pod -l postgres-operator.crunchydata.com/role=pgbouncer -n databases -o name | head -1) -n databases -- psql -U pgbouncer pgbouncer -c "SHOW POOLS;"
# Scale replicas
kubectl patch postgrescluster production-db -n databases --type merge \
-p '{"spec":{"instances":[{"name":"pgha1","replicas":5}]}}'উপসংহার
ক্রাঞ্চি ডেটা PGO Kubernetes-এ PostgreSQL কে একটি অপারেশনাল বোঝা থেকে একটি পরিচালনাযোগ্য, ঘোষণামূলক সিস্টেমে রূপান্তরিত করে।PostgresClusterCRD সমগ্র স্থাপনা ক্যাপচার করে — দৃষ্টান্ত, প্রতিলিপি, ব্যাকআপ, পুলিং, মনিটরিং, TLS — একটি একক সংস্করণ-নিয়ন্ত্রিত সংস্থানে। Patroni যুদ্ধ-পরীক্ষিত স্বয়ংক্রিয় ব্যর্থতা প্রদান করে। pgBackRest যেকোনো ক্লাউড অবজেক্ট স্টোরে পয়েন্ট-ইন-টাইম রিকভারি সহ এন্টারপ্রাইজ-গ্রেড ব্যাকআপ সরবরাহ করে। PgBouncer সংযোগ পুলিং পরিচালনা করে যা PostgreSQL-এর প্রক্রিয়া-প্রতি-সংযোগ মডেল স্কেলে দাবি করে। এবং pgMonitor অপারেশনাল দৃশ্যমানতার জন্য Prometheus এবং Grafana-এ আপনার প্রয়োজনীয় মেট্রিক্স ফিড করে।
AWS EKS, Azure AKS, GCP GKE, এবং বেয়ার মেটাল k3s জুড়ে স্থাপনার ধরণগুলি একই মূলPostgresClusterস্পেক শেয়ার করে — স্টোরেজ ক্লাস, ব্যাকআপ রিপোজিটরি কনফিগারেশন এবং নেটওয়ার্কিং স্তর কী পরিবর্তন করে৷ এই সামঞ্জস্য হল একটি অপারেটর-ভিত্তিক পদ্ধতির আসল মূল্য: আপনার দল একটি টুল, একটি অপারেশনাল মডেল এবং এক সেট রানবুক শিখে যা সর্বত্র কাজ করে।
একটি তিন-ইনস্ট্যান্স ক্লাস্টার, লেনদেন পুলিং মোডে PgBouncer, একটি সাপ্তাহিক পূর্ণ প্লাস দৈনিক ডিফারেনশিয়াল ব্যাকআপ সময়সূচী এবং মূল Prometheus সতর্কতা দিয়ে শুরু করুন। প্রথম দিনে আপনার ব্যাকআপ পুনরুদ্ধার পদ্ধতি যাচাই করুন - যখন আপনার প্রথম প্রয়োজন হবে না। মাল্টি-রিজিয়ন স্ট্যান্ডবাই ক্লাস্টার, সিঙ্ক্রোনাস রেপ্লিকেশন, এবং অ্যাডভান্স টিউনিং-এ আপনার প্রাপ্যতার প্রয়োজনীয়তা এবং অপারেশনাল পরিপক্কতা বাড়ার সাথে সাথে প্রসারিত করুন। অপারেটর মেকানিক্স পরিচালনা করে; আপনার দায়িত্ব হল আপনার কাজের চাপের জন্য সঠিক ট্রেডঅফ করার জন্য স্থাপত্যকে যথেষ্ট ভালভাবে বোঝা।