Zalando Postgres অপারেটরের সাথে PostgreSQL উচ্চ প্রাপ্যতা: মাল্টি-ক্লাউড Kubernetes ডিপ্লোয়মেন্ট গাইড
যেকোন Kubernetes প্ল্যাটফর্মে Zalando অপারেটরের সাথে উৎপাদন-গ্রেড PostgreSQL HA স্থাপন করুন
ভূমিকা: কেন PostgreSQL Kubernetes বিষয়গুলিতে উচ্চ প্রাপ্যতা
উৎপাদনে PostgreSQL চলমান উচ্চ প্রাপ্যতা (HA) দাবি করে। মিনিটের মধ্যে পরিমাপ করা ডাউনটাইম এন্টারপ্রাইজগুলিকে লক্ষ লক্ষ ডলার হারানো রাজস্ব, গ্রাহকের আস্থা নষ্ট করতে এবং পরিষেবা-স্তরের চুক্তি লঙ্ঘন করতে পারে। Kubernetes কনটেইনারাইজড ওয়ার্কলোড অর্কেস্ট্রেট করার জন্য ডি ফ্যাক্টো প্ল্যাটফর্ম হয়ে উঠেছে, কিন্তু Kubernetes-এ PostgreSQL-এর মতো স্টেটফুল পরিষেবাগুলি চালানো অনন্য চ্যালেঞ্জগুলি উপস্থাপন করে: ক্রমাগত স্টোরেজ ব্যবস্থাপনা, নেতা নির্বাচন, স্বয়ংক্রিয় ব্যর্থতা, ব্যাকআপ অর্কেস্ট্রেশন, এবং সংযোগ পুলিং।
Zalando Postgres অপারেটরহল একটি ওপেন-সোর্স, যুদ্ধ-পরীক্ষিত সমাধান যা Zalando-ইউরোপের বৃহত্তম অনলাইন ফ্যাশন খুচরা বিক্রেতা-প্রোডাকশনে শত শত PostgreSQL ক্লাস্টার পরিচালনা করার জন্য নির্মিত। এটি ঐক্যমত্য-ভিত্তিক নেতা নির্বাচনের জন্যPatroni, PostgreSQL কন্টেইনার ইমেজ হিসাবেSpilo, ক্রমাগত সংরক্ষণাগার এবং পয়েন্ট-ইন-টাইম পুনরুদ্ধারের জন্যWAL-G, এবং সংযোগ স্থাপনের জন্যPgBouncerব্যবহার করে৷ একসাথে, এই উপাদানগুলি একটি সম্পূর্ণ স্বয়ংক্রিয়, স্ব-নিরাময়কারী PostgreSQL স্থাপনা প্রদান করে যা যেকোন Kubernetes বিতরণ জুড়ে কাজ করে — AWS EKS, Azure AKS, এবং Google GKE-এর মতো পরিচালিত ক্লাউড পরিষেবা থেকে শুরু করে Rancher-এর সাথে k3s চলমান বেয়ার-মেটাল ক্লাস্টারে৷
এই ব্যাপক নির্দেশিকাটিতে, আমরা Zalando Postgres অপারেটরের আর্কিটেকচার অন্বেষণ করব, একাধিক Kubernetes প্ল্যাটফর্মে ইনস্টলেশন এবং কনফিগারেশনের মাধ্যমে হাঁটব, প্রতিলিপি, ব্যাকআপ, দুর্যোগ পুনরুদ্ধার, মনিটরিং এবং প্রোডাকশন টিউনিংয়ের গভীরে ডুব দেব। শেষ পর্যন্ত, আপনার কাছে যে কোনো Kubernetes অবকাঠামোতে উৎপাদন-গ্রেড PostgreSQL HA ক্লাস্টার স্থাপন ও পরিচালনা করার জ্ঞান থাকবে।
Zalando Postgres অপারেটর আর্কিটেকচার
স্থাপনার আগে আর্কিটেকচার বোঝা অপরিহার্য। Zalando Postgres অপারেটর Kubernetes অপারেটর প্যাটার্ন অনুসরণ করে: এটিpostgresqlটাইপের কাস্টম রিসোর্স ডেফিনিশন (CRDs) দেখে এবং কাঙ্খিত অবস্থাকে প্রকৃত Kubernetes রিসোর্সে সমন্বয় করে। এখানে উপাদানগুলি একসাথে কিভাবে ফিট করে:
Spilo: PostgreSQL কন্টেইনার ইমেজ
Spiloহল Zalando-এর Docker ছবি যা প্যাট্রোনি, WAL-G, এবং প্রয়োজনীয় এক্সটেনশনগুলির সাথে PostgreSQL বান্ডিল করে৷ স্টেটফুলসেটের প্রতিটি পড একটি স্পিলো কন্টেইনার চালায়। স্পিলো হ্যান্ডলগুলি:
- PostgreSQL সার্ভার— ডাটাবেস ইঞ্জিন নিজেই, 13 থেকে 16 সংস্করণ সমর্থন করে
- Patroni— HA এজেন্ট যা নেতা নির্বাচন, প্রতিলিপিকরণ, এবং ব্যর্থতা পরিচালনা করে
- WAL-G— ক্রমাগত WAL আর্কাইভিং এবং বেস ব্যাকআপ টুল
- pg_cron, pg_stat_statements, PostGIS— সাধারণত প্রয়োজনীয় এক্সটেনশনগুলি আগে থেকে ইনস্টল করা
Patroni: নেতা নির্বাচন এবং স্বয়ংক্রিয় ব্যর্থতা
Patroni হল HA মেকানিজমের হার্ট। এটি ক্লাস্টার অবস্থা বজায় রাখতে এবং নেতা নির্বাচন করতে একটি ডিস্ট্রিবিউটেড কনফিগারেশন স্টোর (DCS) ব্যবহার করে। Zalando অপারেটর প্রসঙ্গে, PatroniKubernetes APIনিজেই DCS হিসাবে ব্যবহার করে (এন্ডপয়েন্ট বা কনফিগম্যাপের মাধ্যমে), একটি বহিরাগত etcd বা ZooKeeper ক্লাস্টারের প্রয়োজনীয়তা দূর করে৷
প্যাট্রোনির ফেইলওভার প্রক্রিয়া কীভাবে কাজ করে তা এখানে:
- স্বাস্থ্য পরীক্ষা— প্রতিটি Patroni এজেন্ট ক্রমাগত তার স্থানীয় PostgreSQL দৃষ্টান্ত নিরীক্ষণ করে এবং DCS-কে স্বাস্থ্য রিপোর্ট করে।
- লিডার লক— প্রাথমিকটি DCS (একটি Kubernetes এন্ডপয়েন্ট অবজেক্ট) এ একটি লিডার লক ধারণ করে। লকটিতে একটি TTL আছে (ডিফল্ট 30 সেকেন্ড)।
- ব্যর্থতা সনাক্তকরণ— যদি প্রাথমিকটি TTL-এর মধ্যে তার লক পুনর্নবীকরণ করতে ব্যর্থ হয়, তাহলে অনুপস্থিতি শনাক্ত করে।
- নির্বাচন— যোগ্য প্রতিলিপিগুলি লিডার লকের জন্য প্রতিযোগিতা করে৷ ন্যূনতম প্রতিলিপি ল্যাগ সহ প্রতিরূপটি জয়ী হয়।
- প্রচার— বিজয়ী প্রতিরূপ নিজেকে প্রাথমিকে উন্নীত করে, DCS আপডেট করে এবং Kubernetes
masterপরিষেবার শেষ পয়েন্ট স্বয়ংক্রিয়ভাবে আপডেট হয়। - ফেন্সিং— বিভক্ত-মস্তিষ্ক প্রতিরোধ করার জন্য পুরানো প্রাইমারিকে বেড়া দেওয়া হয় (থেমে বা প্রতিরূপে অবনমিত করা হয়)।
এই সম্পূর্ণ ফেইলওভার প্রক্রিয়াটি সাধারণত15-30 সেকেন্ড-এ সম্পূর্ণ হয়, আপনার অ্যাপ্লিকেশনগুলির জন্য ন্যূনতম ডাউনটাইম নিশ্চিত করে৷
WAL-G: ক্রমাগত সংরক্ষণাগার এবং ব্যাকআপ
WAL-G হল PostgreSQL-এর জন্য একটি পরবর্তী প্রজন্মের আর্কাইভাল টুল যা S3, Google ক্লাউড স্টোরেজ (GCS) এবং Azure ব্লব স্টোরেজের ব্যাকআপ সমর্থন করে৷ এটি প্রদান করে:
- বেস ব্যাকআপ—
pg_basebackupব্যবহার করে সম্পূর্ণ শারীরিক ব্যাকআপ - WAL সংরক্ষণাগার— পয়েন্ট-ইন-টাইম পুনরুদ্ধারের জন্য ক্রমাগত লিখতে-আগে লগ শিপিং
- ডেল্টা ব্যাকআপ— ক্রমবর্ধমান ব্যাকআপ যা শুধুমাত্র পরিবর্তিত পৃষ্ঠাগুলি সংরক্ষণ করে
- এনক্রিপশন— বাকি ব্যাকআপগুলির AES-256 এনক্রিপশন
- কম্প্রেশন— LZ4 বা ZSTD কম্প্রেশন কম স্টোরেজ খরচ
Kubernetes রিসোর্স হায়ারার্কি
যখন আপনি একটিpostgresqlকাস্টম রিসোর্স তৈরি করেন, তখন অপারেটর ক্লাস্টার পরিচালনা করার জন্য Kubernetes রিসোর্সের একটি ব্যাপক সেট তৈরি করে৷ সমস্যা সমাধান এবং পর্যবেক্ষণের জন্য এই শ্রেণিবিন্যাস বোঝা গুরুত্বপূর্ণ:
সংস্থানগুলি অপারেটর
দ্বারা তৈরি৷- StatefulSet— স্থিতিশীল নেটওয়ার্ক পরিচয় সহ PostgreSQL পডগুলি পরিচালনা করে এবং স্থাপনের আদেশ দেয়
- পরিষেবাগুলি— দুটি ক্লাস্টারআইপি পরিষেবা: প্রাথমিকের জন্য
<cluster-name>এবং পড়ার প্রতিলিপিগুলির জন্য - এন্ডপয়েন্ট— প্যাট্রোনি নিরবিচ্ছিন্ন ব্যর্থতার জন্য বর্তমান নেতার দিকে নির্দেশ করতে এন্ডপয়েন্ট আপডেট করে
- PodDisruption Budgets (PDB)— স্বেচ্ছাসেবী ব্যাঘাতের সময় অন্তত একটি দৃষ্টান্ত উপলব্ধ থাকা নিশ্চিত করে
- সিক্রেটস— PostgreSQL সুপার ইউজার, রেপ্লিকেশন, এবং অ্যাপ্লিকেশন শংসাপত্রগুলি Kubernetes সিক্রেটস হিসাবে সংরক্ষিত
- Persistent VolumeClaims (PVCs)— PostgreSQL এর জন্য পড প্রতি এক PVC ডেটা স্টোরেজ
- PgBouncer Deployment— ঐচ্ছিক সংযোগ পুলারকে তার নিজস্ব পরিষেবা সহ একটি পৃথক স্থাপনার হিসাবে স্থাপন করা হয়েছে
<cluster-name>-replইনস্টলেশনপূর্বশর্ত
৷
Zalando Postgres অপারেটর ইনস্টল করার আগে, নিশ্চিত করুন যে আপনার কাছে আছে:
- একটি চলমান Kubernetes ক্লাস্টার (v1.25+)
kubectlক্লাস্টার অ্যাডমিন অ্যাক্সেস সহ কনফিগার করা হয়েছেhelmv3 ইনস্টল করা ৷- একটি ডিফল্ট স্টোরেজক্লাস কনফিগার করা
অপারেটর ইনস্টলেশন
প্রস্তাবিত ইনস্টলেশন পদ্ধতি Helm ব্যবহার করে। এটি সমস্ত Kubernetes প্ল্যাটফর্ম জুড়ে ধারাবাহিকভাবে কাজ করে:
৷# Add the Zalando Postgres Operator Helm repository
helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm repo add postgres-operator-ui-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator-ui
helm repo update
# Create a dedicated namespace
kubectl create namespace postgres-operator
# Install the operator with custom values
helm install postgres-operator postgres-operator-charts/postgres-operator \
--namespace postgres-operator \
--set configKubernetes.enable_pod_antiaffinity=true \
--set configKubernetes.pod_environment_configmap=postgres-pod-config \
--set configAwsOrGcp.aws_region=us-east-1 \
--set configLoadBalancer.db_hosted_zone=db.example.com \
--set configConnectionPooler.connection_pooler_default_cpu_request=500m \
--set configConnectionPooler.connection_pooler_default_memory_request=100Mi
# Optionally install the operator UI for visual management
helm install postgres-operator-ui postgres-operator-ui-charts/postgres-operator-ui \
--namespace postgres-operatorঅপারেটর চলছে তা যাচাই করুন:
kubectl get pods -n postgres-operator
# Expected output:
# NAME READY STATUS RESTARTS AGE
# postgres-operator-7f8b9c6d4-x2k9j 1/1 Running 0 2mAWS EKS স্থাপনার সুনির্দিষ্ট
Amazon EKS-এর সর্বোত্তম PostgreSQL পারফরম্যান্সের জন্য নির্দিষ্ট কনফিগারেশন প্রয়োজন:
# EKS-specific Helm values (eks-values.yaml)
configAwsOrGcp:
aws_region: us-east-1
enable_ebs_gp3_migration: true
additional_secret_mount: "aws-iam-token"
configKubernetes:
enable_pod_antiaffinity: true
pod_environment_configmap: "postgres-pod-config"
spilo_privileged: false
storage_resize_mode: pvc
# Use EBS gp3 StorageClass for better performance
# Create the StorageClass first:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-gp3-postgres
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "6000"
throughput: "400"
encrypted: "true"
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: trueEKS-এ WAL-G ব্যাকআপের জন্য, পরিষেবা অ্যাকাউন্টের জন্য IAM ভূমিকা কনফিগার করুন (IRSA):
# Create IAM policy for WAL-G S3 access
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::my-pg-backups",
"arn:aws:s3:::my-pg-backups/*"
]
}
]
}Azure AKS স্থাপনা
Azure AKS স্থায়ী সঞ্চয়স্থানের জন্য Azure ডিস্ক এবং ব্যাকআপ প্রমাণীকরণের জন্য পরিচালিত পরিচয় ব্যবহার করে:
# AKS-specific StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium-postgres
provisioner: disk.csi.azure.com
parameters:
skuName: Premium_LRS
cachingMode: ReadOnly
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# WAL-G backup to Azure Blob Storage environment variables
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-pod-config
namespace: default
data:
AZURE_STORAGE_ACCOUNT: "pgbackupsstorage"
AZURE_STORAGE_ACCESS_KEY: "" # Use Managed Identity instead
WALG_AZ_PREFIX: "azure://pg-wal-backups/$(SCOPE)"
USE_WALG_BACKUP: "true"
USE_WALG_RESTORE: "true"
BACKUP_SCHEDULE: "0 2 * * *"
BACKUP_NUM_TO_RETAIN: "7"Google GKE ডিপ্লয়মেন্ট
Google Kubernetes ইঞ্জিন GCS ব্যাকআপ অ্যাক্সেসের জন্য স্থায়ী ডিস্ক এবং ওয়ার্কলোড আইডেন্টিটি ব্যবহার করে:
# GKE StorageClass for SSD Persistent Disks
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ssd-postgres
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-ssd
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
# GCS backup configuration
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-pod-config
namespace: default
data:
WALG_GS_PREFIX: "gs://my-pg-backups/$(SCOPE)"
USE_WALG_BACKUP: "true"
USE_WALG_RESTORE: "true"
GOOGLE_APPLICATION_CREDENTIALS: "/var/secrets/google/key.json"
BACKUP_SCHEDULE: "0 2 * * *"
BACKUP_NUM_TO_RETAIN: "7"বেয়ার মেটাল k3s/Rancher লংহর্ন স্টোরেজ
অন-প্রিমিসেস স্থাপনার জন্য, k3s একটি হালকা Kubernetes ডিস্ট্রিবিউশন প্রদান করে এবং লংহর্ন ডিস্ট্রিবিউটেড ব্লক স্টোরেজ অফার করে। ক্লাউড ভেন্ডর লক-ইন ছাড়াই আপনার পরিকাঠামোর উপর সম্পূর্ণ নিয়ন্ত্রণের প্রয়োজন হলে এই সমন্বয়টি আদর্শ।
# Install k3s on all nodes
# Master node:
curl -sfL https://get.k3s.io | sh -s - server \
--cluster-init \
--disable traefik \
--write-kubeconfig-mode 644
# Worker nodes:
curl -sfL https://get.k3s.io | sh -s - agent \
--server https://master-ip:6443 \
--token $(cat /var/lib/rancher/k3s/server/node-token)
# Install Longhorn for persistent storage
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace \
--set defaultSettings.defaultReplicaCount=3 \
--set defaultSettings.defaultDataPath=/mnt/longhorn
# Install MetalLB for LoadBalancer services
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
# Configure MetalLB IP pool
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: postgres-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.210PostgreSQL ক্লাস্টার CRD স্পেসিফিকেশন
স্থাপনার মূল a Zalando অপারেটরের সাথে PostgreSQL ক্লাস্টার হলpostgresqlকাস্টম রিসোর্স। এই YAML ম্যানিফেস্টটি আপনার ক্লাস্টারের পছন্দসই অবস্থা ঘোষণা করে এবং অপারেটর এটিকে বাস্তবে মিলিত করে। নীচে একটি ব্যাপক, উত্পাদন-প্রস্তুত CRD স্পেসিফিকেশন রয়েছে:
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
name: pg-production-cluster
namespace: databases
labels:
team: platform
environment: production
spec:
teamId: "platform"
volume:
size: 100Gi
storageClass: ebs-gp3-postgres
numberOfInstances: 3
enableConnectionPooler: true
enableReplicaConnectionPooler: true
connectionPooler:
numberOfInstances: 2
mode: transaction
schema: pooler
user: pooler
resources:
requests:
cpu: 500m
memory: 100Mi
limits:
cpu: "1"
memory: 256Mi
users:
app_user:
- superuser
- createdb
readonly_user: []
databases:
app_database: app_user
postgresql:
version: "16"
parameters:
shared_buffers: "2GB"
max_connections: "200"
work_mem: "64MB"
maintenance_work_mem: "512MB"
effective_cache_size: "6GB"
random_page_cost: "1.1"
effective_io_concurrency: "200"
wal_buffers: "64MB"
max_wal_size: "4GB"
min_wal_size: "1GB"
checkpoint_completion_target: "0.9"
default_statistics_target: "100"
log_statement: "ddl"
log_min_duration_statement: "1000"
idle_in_transaction_session_timeout: "600000"
lock_timeout: "30000"
statement_timeout: "60000"
patroni:
initdb:
encoding: "UTF8"
locale: "en_US.UTF-8"
data-checksums: "true"
pg_hba:
- hostssl all all 0.0.0.0/0 md5
- host all all 0.0.0.0/0 md5
ttl: 30
loop_wait: 10
retry_timeout: 10
synchronous_mode: false
synchronous_mode_strict: false
maximum_lag_on_failover: 33554432
resources:
requests:
cpu: "2"
memory: 8Gi
limits:
cpu: "4"
memory: 16Gi
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9187"
tolerations:
- key: "database"
operator: "Equal"
value: "postgres"
effect: "NoSchedule"
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: workload-type
operator: In
values:
- database
enableShmVolume: true
spiloRunAsUser: 101
spiloRunAsGroup: 103
spiloFSGroup: 103কী CRD ক্ষেত্র ব্যাখ্যা করা হয়েছে
৷- numberOfInstances— মোট পড সংখ্যা। অপারেটর স্বয়ংক্রিয়ভাবে একটিকে প্রাথমিক এবং বাকিটিকে স্ট্রিমিং প্রতিলিপি হিসাবে মনোনীত করে৷
- ConnectionPoolerসক্ষম করে — প্রাথমিক পরিষেবার জন্য PgBouncer সাইডকার স্থাপন করে, সংযোগ ওভারহেড হ্রাস করে৷
- enableReplicaConnectionPooler— রেপ্লিকা পরিষেবার জন্য একটি পৃথক PgBouncer স্থাপন করে, যা পড়া-ভারী কাজের চাপের জন্য অপরিহার্য।
- postgresql.parameters— সরাসরি PostgreSQL কনফিগারেশন প্যারামিটার
postgresql.conf-এ পাস করা হয়েছে। - পৃষ্ঠপোষক— TTL, লুপ অপেক্ষা, পুনরায় চেষ্টা করার সময়সীমা, এবং সিঙ্ক্রোনাস প্রতিলিপি মোড সহ Patroni আচরণ কনফিগার করে।
- volume.storageClass— প্লাটফর্ম-নির্দিষ্ট স্টোরেজক্লাসের মানচিত্র (AWS-এ EBS gp3, Azure-এ প্রিমিয়াম SSD, GCP-এ SSD PD, k3s-এ লংহর্ন)।
- সক্রিয়ShmVolume— PostgreSQL শেয়ার্ড মেমরির জন্য
/dev/shm-এ একটিtmpfsমাউন্ট করে, কর্মক্ষমতার জন্য গুরুত্বপূর্ণ৷
সংযোগ পুলিং
PostgreSQL-এর প্রসেস-প্রতি-সংযোগ মডেলটি প্রচুর সংখ্যক ক্লায়েন্ট সংযোগগুলি পরিচালনা করা ব্যয়বহুল করে তোলে। প্রতিটি সংযোগ প্রায় 10MB RAM খরচ করে। PgBouncer প্রকৃত PostgreSQL সংযোগের একটি ছোট পুলের উপর হাজার হাজার ক্লায়েন্ট সংযোগ মাল্টিপ্লেক্স করে এটি সমাধান করে।
Zalando অপারেটর স্থানীয়ভাবে PgBouncer স্থাপনকে সমর্থন করে। আপনি যখন CRD এenableConnectionPooler: trueসেট করেন, তখন অপারেটর তৈরি করে:
- কনফিগারযোগ্য প্রতিরূপ গণনা সহ একটি পিজিবাউন্সার স্থাপনা
- পুল সংযোগের জন্য একটি ডেডিকেটেড পরিষেবা (
<cluster-name>-pooler) - PostgreSQL এর সাথে স্বয়ংক্রিয় শংসাপত্র সিঙ্ক্রোনাইজেশন
PgBouncer কনফিগারেশন মোড
# PgBouncer connection pooler modes:
#
# transaction (recommended for most workloads)
# - Connection returned to pool after each transaction
# - Best balance of efficiency and compatibility
# - Cannot use session-level features (prepared statements, temp tables)
#
# session
# - Connection held for entire client session
# - Full PostgreSQL compatibility
# - Lower pooling efficiency
#
# statement
# - Connection returned after each statement
# - Most efficient but most restrictive
# - Only works with autocommit queries
# Custom PgBouncer configuration via operator
spec:
connectionPooler:
numberOfInstances: 3
mode: transaction
schema: pooler
user: pooler
defaultPoolSize: 25
maxDBConnections: 100
resources:
requests:
cpu: 250m
memory: 128Mi
limits:
cpu: "1"
memory: 256Miযে অ্যাপ্লিকেশনগুলির জন্য প্রস্তুত বিবৃতি বা সেশন-স্তরের বৈশিষ্ট্যগুলির প্রয়োজন, PgBouncer বাইপাস করে PostgreSQL পরিষেবাগুলির সাথে সরাসরি সংযোগ করুন, অথবা নিম্ন সংযোগ দক্ষতার ট্রেডঅফের সাথেsessionপুলিং মোড ব্যবহার করুন৷
বহু-অঞ্চল PostgreSQL প্রতিলিপি
বিশ্বব্যাপী অ্যাপ্লিকেশনগুলির জন্য যেগুলির জন্য একাধিক ভৌগলিক অবস্থান থেকে কম লেটেন্সি রিড বা অঞ্চল জুড়ে দুর্যোগ পুনরুদ্ধারের প্রয়োজন হয়, বহু-অঞ্চল প্রতিলিপি অপরিহার্য৷ Zalando অপারেটর স্ট্যান্ডবাই ক্লাস্টারগুলির মাধ্যমে এটিকে সমর্থন করে যা একটি প্রাথমিক ক্লাস্টার থেকে স্ট্রিমিং প্রতিলিপি বা WAL-G সংরক্ষণাগারগুলির মাধ্যমে প্রতিলিপি তৈরি করে।
স্ট্রিমিং রেপ্লিকেশন কনফিগারেশন
PostgreSQL স্ট্রিমিং রেপ্লিকেশন হল Zalando অপারেটরে HA এর ভিত্তি। এটি প্রায় রিয়েল-টাইমে প্রাথমিক থেকে প্রতিলিপিতে রাইট-আহেড লগ (WAL) রেকর্ড পাঠানোর মাধ্যমে কাজ করে। অপারেটর এটি স্বয়ংক্রিয়ভাবে কনফিগার করে, তবে বিশদটি বোঝা টিউনিং এবং সমস্যা সমাধানে সহায়তা করে।
- সিঙ্ক্রোনাস প্রতিলিপি— প্রাথমিক একটি লেনদেন করার আগে WAL রসিদ নিশ্চিত করার জন্য কমপক্ষে একটি প্রতিলিপির জন্য অপেক্ষা করে। এটি শূন্য ডেটা ক্ষতির গ্যারান্টি দেয় (RPO=0) কিন্তু লেটেন্সি যোগ করে।
patroni.synchronous_mode: trueদিয়ে সক্ষম করুন৷ - অ্যাসিঙ্ক্রোনাস রেপ্লিকেশন— প্রাথমিকটি অবিলম্বে কমিট করে এবং ওয়াল অ্যাসিঙ্ক্রোনাসভাবে প্রেরণ করে৷ সামান্য কম বিলম্ব কিন্তু ব্যর্থতার সময় সম্ভাব্য ডেটা ক্ষতি। এটি ডিফল্ট।
- ক্যাসকেডিং রেপ্লিকেশন— প্রতিলিপিগুলি প্রাথমিকের পরিবর্তে অন্যান্য প্রতিলিপি থেকে প্রতিলিপি তৈরি করতে পারে, বড় ক্লাস্টারে প্রাথমিকের উপর লোড কমিয়ে দেয়।
# Enable synchronous replication for zero data loss
spec:
patroni:
synchronous_mode: true
synchronous_mode_strict: false # Allow async if no sync replica available
synchronous_node_count: 1 # Number of sync replicas required
postgresql:
parameters:
synchronous_commit: "on" # Matches Patroni synchronous_mode
max_wal_senders: "10" # Maximum WAL sender processes
wal_keep_size: "1GB" # WAL retention for replica catch-up
hot_standby: "on" # Allow queries on replicas
hot_standby_feedback: "on" # Reduce query conflicts on replicasWAL-Gএর সাথেব্যাকআপ এবং পুনরুদ্ধারWAL-G ব্যাকআপ কনফিগারেশন
সঠিক ব্যাকআপ কনফিগারেশন দুর্যোগ পুনরুদ্ধারের জন্য গুরুত্বপূর্ণ। Zalando অপারেটর অবজেক্ট স্টোরেজের অবিচ্ছিন্ন ব্যাকআপের জন্য WAL-G সংহত করে। এখানে S3-সামঞ্জস্যপূর্ণ স্টোরেজের জন্য একটি সম্পূর্ণ কনফিগারেশন রয়েছে:
# ConfigMap for WAL-G backup configuration
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-pod-config
namespace: databases
data:
# S3 backup configuration
AWS_ENDPOINT: "https://s3.us-east-1.amazonaws.com"
AWS_S3_FORCE_PATH_STYLE: "false"
AWS_REGION: "us-east-1"
WALG_S3_PREFIX: "s3://my-pg-backups/$(SCOPE)"
WALG_DISABLE_S3_SSE: "false"
WALG_S3_SSE: "aws:kms"
WALG_S3_SSE_KMS_ID: "arn:aws:kms:us-east-1:123456789:key/mrk-abcdef"
# Backup scheduling and retention
USE_WALG_BACKUP: "true"
USE_WALG_RESTORE: "true"
BACKUP_SCHEDULE: "0 1 * * *" # Daily at 1 AM UTC
BACKUP_NUM_TO_RETAIN: "14" # Keep 14 daily backups
# WAL archiving
WALG_COMPRESSION_METHOD: "zstd" # Better compression than lz4
WALG_DELTA_MAX_STEPS: "6" # Delta backups between full backups
WALG_UPLOAD_CONCURRENCY: "4" # Parallel upload streams
WALG_DOWNLOAD_CONCURRENCY: "4" # Parallel download for restore
WALG_UPLOAD_DISK_CONCURRENCY: "4" # Disk read concurrency
# Clone configuration
CLONE_AWS_ENDPOINT: "https://s3.us-east-1.amazonaws.com"
CLONE_AWS_REGION: "us-east-1"
CLONE_WALG_S3_PREFIX: "s3://my-pg-backups/$(CLONE_SCOPE)"
CLONE_METHOD: "CLONE_WITH_WALG"
CLONE_USE_WALG_RESTORE: "true"পয়েন্ট-ইন-টাইম রিকভারি (PITR)
PITR আপনাকে আপনার ডেটাবেসকে নির্দিষ্ট সময়ে পুনরুদ্ধার করার অনুমতি দেয় - দুর্ঘটনাজনিত ডেটা মুছে ফেলা বা দুর্নীতি থেকে পুনরুদ্ধারের জন্য গুরুত্বপূর্ণ। Zalando অপারেটর ক্লোন পদ্ধতির মাধ্যমে PITR-কে সমর্থন করে:
# Clone a cluster with PITR
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
name: pg-restored-cluster
namespace: databases
spec:
teamId: "platform"
volume:
size: 100Gi
storageClass: ebs-gp3-postgres
numberOfInstances: 3
postgresql:
version: "16"
clone:
cluster: "pg-production-cluster"
timestamp: "2026-04-11T14:30:00+00:00" # Restore to this exact moment
s3_wal_path: "s3://my-pg-backups/wal/16/pg-production-cluster"
s3_endpoint: "https://s3.us-east-1.amazonaws.com"
s3_access_key_id: "" # Use IAM role instead
s3_secret_access_key: "" # Use IAM role insteadযখন এই CRD প্রয়োগ করা হয়, তখন অপারেটর নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করে:
- টার্গেট টাইমস্ট্যাম্প এর আগে সর্বশেষ বেস ব্যাকআপ খুঁজে পায়
- নতুন StatefulSet-এর প্রাথমিক পড -এ বেস ব্যাকআপ পুনরুদ্ধার করে
- নির্দিষ্ট টাইমস্ট্যাম্প পর্যন্ত WAL সেগমেন্ট রিপ্লে করে
- রিড-রাইট অপারেশনের জন্য ডাটাবেস খোলে
- রেপ্লিকা পড স্ট্রিমিং প্রতিলিপি সেট আপ করে
স্ট্যান্ডবাই ক্লাস্টার
একটি স্ট্যান্ডবাই ক্লাস্টার ক্রমাগত একটি প্রাথমিক ক্লাস্টার থেকে প্রতিলিপি করে, একটি উষ্ণ স্ট্যান্ডবাই প্রদান করে যা একটি দুর্যোগের সময় প্রচার করা যেতে পারে। এটি একটি ক্লাস্টারের মধ্যে থাকা প্রতিলিপিগুলির থেকে আলাদা—একটি স্ট্যান্ডবাই ক্লাস্টার হল একটি সম্পূর্ণ স্বাধীন Kubernetes সংস্থান যা একটি ভিন্ন নামস্থান, ক্লাস্টার বা এমনকি অঞ্চলেও চলতে পারে।
# Standby cluster in a different region
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
name: pg-standby-eu
namespace: databases
spec:
teamId: "platform"
volume:
size: 100Gi
storageClass: managed-premium-postgres
numberOfInstances: 2
postgresql:
version: "16"
standby:
standby_host: "pg-production-cluster.databases.svc.cluster.local"
standby_port: "5432"
# Alternative: replicate from S3 WAL archive
# s3_wal_path: "s3://my-pg-backups/wal/16/pg-production-cluster"
enableConnectionPooler: true
enableReplicaConnectionPooler: trueএকটি স্ট্যান্ডবাই ক্লাস্টারকে একটি স্বাধীন প্রাথমিকে উন্নীত করতে (দুর্যোগ পুনরুদ্ধারের সময়), কেবল CRD থেকেstandbyবিভাগটি সরিয়ে দিন এবং আবেদন করুন:
# Edit the standby cluster CRD to remove standby section
kubectl patch postgresql pg-standby-eu -n databases --type json \
-p '[{"op": "remove", "path": "/spec/standby"}]'
# The operator will promote the standby to primary
# Update your application DNS/service mesh to point to the new primaryPrometheus এবং Grafanaসহমনিটরিং
ব্যাপক পর্যবেক্ষণ উত্পাদন PostgreSQL স্থাপনার জন্য অ-আলোচনাযোগ্য। Zalando অপারেটরpostgres_exporterসাইডকারের মাধ্যমে Prometheus মেট্রিক্স এক্সপোর্ট সমর্থন করে। এখানে কিভাবে একটি সম্পূর্ণ মনিটরিং স্ট্যাক সেট আপ করবেন:
সার্ভিস মনিটর# ServiceMonitor for PostgreSQL metrics
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: postgres-monitor
namespace: databases
labels:
team: platform
release: prometheus
spec:
selector:
matchLabels:
team: platform
namespaceSelector:
matchNames:
- databases
endpoints:
- port: exporter
interval: 15s
scrapeTimeout: 10s
path: /metrics
relabelings:
- sourceLabels: [__meta_kubernetes_pod_label_spilo_role]
targetLabel: role
- sourceLabels: [__meta_kubernetes_pod_label_cluster_name]
targetLabel: cluster
---
# PodMonitor alternative (scrapes pods directly)
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: postgres-pod-monitor
namespace: databases
spec:
selector:
matchLabels:
application: spilo
podMetricsEndpoints:
- port: exporter
interval: 15s
path: /metrics
নিরীক্ষণের জন্য# ServiceMonitor for PostgreSQL metrics
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: postgres-monitor
namespace: databases
labels:
team: platform
release: prometheus
spec:
selector:
matchLabels:
team: platform
namespaceSelector:
matchNames:
- databases
endpoints:
- port: exporter
interval: 15s
scrapeTimeout: 10s
path: /metrics
relabelings:
- sourceLabels: [__meta_kubernetes_pod_label_spilo_role]
targetLabel: role
- sourceLabels: [__meta_kubernetes_pod_label_cluster_name]
targetLabel: cluster
---
# PodMonitor alternative (scrapes pods directly)
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: postgres-pod-monitor
namespace: databases
spec:
selector:
matchLabels:
application: spilo
podMetricsEndpoints:
- port: exporter
interval: 15s
path: /metricsমূল মেট্রিক্স৷
আপনার Grafana ড্যাশবোর্ডগুলিতে ট্র্যাক করার জন্য এইগুলি সবচেয়ে গুরুত্বপূর্ণ PostgreSQL মেট্রিক্স:
- pg_stat_replication_lag— বাইট এবং সেকেন্ডে প্রতিলিপি ল্যাগ। ব্যবধান আপনার RPO থ্রেশহোল্ড অতিক্রম করলে সতর্কতা।
- pg_stat_activity_count— রাষ্ট্র দ্বারা সক্রিয় সংযোগ। সংযোগ পুল ক্লান্তি সম্পর্কে সতর্কতা.
- pg_stat_database_tup_fetched/Returned/inserted/updated/Deleted— কোয়েরি থ্রুপুট মেট্রিক্স।
- pg_stat_bgwriter_buffers_checkpoint/clean/backend— বাফার পরিচালনার দক্ষতা।
- pg_database_size_bytes— ক্ষমতা পরিকল্পনার জন্য সময়ের সাথে সাথে ডেটাবেসের আকার বৃদ্ধি।
- pg_locks_count— লক বিতর্ক। অত্যধিক অপেক্ষমাণ লক সম্পর্কে সতর্কতা.
- pg_stat_statements_calls/mean_time— অপ্টিমাইজেশনের জন্য কর্মক্ষমতা পরিসংখ্যান জিজ্ঞাসা করুন।
- patroni_postgres_running— Patroni স্বাস্থ্য অবস্থা (1 = চলমান, 0 = নিচে)।
- patroni_master— কোন পড বর্তমান প্রাথমিক (1 = মাস্টার, 0 = প্রতিরূপ)।
- pg_up— মৌলিক PostgreSQL প্রাপ্যতা অনুসন্ধান।
সতর্কতার নিয়ম
# PrometheusRule for PostgreSQL alerts
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: postgres-alerts
namespace: databases
spec:
groups:
- name: postgresql.rules
rules:
- alert: PostgreSQLDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "PostgreSQL instance {{ $labels.instance }} is down"
- alert: PostgreSQLReplicationLag
expr: pg_stat_replication_pg_wal_lsn_diff > 100000000
for: 5m
labels:
severity: warning
annotations:
summary: "Replication lag is {{ $value }} bytes on {{ $labels.instance }}"
- alert: PostgreSQLHighConnections
expr: sum(pg_stat_activity_count) by (instance) > 180
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $value }} active connections on {{ $labels.instance }}"
- alert: PostgreSQLDeadlocks
expr: rate(pg_stat_database_deadlocks[5m]) > 0
for: 1m
labels:
severity: warning
annotations:
summary: "Deadlocks detected on {{ $labels.datname }}"
- alert: PatroniFailover
expr: changes(patroni_master[5m]) > 0
labels:
severity: critical
annotations:
summary: "Patroni failover occurred in cluster {{ $labels.cluster }}"প্রোডাকশন টিউনিং গাইড
সঠিক টিউনিং Kubernetes-এ PostgreSQL থেকে সর্বোচ্চ কার্যক্ষমতা বের করার জন্য অপরিহার্য। আপনার পড রিসোর্স সীমা এবং কাজের চাপের বৈশিষ্ট্যের উপর ভিত্তি করে নিম্নলিখিত পরামিতিগুলি সামঞ্জস্য করা উচিত।
মেমরি কনফিগারেশন
# For a pod with 16GB memory limit:
postgresql:
parameters:
# shared_buffers: 25% of total memory
shared_buffers: "4GB"
# effective_cache_size: 75% of total memory
# (tells planner how much OS cache to expect)
effective_cache_size: "12GB"
# work_mem: shared_buffers / (max_connections * 2)
# Conservative to prevent OOM
work_mem: "10MB"
# maintenance_work_mem: 5-10% of total memory
# Used for VACUUM, CREATE INDEX, ALTER TABLE
maintenance_work_mem: "1GB"
# temp_buffers: memory for temp tables per session
temp_buffers: "32MB"
# huge_pages: try to use huge pages (requires OS config)
huge_pages: "try"WAL এবং চেকপয়েন্ট কনফিগারেশন
postgresql:
parameters:
# WAL settings
wal_buffers: "64MB" # 1/32 of shared_buffers, max 64MB
wal_compression: "zstd" # Compress WAL (PG 15+)
max_wal_size: "8GB" # Before forced checkpoint
min_wal_size: "2GB" # WAL disk reservation
wal_level: "replica" # Required for replication
# Checkpoint settings
checkpoint_completion_target: "0.9" # Spread I/O over 90% of interval
checkpoint_timeout: "15min" # Max time between checkpointsক্যোয়ারী প্ল্যানার এবং I/O
postgresql:
parameters:
# Cost parameters for SSD storage
random_page_cost: "1.1" # SSD: close to seq_page_cost
seq_page_cost: "1.0" # Sequential I/O baseline
effective_io_concurrency: "200" # Concurrent I/O for SSD
# Planner behavior
default_statistics_target: "200" # More accurate statistics
from_collapse_limit: 12 # JOIN planning threshold
join_collapse_limit: 12 # JOIN planning threshold
# Parallel queries
max_parallel_workers_per_gather: "4"
max_parallel_workers: "8"
max_parallel_maintenance_workers: "4"
parallel_tuple_cost: "0.01"
parallel_setup_cost: "1000"সংযোগ এবং লগিং
postgresql:
parameters:
# Connection limits
max_connections: "200" # Keep low, use PgBouncer
superuser_reserved_connections: "5" # Reserve for admin access
# Logging for troubleshooting
log_statement: "ddl" # Log DDL statements
log_min_duration_statement: "500" # Log queries > 500ms
log_checkpoints: "on" # Log checkpoint activity
log_connections: "off" # Too noisy in production
log_disconnections: "off" # Too noisy in production
log_lock_waits: "on" # Log lock waits
log_temp_files: "0" # Log all temp file usage
log_autovacuum_min_duration: "1000" # Log slow autovacuum
# Statement timeouts
statement_timeout: "60000" # 60 second query timeout
lock_timeout: "30000" # 30 second lock timeout
idle_in_transaction_session_timeout: "600000" # 10 min idle txn timeoutরোলিং আপডেট এবং সংস্করণ আপগ্রেড
ছোট সংস্করণের আপগ্রেডগুলি
৷ছোট সংস্করণ আপগ্রেডগুলি (যেমন, 16.2 থেকে 16.3) অপারেটর দ্বারা স্বয়ংক্রিয়ভাবে পরিচালনা করা হয় যখন আপনি স্পিলো চিত্র ট্যাগ আপডেট করেন৷ অপারেটর একটি রোলিং রিস্টার্ট করে:
# Update the operator configuration to use a new Spilo image
helm upgrade postgres-operator postgres-operator-charts/postgres-operator \
--namespace postgres-operator \
--set configGeneral.docker_image=ghcr.io/zalando/spilo-16:3.1-p1 \
--reuse-values
# The operator will perform rolling updates:
# 1. Restart replicas one at a time
# 2. Failover the primary to a freshly updated replica
# 3. Restart the old primary (now a replica)প্রধান সংস্করণ আপগ্রেড
প্রধান সংস্করণ আপগ্রেডের জন্য (যেমন, PostgreSQL 15 থেকে 16) আরও সতর্ক পরিকল্পনা প্রয়োজন। Zalando অপারেটরpg_upgrade:
# Step 1: Update the CRD to the new major version
spec:
postgresql:
version: "16" # Changed from "15"
# Step 2: The operator detects the version change and:
# a) Scales down the StatefulSet to 1 replica
# b) Runs pg_upgrade on the primary pod
# c) Scales back up to the desired numberOfInstances
# d) Replicas are rebuilt from the upgraded primary
# Step 3: Verify the upgrade
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "psql -c 'SELECT version()'"
# Step 4: Run ANALYZE to update statistics after upgrade
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "psql -c 'ANALYZE VERBOSE'"বড় আপগ্রেডের জন্য গুরুত্বপূর্ণ বিবেচনা:
- আপগ্রেড করার আগে সর্বদা একটি নতুন ব্যাকআপ নিন৷
- প্রথমে একটি ক্লোন করা ক্লাস্টারে আপগ্রেড পরীক্ষা করুন ৷
- বড় আপগ্রেডগুলির জন্য ডাউনটাইম প্রয়োজন (সাধারণত ডাটাবেসের আকারের উপর নির্ভর করে 5-30 মিনিট) পরিবর্তনের জন্য PostgreSQL রিলিজ নোটগুলি পর্যালোচনা করুন৷
- রেপ্লিকা পুনর্নির্মাণের পরে মনিটর প্রতিলিপি ঘনিষ্ঠভাবে ল্যাগ
- ক্যোয়ারী প্ল্যানার পরিসংখ্যান পুনরুত্পাদন করতে সমস্ত ডেটাবেসে
ANALYZEচালানউন্নত অপারেশনাল প্যাটার্নস
লজিক্যাল ব্যাকআপ
শারীরিক WAL-G ব্যাকআপ ছাড়াও, অপারেটরpg_dumpব্যবহার করে লজিক্যাল ব্যাকআপ সমর্থন করে। লজিক্যাল ব্যাকআপগুলি ক্রস-সংস্করণ স্থানান্তর এবং নির্বাচনী টেবিল পুনরুদ্ধারের জন্য দরকারী:
# Enable logical backups in the operator configuration
helm upgrade postgres-operator postgres-operator-charts/postgres-operator \
--namespace postgres-operator \
--set configLogicalBackup.logical_backup_schedule="0 3 * * *" \
--set configLogicalBackup.logical_backup_s3_bucket="my-pg-logical-backups" \
--set configLogicalBackup.logical_backup_s3_region="us-east-1" \
--set configLogicalBackup.logical_backup_s3_sse="AES256" \
--reuse-values
# The operator creates a CronJob for each cluster that:
# 1. Connects to the primary PostgreSQL instance
# 2. Runs pg_dumpall (or pg_dump per database)
# 3. Compresses and uploads to S3কাস্টম পড এনভায়রনমেন্ট ভেরিয়েবল
আপনি কনফিগম্যাপ ব্যবহার করে স্পিলো পডগুলিতে পরিবেশের ভেরিয়েবলগুলি ইনজেকশন করতে পারেন। এটি WAL-G, কাস্টম স্ক্রিপ্ট, বা OS-স্তরের প্যারামিটারগুলি কনফিগার করার জন্য দরকারী:
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-pod-config
namespace: databases
data:
# Custom Spilo configurations
SPILO_CONFIGURATION: |
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 33554432
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
archive_mode: "on"
archive_timeout: 1800s
# Enable pg_stat_statements
POSTGRESQL_SHARED_PRELOAD_LIBRARIES: "bg_mon,pg_stat_statements,pgextwlist,pg_auth_mon,set_user,timescaledb,pg_cron,pg_stat_kcache"
# Cron jobs inside PostgreSQL
ENABLE_PG_CRON: "true"নিরাপত্তার জন্যনেটওয়ার্ক নীতিগুলি
৷উৎপাদনে, Kubernetes নেটওয়ার্ক নীতিগুলি ব্যবহার করে PostgreSQL পডগুলিতে নেটওয়ার্ক অ্যাক্সেস সীমাবদ্ধ করুন:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-network-policy
namespace: databases
spec:
podSelector:
matchLabels:
application: spilo
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: app-namespace
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 5432
- protocol: TCP
port: 8008 # Patroni REST API
- from:
- namespaceSelector:
matchLabels:
name: monitoring
ports:
- protocol: TCP
port: 9187 # Prometheus exporter
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 443 # S3/GCS/Azure for backupsসাধারণ সমস্যাগুলির সমস্যা সমাধান করা
৷এমনকি অটোমেশনের সাথেও সমস্যা দেখা দেয়। Zalando অপারেটরের সাথে PostgreSQL চালানোর সময় এখানে সবচেয়ে সাধারণ সমস্যা এবং তাদের সমাধান রয়েছে:
1. পড মুলতুবি অবস্থায় আটকে আছে
৷# Check events for the pod
kubectl describe pod pg-production-cluster-0 -n databases
# Common causes:
# - No nodes with matching tolerations/affinity
# - Insufficient CPU or memory on nodes
# - PVC cannot be provisioned (check StorageClass)
# Fix: Check node resources and storage availability
kubectl get nodes -o custom-columns=NAME:.metadata.name,CPU:.status.allocatable.cpu,MEM:.status.allocatable.memory
kubectl get pvc -n databases2. রেপ্লিকেশন ল্যাগ ক্রমবর্ধমান
# Check replication status on the primary
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "psql -c 'SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn, write_lag, flush_lag, replay_lag FROM pg_stat_replication'"
# Common causes:
# - Replica CPU/IO saturation
# - Network bandwidth limits
# - Long-running queries on replica blocking WAL replay
# - Insufficient wal_keep_size
# Fix: Check replica resources and cancel blocking queries
kubectl exec -it pg-production-cluster-1 -n databases -- \
su postgres -c "psql -c 'SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state = \"active\" AND query_start < now() - interval \"5 minutes\"'"3. ব্যর্থতা
ট্রিগার করছে না৷# Check Patroni cluster status
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "patronictl list"
# Check Patroni logs
kubectl logs pg-production-cluster-0 -n databases -c postgres | grep -i patroni
# Manual failover (if auto-failover is stuck)
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "patronictl failover --candidate pg-production-cluster-1 --force"4. ব্যাকআপ ব্যর্থতা
# Check WAL-G backup status
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "envdir /run/etc/wal-e.d/env wal-g backup-list"
# Check backup CronJob logs
kubectl logs -l application=spilo,cluster-name=pg-production-cluster -n databases | grep -i wal-g
# Verify S3/GCS credentials
kubectl exec -it pg-production-cluster-0 -n databases -- \
su postgres -c "envdir /run/etc/wal-e.d/env aws s3 ls s3://my-pg-backups/"নিরাপত্তা সর্বোত্তম অনুশীলন
Kubernetes-এ PostgreSQL সুরক্ষিত করার জন্য একটি প্রতিরক্ষা-গভীর পদ্ধতির প্রয়োজন:
- TLS এনক্রিপশন— সমস্ত ক্লায়েন্ট সংযোগের জন্য SSL সক্ষম করুন৷ অপারেটর স্বয়ংক্রিয়ভাবে শংসাপত্র-ব্যবস্থাপক ব্যবহার করে শংসাপত্র সরবরাহ করতে পারে।
- সিক্রেট ম্যানেজমেন্ট— ডাটাবেস শংসাপত্রের জন্য Kubernetes সিক্রেট (বা ভল্টের মতো বহিরাগত গোপন পরিচালক) ব্যবহার করুন। ConfigMaps এ কখনই পাসওয়ার্ড সংরক্ষণ করবেন না।
- RBAC— সীমিত অপারেটর পরিষেবা অ্যাকাউন্ট অনুমতি। অ্যাপ্লিকেশন ডাটাবেস ব্যবহারকারীদের জন্য সর্বনিম্ন বিশেষাধিকার অ্যাক্সেস ব্যবহার করুন।
- নেটওয়ার্ক নীতিগুলি— আগের বিভাগে দেখানো হিসাবে পড-টু-পড যোগাযোগ সীমাবদ্ধ করুন।
- pg_hba.conf— কোন আইপি এবং ব্যবহারকারীরা সংযোগ করতে পারে তা সীমাবদ্ধ করতে হোস্ট-ভিত্তিক প্রমাণীকরণ কনফিগার করুন।
- অডিট লগিং— নিয়ন্ত্রিত পরিবেশে SQL অডিট লগিংয়ের জন্য
pgauditএক্সটেনশন সক্ষম করুন৷ - এনক্রিপ্ট করা স্টোরেজ— এনক্রিপ্ট করা স্টোরেজ ক্লাস ব্যবহার করুন (EBS এনক্রিপশন, Azure ডিস্ক এনক্রিপশন, ইত্যাদি)।
- পড সিকিউরিটি স্ট্যান্ডার্ডস— সীমাবদ্ধ নিরাপত্তা প্রসঙ্গের সাথে নন-রুট হিসাবে স্পিলো পড চালান।
# Security-hardened CRD settings
spec:
spiloRunAsUser: 101
spiloRunAsGroup: 103
spiloFSGroup: 103
enableShmVolume: true
patroni:
pg_hba:
- hostssl all all 0.0.0.0/0 md5
- host replication standby all md5
- hostssl replication standby all md5
postgresql:
parameters:
ssl: "on"
ssl_min_protocol_version: "TLSv1.3"
password_encryption: "scram-sha-256"
additionalVolumes:
- name: postgres-tls
mountPath: /tls
secret:
secretName: pg-tls-cert
defaultMode: 0640ক্যাপাসিটি প্ল্যানিং এবং সাইজিং
সঠিক মাপ স্থিতিশীল কর্মক্ষমতা এবং খরচ দক্ষতা নিশ্চিত করে। এই নির্দেশিকাগুলিকে একটি প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করুন এবং আপনার কাজের চাপ পর্যবেক্ষণ ডেটার উপর ভিত্তি করে সামঞ্জস্য করুন:
| কাজের চাপ | CPU | মেমরি | স্টোরেজ | দৃষ্টান্তগুলি | ৷
|---|---|---|---|---|
| ডেভেলপমেন্ট | 500m | 1Gi | 10Gi | 1 |
| ছোট উৎপাদন | 2 কোর | 8Gi | 50Gi SSD | 3 |
| মাঝারি উৎপাদন | 4 কোর | 16Gi | 200Gi SSD | 3 |
| বড় উৎপাদন | 8 কোর | 32Gi | 500Gi SSD | 5 |
| এন্টারপ্রাইজ / অ্যানালিটিক্স | 16+ কোর | 64Gi+ | 1Ti+ SSD | 5+ |
সম্পূর্ণ এন্ড-টু-এন্ড ডিপ্লোয়মেন্ট উদাহরণ
আসুন একটি নতুন Kubernetes ক্লাস্টারে স্ক্র্যাচ থেকে সম্পূর্ণ স্থাপনার সাথে সবকিছু একসাথে রাখি:
# Step 1: Create namespace and configure storage
kubectl create namespace databases
kubectl create namespace postgres-operator
# Step 2: Install the Zalando Postgres Operator
helm repo add postgres-operator-charts \
https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm repo update
helm install postgres-operator postgres-operator-charts/postgres-operator \
--namespace postgres-operator \
--set configKubernetes.enable_pod_antiaffinity=true \
--set configKubernetes.pod_environment_configmap=databases/postgres-pod-config
# Step 3: Create backup configuration
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-pod-config
namespace: databases
data:
USE_WALG_BACKUP: "true"
USE_WALG_RESTORE: "true"
WALG_S3_PREFIX: "s3://my-pg-backups/\$(SCOPE)"
BACKUP_SCHEDULE: "0 1 * * *"
BACKUP_NUM_TO_RETAIN: "14"
EOF
# Step 4: Deploy the PostgreSQL cluster
kubectl apply -f - <<EOF
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
name: pg-app-cluster
namespace: databases
labels:
team: platform
spec:
teamId: "platform"
volume:
size: 50Gi
numberOfInstances: 3
enableConnectionPooler: true
enableReplicaConnectionPooler: true
users:
app_user:
- superuser
- createdb
databases:
app_db: app_user
postgresql:
version: "16"
parameters:
shared_buffers: "2GB"
work_mem: "64MB"
effective_cache_size: "6GB"
resources:
requests:
cpu: "2"
memory: 8Gi
limits:
cpu: "4"
memory: 16Gi
EOF
# Step 5: Wait for cluster readiness
kubectl wait --for=condition=Running postgresql/pg-app-cluster \
-n databases --timeout=300s
# Step 6: Verify cluster status
kubectl get postgresql -n databases
kubectl get pods -n databases -l cluster-name=pg-app-cluster
kubectl get svc -n databases -l cluster-name=pg-app-cluster
# Step 7: Get connection credentials
export PGPASSWORD=$(kubectl get secret app-user.pg-app-cluster.credentials.postgresql.acid.zalan.do \
-n databases -o jsonpath='{.data.password}' | base64 -d)
# Step 8: Connect and verify
kubectl run pg-client --rm -it --image=postgres:16 -n databases -- \
psql -h pg-app-cluster-pooler -U app_user -d app_db -c "SELECT version();"উপসংহার
Zalando Postgres অপারেটর Kubernetes-এ PostgreSQL কে একটি জটিল অপারেশনাল চ্যালেঞ্জ থেকে একটি পরিচালনাযোগ্য, স্বয়ংক্রিয় স্থাপনায় রূপান্তরিত করে। সম্মতি-ভিত্তিক ব্যর্থতার জন্য Patroni, ব্যাটারি-অন্তর্ভুক্ত কন্টেইনার ইমেজের জন্য Spilo, ক্রমাগত ব্যাকআপ এবং পুনরুদ্ধারের জন্য WAL-G এবং দক্ষ সংযোগ পুলিংয়ের জন্য PgBouncer ব্যবহার করার মাধ্যমে, আপনি একটি উৎপাদন-গ্রেড ডাটাবেস প্ল্যাটফর্ম পাবেন যা AWS EKS, Azure, Azure, Azure, XPRALX, AKS, AKS-8-এ বার জুড়ে ধারাবাহিকভাবে কাজ করে।
এই গাইড থেকে নেওয়া মূল উপায় হল:
- সবকিছু স্বয়ংক্রিয় করুন— অপারেটরকে স্টেটফুলসেট পরিচালনা, ব্যর্থতা, এবং ব্যাকআপ সময়সূচী পরিচালনা করতে দিন৷ ম্যানুয়াল হস্তক্ষেপ ব্যতিক্রম হতে হবে।
- আক্রমণাত্মকভাবে মনিটর করুন— প্রথম দিন থেকে Prometheus এবং Grafana স্থাপন করুন। রেপ্লিকেশন ল্যাগ, সংযোগের সংখ্যা, এবং লক বিরোধ আপনার প্রাথমিক সতর্কতা সংকেত।
- দুর্যোগের জন্য পরিকল্পনা— WAL-G ব্যাকআপগুলি কনফিগার করুন, নিয়মিত PITR পরীক্ষা করুন এবং গুরুতর কাজের চাপের জন্য একটি স্ট্যান্ডবাই ক্লাস্টার বজায় রাখুন৷ আপনার কাজের চাপের জন্য
- টিউন— ডিফল্ট PostgreSQL প্যারামিটারগুলি রক্ষণশীল৷ আপনার সম্পদ বরাদ্দ এবং ক্যোয়ারী প্যাটার্নের উপর ভিত্তি করে shared_buffers, work_mem এবং চেকপয়েন্ট সেটিংস সামঞ্জস্য করুন।
- ডিফল্টভাবে সুরক্ষিত— TLS সক্ষম করুন, SCRAM-SHA-256 প্রমাণীকরণ ব্যবহার করুন, নেটওয়ার্ক অ্যাক্সেস সীমিত করুন এবং বিশ্রামে স্টোরেজ এনক্রিপ্ট করুন।
- পরীক্ষা আপগ্রেড— সর্বদা আপনার ক্লাস্টার ক্লোন করুন এবং উত্পাদনে প্রয়োগ করার আগে প্রধান সংস্করণ আপগ্রেডগুলি পরীক্ষা করুন৷
এই ব্যাপক ফাউন্ডেশনের সাহায্যে, আপনি যে কোনও Kubernetes প্ল্যাটফর্মে অত্যন্ত উপলব্ধ PostgreSQL ক্লাস্টার স্থাপন এবং পরিচালনা করতে সুসজ্জিত, এমন অ্যাপ্লিকেশনগুলি পরিবেশন করে যা নির্ভরযোগ্যতা, কর্মক্ষমতা এবং ডেটা অখণ্ডতার দাবি রাখে।