১. ভূমিকা
এই কোডল্যাবে, আপনি শিখবেন কীভাবে Google Kubernetes Engine (GKE) অটোপাইলট ক্লাস্টার বা আপনার নিজস্ব Kubernetes ক্লাস্টারে AlloyDB Omni Kubernetes অপারেটর (কন্টেনার অর্কেস্ট্রেটর) ইনস্টল করতে হয় এবং সম্পূর্ণ এন্ড-টু-এন্ড ডেটাবেস লাইফসাইকেল ওয়ার্কফ্লো এবং ক্রিটিকাল ইউজার জার্নি (CUJ) ম্যানেজ করতে হয়।
AlloyDB Omni হল AlloyDB-এর একটি ডাউনলোডযোগ্য সংস্করণ যা যেকোনও জায়গায় চালানোর জন্য ডিজাইন করা হয়েছে—অন-প্রিমিসেস এনভায়রনমেন্ট থেকে Google Cloud বা এজ কম্পিউটিং পর্যন্ত। কন্টেনার অর্কেস্ট্রেটরের সাহায্যে, AlloyDB Omni হাই অ্যাভেলেবিলিটি, অটোমেটিক ফেলওভার, সেল্ফ-হিলিং, ন্যূনতম ডাউনটাইম সহ রোলিং রক্ষণাবেক্ষণ, কানেকশন পুলিং, অটোমেটেড ব্যাক-আপ এবং পয়েন্ট-ইন-টাইম রিকভারি অটোমেট করে।
আপনার এনভায়রনমেন্ট পাথ বেছে নিন
আপনি নিম্নলিখিত দুটি পথের যেকোনও একটি ব্যবহার করে এই কোডল্যাব সম্পূর্ণ করতে পারবেন:
- পাথ ১: Google Cloud অ্যাকাউন্ট (GKE Autopilot) থাকা — Google Cloud Shell বা Google Cloud Console ব্যবহার করে সম্পূর্ণভাবে ম্যানেজ করা GKE Autopilot ক্লাস্টার প্রোভিশন করুন।
- পাথ ২: Google Cloud অ্যাকাউন্ট নেই (আপনার নিজস্ব Kubernetes ক্লাস্টার ব্যবহার করুন) — আপনার ওয়ার্কস্টেশনে কনফিগার করা
kubectlওhelmসহ আগে থেকে থাকা Kubernetes ক্লাস্টার (v1.21 বা তার পরবর্তী ভার্সন) ব্যবহার করুন। কোনও Google Cloud অ্যাকাউন্ট বাgcloudCLI-এর প্রয়োজন নেই।
পূর্বশর্ত
- Kubernetes কনসেপ্ট (
kubectl, Helm, কাস্টম রিসোর্স ডেফিনেশন) সম্পর্কে প্রাথমিক ধারণা। - পাথ ১-এর জন্য (Google Cloud / GKE Autopilot):
- বিলিং চালু করা আছে এমন একটি Google Cloud প্রোজেক্ট।
- Google Cloud Shell বা
gcloud,kubectlওhelm-এর মাধ্যমে কনফিগার করা ওয়ার্কস্টেশনে অ্যাক্সেস।
- পাথ ২-এর জন্য (আপনার নিজস্ব Kubernetes ক্লাস্টার নিয়ে আসুন):
- ডায়নামিক PersistentVolume প্রভিশনিংয়ের জন্য ডিফল্ট
StorageClassসহ Kubernetes ক্লাস্টার ভার্সন 1.21 বা তার পরবর্তী যেকোনও ভার্সন। - cgroup v2 চালু (x86-64/AMD64) সহ Linux কার্নেল 4.18+ ভার্সনে রান করা ওয়ার্কার নোড এবং ক্লাস্টার জুড়ে অন্তত ৮টি vCPU ও ২৪ GiB বরাদ্দযোগ্য RAM।
- আপনার ক্লাস্টারের সাথে কানেক্ট করা
kubectlওhelmসহ কনফিগার করা একটি ওয়ার্কস্টেশন।
- ডায়নামিক PersistentVolume প্রভিশনিংয়ের জন্য ডিফল্ট
আপনি কী শিখবেন
- কীভাবে GKE Autopilot ক্লাস্টার (পাথ ১) প্রোভিশন করতে হয় বা আগে থেকে থাকা Kubernetes ক্লাস্টার (পাথ ২) যাচাই করতে হয়।
- Helm-এর মাধ্যমে কীভাবে cert-manager এবং AlloyDB Omni Kubernetes অপারেটর ইনস্টল করতে হয়।
- কীভাবে সিঙ্গল-ইনস্ট্যান্স AlloyDB Omni
DBClusterডিপ্লয় করতে হয়। - সিঙ্ক্রোনাস স্ট্যান্ডবাইয়ের মাধ্যমে কীভাবে হাই অ্যাভেলেবিলিটি (HA) স্কেল করবেন এবং শুধুমাত্র পড়ার স্ট্যান্ডবাই ক্ষমতা চালু করবেন।
- লোকাল রিপোজিটরি স্টোরেজে (এবং ঐচ্ছিকভাবে পাথ ১-এ Google Cloud Storage) শিডিউল করা অটোমেটেড ব্যাক-আপ কীভাবে কনফিগার করবেন।
- কীভাবে অন-ডিমান্ড ব্যাক-আপ নিতে হয় এবং আগের অবস্থায় ডেটা রিস্টোরেশন যাচাই করতে হয়।
- নতুন ক্লোন করা ডেটাবেস ক্লাস্টারে কীভাবে পয়েন্ট-ইন-টাইম রিকভারি (PITR) পারফর্ম করতে হয়।
- ক্লায়েন্ট কানেকশন স্কেলিংয়ের জন্য কীভাবে PgBouncer কানেকশন পুলিং ডিপ্লয় করতে হয়।
- ডেটাবেস ভিজ্যুয়ালি ম্যানেজ ও কোয়েরি করার জন্য কীভাবে pgAdmin4 ডেপ্লয় করবেন।
- সিপিইউ ও মেমরি রিসোর্স স্কেলিংয়ের জন্য কীভাবে লো ডাউনটাইম মেইনটেন্যান্স (LDTM) এক্সিকিউট করতে হয়।
আপনার যা প্রয়োজন হবে
- পাথ ১: আগে থেকে ইনস্টল করা
gcloud,kubectlওhelmইউটিলিটি সহ Google Cloud Shell। - পাথ ২: আপনার Kubernetes ক্লাস্টারের সাথে কানেক্ট করা
kubectlওhelmসহ একটি টার্মিনাল। - রেফারেন্স ডকুমেন্টেশনের জন্য, অফিসিয়াল AlloyDB Omni ডিপ্লয়মেন্ট গাইড দেখুন।
২. সেট-আপ ও প্রয়োজনীয়তা
GKE অটোপাইলট ক্লাস্টার তৈরি করার জন্য Google Cloud অ্যাকাউন্ট ব্যবহার করলে পাথ ১ বেছে নিন অথবা Google Cloud অ্যাকাউন্ট ছাড়া নিজের Kubernetes ক্লাস্টার ব্যবহার করলে পাথ ২ বেছে নিন।
পাথ ১: Google Cloud প্রোজেক্ট সেট-আপ (GKE Autopilot)
- Google Cloud কনসোল থেকে, Google Cloud প্রোজেক্ট বেছে নিন বা তৈরি করুন।
- আপনার প্রোজেক্টের জন্য বিলিং চালু করা আছে কিনা তা কনফার্ম করুন। বিলিং স্ট্যাটাস কীভাবে যাচাই করবেন তা জানুন।
- Google Cloud Console-এর উপরের ডানদিকের কোণে Cloud Shell অ্যাক্টিভেট করুন আইকনে ক্লিক করে অথবা shell.cloud.google.com লিঙ্কে গিয়ে Google Cloud Shell খুলুন। Cloud Shell,
gcloud,kubectlওhelmসহ একটি কম্পিউট এনভায়রনমেন্ট প্রদান করে। - আপনার প্রোজেক্ট আইডি এনভায়রনমেন্ট ভেরিয়েবল হিসেবে সেট করুন এবং
gcloudকনফিগার করুন:
export PROJECT_ID="<YOUR_PROJECT_ID>"
export REGION="us-central1"
export CLUSTER_NAME="omni-autopilot-cluster"
gcloud config set project ${PROJECT_ID}
gcloud config set compute/region ${REGION}
- GKE এবং Cloud Storage-এর জন্য প্রয়োজনীয় Google Cloud API চালু করুন:
gcloud services enable container.googleapis.com \
storage.googleapis.com \
cloudresourcemanager.googleapis.com
পাথ ২: Bring-Your-Own ক্লাস্টার সেট-আপ (Google Cloud অ্যাকাউন্ট নেই)
আপনার যদি Google Cloud অ্যাকাউন্ট না থাকে এবং আপনি নিজের Kubernetes ক্লাস্টার ব্যবহার করেন, তাহলে চালিয়ে যাওয়ার আগে আপনার টার্মিনাল থেকে নিম্নলিখিত পূর্বশর্তগুলি যাচাই করুন:
kubectlএবংhelmআপনার ক্লাস্টারে পৌঁছাতে পারছে কিনা এবং আপনার নোডগুলিReadyকিনা তা যাচাই করুন:
kubectl get nodes
helm version
- আপনার ক্লাস্টারে ডিফল্ট
StorageClassহিসেবে চিহ্নিত(default)আছে কিনা তা যাচাই করুন।DBClusterএবংBackupPlanম্যানিফেস্ট ক্লাস্টারের ডিফল্টStorageClassব্যবহার করে ডাইনামিকভাবে PersistentVolumeClaims প্রদান করে:
kubectl get storageclass
কোনও StorageClass (default) হিসেবে চিহ্নিত না করা থাকলে, এগিয়ে যাওয়ার আগে একটিকে ডিফল্ট হিসেবে চিহ্নিত করুন:
kubectl patch storageclass <YOUR_STORAGE_CLASS_NAME> \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
- আপনার ওয়ার্কার নোড অপারেটরের হার্ডওয়্যার ও OS সংক্রান্ত প্রয়োজনীয়তা পূরণ করছে কিনা তা কনফার্ম করুন:
- OS ও কার্নেল: x86-64/AMD64 নোডে cgroup v2 চালু থাকা Linux কার্নেল 4.18 বা তার পরবর্তী ভার্সন।
- ক্লাস্টার ক্যাপাসিটি: HA ডেটাবেস ইনস্ট্যান্স (ধাপ ১২-এ প্রতিটি ২ vCPU এবং ৮ GiB-এ স্কেল করা হয়েছে), PITR ক্লোন করা ইনস্ট্যান্স, PgBouncer এবং pgAdmin4 একসাথে চালানোর জন্য আপনার ওয়ার্কার নোড জুড়ে কমপক্ষে ৮ vCPU এবং ২৪ GiB বরাদ্দযোগ্য মেমরি।
- নেটওয়ার্ক অ্যাক্সেস:
gcr.io/alloydb-omni,quay.io/jetstackওdocker.ioথেকে কন্টেনার ইমেজ পুল করার জন্য আউটবাউন্ড ইন্টারনেট অ্যাক্সেস।
৩. আপনার Kubernetes ক্লাস্টারে প্রভিশন বা কানেক্ট করুন
আপনি যদি পাথ ১ (Google Cloud অ্যাকাউন্ট) অনুসরণ করেন, তাহলে GKE Autopilot একটি হ্যান্ডস-অফ, সম্পূর্ণ ম্যানেজ করা Kubernetes মোড প্রদান করে যেখানে Google ক্লাস্টার ইনফ্রাস্ট্রাকচার, নোড প্রোভিশনিং এবং অটোস্কেলিং ম্যানেজ করে। আপনি Google Cloud CLI বা Google Cloud Console ব্যবহার করে GKE Autopilot ক্লাস্টার তৈরি করতে পারবেন।
বিকল্প ক: CLI-এর মাধ্যমে GKE অটোপাইলট ক্লাস্টার তৈরি করুন (পাথ ১)
Cloud Shell-এ নিম্নলিখিত gcloud কমান্ড এক্সিকিউট করুন:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--region=${REGION} \
--project=${PROJECT_ID}
বিকল্প খ: কনসোলের মাধ্যমে GKE অটোপাইলট ক্লাস্টার তৈরি করা (পাথ ১)
- Google Cloud Console-এ Kubernetes Engine খুলুন।
- বাঁদিকের নেভিগেশন প্যানেলে, ক্লাস্টার বিকল্পে ক্লিক করুন।
- তৈরি করুন বিকল্পে ক্লিক করুন।
- GKE Autopilot বিভাগে, কনফিগার করুন বিকল্পে ক্লিক করুন।
- আপনার ক্লাস্টারের নাম (যেমন,
omni-autopilot-cluster) উল্লেখ করুন এবং আপনার পছন্দের অঞ্চল (us-central1) বেছে নিন। - তৈরি করুন বিকল্পে ক্লিক করুন।
ক্লাস্টার কানেক্টিভিটি যাচাই করুন (পাথ ১ এবং পাথ ২)
আপনি পাথ ১-এ GKE Autopilot ক্লাস্টার তৈরি করে থাকলে, আপনার kubectl ক্রেডেনশিয়াল কনফিগার করুন:
gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${REGION} --project=${PROJECT_ID}
পাথ ১ এবং পাথ ২, দুটির জন্যই আপনার Kubernetes ক্লাস্টারের সাথে কানেক্টিভিটি যাচাই করুন:
kubectl get nodes
৪. অপারেটর পূর্বশর্ত এবং অপারেটর ইনস্টল করুন
অ্যাডমিশন ওয়েবহুক TLS সার্টিফিকেট ম্যানেজ করার জন্য AlloyDB Omni Kubernetes অপারেটরের cert-manager প্রয়োজন।
১. cert-manager ইনস্টল করুন
অফিসিয়াল Helm চার্ট ব্যবহার করে cert-manager ইনস্টল করুন:
helm install \
cert-manager oci://quay.io/jetstack/charts/cert-manager \
--version v1.21.2 \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true \
--set global.leaderElection.namespace=cert-manager
cert-manager পড চলছে কিনা তা যাচাই করুন:
kubectl wait --namespace cert-manager \
--for=condition=ready pod \
--selector=app.kubernetes.io/instance=cert-manager \
--timeout=120s
২. AlloyDB Omni অপারেটর ইনস্টল করুন
Helm ব্যবহার করে alloydb-omni-system নেমস্পেসে AlloyDB Omni Kubernetes অপারেটর ডিপ্লয় করুন:
helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
--version 1.8.2 \
--create-namespace \
--namespace alloydb-omni-system \
$(helm install --help | grep -q -- '--rollback-on-failure' && echo '--rollback-on-failure' || echo '--atomic') \
--timeout 5m
অপারেটর পড ঠিক আছে এবং চলছে কিনা তা যাচাই করুন:
kubectl get pods -n alloydb-omni-system
৫. সিঙ্গেল-ইনস্ট্যান্স ডেটাবেস ক্লাস্টার তৈরি করা
এই ধাপে, আপনি একটি নির্দিষ্ট অ্যাপ্লিকেশন নেমস্পেস তৈরি করবেন এবং একটি সিঙ্গল-ইনস্ট্যান্স AlloyDB Omni DBCluster ডিপ্লয় করবেন।
১. নেমস্পেস ও অ্যাডমিন ক্রেডেনশিয়াল সিক্রেট তৈরি করুন
ডেটাবেস ওয়ার্কলোডের জন্য নেমস্পেস omni-demo তৈরি করুন:
kubectl create namespace omni-demo
ডিফল্ট postgres ডেটাবেস অ্যাডমিনিস্ট্রেটর ব্যবহারকারীর জন্য পাসওয়ার্ড স্টোর করে এমন একটি Kubernetes সিক্রেট তৈরি করুন:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: db-pw-adbo
type: Opaque
data:
adbo: "Q2hhbmdlTWUxMjM=" # Base64 for "ChangeMe123"
EOF
২. সিঙ্গেল-ইনস্ট্যান্স DBCluster ডিপ্লয় করুন
সিঙ্গেল-ইনস্ট্যান্স DBCluster ম্যানিফেস্ট তৈরি করুন:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: adbo
spec:
databaseVersion: "18.3.0"
primarySpec:
adminUser:
passwordRef:
name: db-pw-adbo
resources:
cpu: 1
memory: 4Gi
disks:
- name: DataDisk
size: 10Gi
EOF
৩. ক্লাস্টার রেডিনেস যাচাই করুন
DBCLUSTERPHASE, DBClusterReady-এ না পৌঁছানো পর্যন্ত ক্লাস্টারের স্ট্যাটাস মনিটর করুন। প্রাথমিক প্রভিশনিং করতে কয়েক মিনিট সময় লাগতে পারে: অপারেটরকে অবশ্যই পারসিস্টেন্ট ভলিউম তৈরি করতে হবে এবং ডেটাবেস ইমেজ পুল করতে হবে এবং GKE Autopilot-এ প্রথমে একটি নতুন নোড প্রভিশন করতে হতে পারে।
kubectl get dbcluster -n omni-demo -w
DBCLUSTERPHASE, DBClusterReady-এ পৌঁছে গেলে, দেখার মোড থেকে বেরিয়ে আসতে Ctrl+C প্রেস করুন।
স্যাম্পেল আউটপুট:
NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON
adbo 10.128.0.45 Ready DBClusterReady
PRIMARYENDPOINT IP অ্যাড্রেসটি নোট করুন, এটি হল রিড-রাইট Kubernetes পরিষেবা al-adbo-rw-ilb-এর ClusterIP। AlloyDB Omni ডিফল্ট PostgreSQL পোর্ট 5432-এ শোনে।
সিঙ্গেল DBCluster ম্যানিফেস্ট থেকে অপারেটর যে রিসোর্স রিকনসাইল করেছে তা পরীক্ষা করুন—ডেটাবেস Pod, DataDisk PersistentVolumeClaim এবং al-adbo-rw-ilb পরিষেবা:
kubectl get pods,svc,pvc -n omni-demo
৬. হাই অ্যাভেলেবিলিটি (HA)-তে আপগ্রেড করুন এবং শুধুমাত্র পড়ার জন্য স্ট্যান্ডবাই চালু করুন
AlloyDB Omni-তে স্ট্রিমিং রেপ্লিকেশন, অটোমেটিক হেলথ মনিটরিং, অটোমেটেড ফেলওভার ও রিড-রেপ্লিকা সার্ভিং সহ বিল্ট-ইন হাই অ্যাভেলেবিলিটি (HA) প্রদান করা হয়।
১. HA ও Read Replica ক্ষমতা চালু করুন
১টি স্ট্যান্ডবাই ইনস্ট্যান্স কনফিগার করতে এবং শুধুমাত্র-পড়ার-জন্য স্ট্যান্ডবাই রাউটিং চালু করতে DBCluster স্পেসিফিকেশন আপডেট করুন:
kubectl patch dbcluster adbo -n omni-demo --type=merge -p '{
"spec": {
"availability": {
"numberOfStandbys": 1,
"enableStandbyAsReadReplica": true
}
}
}'
২. HA Stabilization যাচাই করুন
স্ট্যান্ডবাই ইনস্ট্যান্সের প্রভিশন এবং হেলদি স্ট্রিমিং রেপ্লিকেশন (HAREADYSTATUS থেকে True এবং HAREADYREASON থেকে Ready) হওয়া পর্যন্ত অপেক্ষা করুন, তারপর ওয়াচ মোড থেকে বেরিয়ে আসতে Ctrl+C প্রেস করুন:
kubectl get dbcluster adbo -n omni-demo -w
HAReady স্ট্যাটাসের শর্ত চেক করুন:
kubectl get dbcluster.alloydbomni.dbadmin.goog adbo -n omni-demo -o jsonpath='{.status.conditions[?(@.type == "HAReady")]}'
রিড-রাইট এবং শুধু-পড়ার এন্ডপয়েন্ট দুটিই প্রকাশিত হয়েছে কিনা তা যাচাই করুন:
kubectl describe dbcluster adbo -n omni-demo | grep -A 8 "Endpoints:"
স্যাম্পেল আউটপুট:
Endpoints:
Name: Read-Write
Value: 10.128.0.45:5432
Name: Read-Only
Value: 10.128.0.46:5432
রিড-রাইট এন্ডপয়েন্ট (al-adbo-rw-ilb পরিষেবা) প্রাইমারি ডেটাবেসে রুট করে, যেখানে রিড-অনলি এন্ডপয়েন্ট (al-adbo-ro-ilb পরিষেবা) স্ট্যান্ডবাই ইনস্ট্যান্স জুড়ে রিড কোয়েরি ডিস্ট্রিবিউট করে।
৭. অটোমেটেড BackupPlans (লোকাল এবং GCS) কনফিগার করুন
AlloyDB Omni BackupPlan কাস্টম রিসোর্সের মাধ্যমে ফিজিক্যাল ব্যাক-আপ ও WAL আর্কাইভ করার সুবিধা প্রদান করে। আপনি ব্যাক-আপ রিটেনশন, অটোমেটেড ক্রন শিডিউল এবং ব্যাক-আপ টার্গেট (লোকাল পারসিস্টেন্ট ভলিউম বা Google Cloud Storage) কনফিগার করতে পারবেন।
১. স্থানীয় BackupPlan তৈরি করুন
এমন একটি BackupPlan তৈরি করুন যা ডেটাবেস ইনস্ট্যান্সের সাথে অ্যাটাচ করা স্থানীয় Kubernetes স্টোরেজে ব্যাক-আপ লেখে:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: BackupPlan
metadata:
name: backupplan-local
spec:
dbclusterRef: adbo
backupSchedules:
full: "0 2 * * *" # Daily at 02:00 UTC
incremental: "0 */4 * * *" # Every 4 hours
backupRetainDays: 7
EOF
লোকাল BackupPlan রেডি আছে কিনা তা যাচাই করুন:
kubectl get backupplan backupplan-local -n omni-demo
PHASE রিপোর্ট Ready এবং NEXTBACKUPTIME শিডিউল না হওয়া পর্যন্ত অপেক্ষা করুন।
২. GCS BackupPlan তৈরি করুন (পাথ ১: শুধুমাত্র Google Cloud — ঐচ্ছিক)
Google Cloud Storage বাকেটে এক্সটার্নাল ব্যাক-আপ স্টোর করতে, GCS বাকেট তৈরি করুন, পরিষেবা অ্যাকাউন্ট কী সিক্রেট কনফিগার করুন এবং ক্লাউড BackupPlan প্রয়োগ করুন।
- Cloud Storage বাকেট তৈরি করুন:
export BUCKET_NAME="${PROJECT_ID}-omni-backups"
gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
- Storage Object Admin-এর অনুমতি সহ একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন এবং এটির জন্য একটি কী তৈরি করুন:
export SA_NAME="omni-backup-sa"
gcloud iam service-accounts create ${SA_NAME} --display-name="AlloyDB Omni Backup SA"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/storage.objectAdmin"
gcloud iam service-accounts keys create /tmp/gcs-key.json \
--iam-account="${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
- আপনার Kubernetes নেমস্পেসে সিক্রেট তৈরি করুন:
kubectl create secret generic gcs-backup-secret \
--from-file=key.json=/tmp/gcs-key.json \
-n omni-demo
rm /tmp/gcs-key.json
- GCS
BackupPlanম্যানিফেস্ট প্রয়োগ করুন।keyফিল্ড হল বাকেটের সেই ফোল্ডার যেখানে অপারেটর ব্যাক-আপ লেখে। এটি অবশ্যই/দিয়ে শুরু হতে হবে।
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: BackupPlan
metadata:
name: backupplan-gcs
spec:
dbclusterRef: adbo
backupSchedules:
full: "0 1 * * *"
incremental: "0 */6 * * *"
backupRetainDays: 14
backupLocation:
type: GCS
gcsOptions:
bucket: ${BUCKET_NAME}
key: /omni-backups/adbo
secretRef:
name: gcs-backup-secret
namespace: omni-demo
EOF
GCS BackupPlan স্ট্যাটাস যাচাই করুন:
kubectl get backupplan backupplan-gcs -n omni-demo
PHASE রিপোর্ট Ready এবং NEXTBACKUPTIME শিডিউল না হওয়া পর্যন্ত অপেক্ষা করুন।
৮. ডেটা যোগ করা, ব্যাক-আপ ট্রিগার করা এবং রিস্টোর পরীক্ষা করা
এই ধাপে, আপনি প্রাথমিক ডেটাবেসে প্রাথমিক ডেটা পপুলেট করবেন, অন-ডিমান্ড ম্যানুয়াল ব্যাকআপ ট্রিগার করবেন, পরবর্তী ডেটা যোগ করবেন এবং ডেটা রোলব্যাক প্রমাণ করতে ব্যাকআপ থেকে রিস্টোর করবেন।
১. প্রাথমিক ডেটা পপুলেট করুন
postgres ব্যবহারকারী হিসেবে রিড-রাইট পরিষেবা al-adbo-rw-ilb-এর মাধ্যমে ডেটাবেসে কানেক্ট করতে একটি অস্থায়ী PostgreSQL ক্লায়েন্ট পড চালান:
kubectl run pg-client --rm -i --tty --image=postgres:16 --restart=Never -n omni-demo -- \
psql -h al-adbo-rw-ilb -U postgres -d postgres -c "
CREATE TABLE customers (id SERIAL PRIMARY KEY, name TEXT, created_at TIMESTAMPTZ DEFAULT pg_catalog.now());
INSERT INTO customers (name) VALUES ('Alpha Co'), ('Beta LLC');
SELECT * FROM customers;
"
পাসওয়ার্ডের জন্য প্রম্পট করা হলে, ChangeMe123 লিখুন। এটি হল সেই পাসওয়ার্ড যা আপনি ৫ নম্বর ধাপে db-pw-adbo সিক্রেটে base64-এনকোড করেছেন।
২. চাহিদা অনুযায়ী ব্যাক-আপ ট্রিগার করা
আপনার স্থানীয় BackupPlan রেফারেন্স করে ম্যানুয়াল Backup কাস্টম রিসোর্স তৈরি করুন:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Backup
metadata:
name: initial-customer-backup
spec:
dbclusterRef: adbo
backupPlanRef: backupplan-local
manual: true
EOF
ব্যাক-আপের প্রগ্রেস মনিটর করুন:
kubectl get backup initial-customer-backup -n omni-demo -w
PHASE থেকে Succeeded-এ ট্রানজিশন না হওয়া পর্যন্ত অপেক্ষা করুন।
৩. ডেটা মিউটেট করুন (নতুন রেকর্ড যোগ করুন)
ব্যাক-আপের পরে অতিরিক্ত রেকর্ড যোগ করুন:
kubectl run pg-client --rm -i --tty --image=postgres:16 --restart=Never -n omni-demo \
--env="PGPASSWORD=ChangeMe123" -- \
psql -h al-adbo-rw-ilb -U postgres -d postgres -c "
INSERT INTO customers (name) VALUES ('Gamma Inc'), ('Delta Corp');
SELECT * FROM customers;
"
ডেটাবেসে এখন ৪টি সারি আছে।
৪. ব্যাক-আপ থেকে ফিরিয়ে আনুন
initial-customer-backup-এ ক্যাপচার করা অবস্থায় ফিরিয়ে আনার জন্য ট্রিগার করুন:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Restore
metadata:
name: restore-to-initial
spec:
sourceDBCluster: adbo
backup: initial-customer-backup
EOF
রিস্টোর অপারেশন মনিটর করুন:
kubectl get restore restore-to-initial -n omni-demo -w
PHASE-এর মান ProvisionSucceeded না হওয়া পর্যন্ত অপেক্ষা করুন এবং DBCluster-এর মান DBClusterReady-এ ফিরে এসেছে কিনা তা যাচাই করুন:
kubectl get dbcluster adbo -n omni-demo -w
৫. রিস্টোর করা ডেটার স্ট্যাটাস যাচাই করুন
শুধুমাত্র প্রি-ব্যাক-আপ রেকর্ড আছে কিনা তা যাচাই করতে customers টেবিল কোয়েরি করুন:
kubectl run pg-client --rm -i --tty --image=postgres:16 --restart=Never -n omni-demo \
--env="PGPASSWORD=ChangeMe123" -- \
psql -h al-adbo-rw-ilb -U postgres -d postgres -c "
SELECT * FROM customers;
"
আউটপুট কনফার্ম করে যে শুধুমাত্র ২টি সারি (Alpha Co এবং Beta LLC) আছে, যা যাচাই করে যে ডেটাবেসটি সঠিক ব্যাকআপ অবস্থায় রিস্টোর করা হয়েছে।
৯. ক্লোন করা ডেটাবেসে পয়েন্ট-ইন-টাইম রিকভারি (PITR)
পয়েন্ট-ইন-টাইম রিকভারি (PITR) বেস ব্যাক-আপ ও WAL স্ট্রিম লগ ব্যবহার করে রিকভারি উইন্ডোর মধ্যে যেকোনও সেকেন্ডে ডেটাবেস রিস্টোর করার সুবিধা দেয়, রিস্টোর করা ডেটা নতুন ক্লোন করা ডেটাবেস ক্লাস্টারে প্রোভিশন করে।
যেহেতু অপারেটর ক্রমাগত রাইট-অ্যাহেড লগ (WAL) আর্কাইভ করে, তাই PITR আপনাকে দুর্ঘটনাজনিত মানবিক বা অ্যাপ্লিকেশন ত্রুটি থেকে পুনরুদ্ধার করতে দেয়—উদাহরণস্বরূপ, দুপুর ২:১৫:০০-এ একটি অনিচ্ছাকৃত DELETE বা DROP TABLE—ভুল হওয়ার ঠিক এক সেকেন্ড আগে (দুপুর ২:১৪:৫৯) ডেটাবেস ক্লোন করে, আসল ক্লাস্টার স্পর্শ না করেই।
১. বর্তমান টাইমস্ট্যাম্প রেকর্ড করুন এবং ডেটা মিউটেট করুন
বর্তমান UTC টাইমস্ট্যাম্প রিট্রিভ করুন:
export PITR_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
echo "PITR Target Timestamp: ${PITR_TIMESTAMP}"
এই টাইমস্ট্যাম্পের পরে অবাঞ্ছিত পরিবর্তন দেখায় এমন একটি টেস্ট রেকর্ড যোগ করুন:
kubectl run pg-client --rm -i --tty --image=postgres:16 --restart=Never -n omni-demo \
--env="PGPASSWORD=ChangeMe123" -- \
psql -h al-adbo-rw-ilb -U postgres -d postgres -c "
INSERT INTO customers (name) VALUES ('Unwanted Record Post-Timestamp');
SELECT * FROM customers;
"
২. পয়েন্ট-ইন-টাইম রিস্টোর করুন
Restore কাস্টম রিসোর্স কনফিগারেশন pointInTime এবং clonedDBClusterConfig প্রয়োগ করুন:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Restore
metadata:
name: restore-pitr-clone
spec:
sourceDBCluster: adbo
pointInTime: "${PITR_TIMESTAMP}"
clonedDBClusterConfig:
dbclusterName: adbo-cloned
EOF
PHASE-এর মান ProvisionSucceeded না হওয়া পর্যন্ত রিস্টোর অপারেশন মনিটর করুন:
kubectl get restore restore-pitr-clone -n omni-demo -w
৩. ক্লোন করা ডেটাবেস যাচাই করুন
রিস্টোর সম্পূর্ণ হয়ে গেলে, নতুন ক্লোন করা DBCluster DBClusterReady-এ পৌঁছানো পর্যন্ত অপেক্ষা করুন (ওয়াচ মোড থেকে বেরিয়ে আসতে Ctrl+C প্রেস করুন):
kubectl get dbcluster adbo-cloned -n omni-demo -w
ক্লোন করা ডেটাবেস adbo-cloned-এ এর রিড-রাইট পরিষেবা al-adbo-cloned-rw-ilb-এর মাধ্যমে কোয়েরি করুন:
kubectl run pg-client --rm -i --tty --image=postgres:16 --restart=Never -n omni-demo \
--env="PGPASSWORD=ChangeMe123" -- \
psql -h al-adbo-cloned-rw-ilb -U postgres -d postgres -c "
SELECT * FROM customers;
"
লক্ষ্য করুন যে ক্লোন করা ক্লাস্টারে Unwanted Record Post-Timestamp অনুপস্থিত, যা সঠিক টার্গেট পয়েন্টে সঠিক সময়ে রিকভারি প্রদর্শন করে।
১০. PgBouncer কানেকশন পুলার ডিপ্লয় করুন
কানেকশন পুলিং ডেটাবেস মেমরি ওভারহেড এবং কানেকশন লেটেন্সি কমায়। অপারেটর PgBouncer কাস্টম রিসোর্সের মাধ্যমে নেটিভভাবে PgBouncer ইনস্ট্যান্স ম্যানেজ করে।
PostgreSQL প্রতিটি ক্লায়েন্ট কানেকশনের জন্য একটি আলাদা অপারেটিং-সিস্টেম প্রসেস ফর্ক করে, তাই ওয়েব পরিষেবা, মাইক্রোসার্ভিস বা AI এজেন্ট থেকে শত শত সমবর্তী কানেকশন ডেটাবেস মেমরি শেষ করে দিতে পারে। PgBouncer ডেটাবেসের সামনে থাকে এবং অনেক স্বল্পস্থায়ী ক্লায়েন্ট কানেকশন (max_client_conn পর্যন্ত) দীর্ঘস্থায়ী PostgreSQL সার্ভার কানেকশনের একটি ছোট পুলে (ব্যবহারকারী/ডেটাবেস জোড়া প্রতি default_pool_size, max_db_connections দ্বারা সীমাবদ্ধ) মাল্টিপ্লেক্স করে।
১. PgBouncer ডিপ্লয় করুন
adbo ক্লাস্টারের সাথে লিঙ্ক করা ২-রেপ্লিকা PgBouncer পুলার ডিপ্লয় করুন:
kubectl apply -n omni-demo -f - <<EOF
apiVersion: alloydbomni.dbadmin.goog/v1
kind: PgBouncer
metadata:
name: omni-pgbouncer
spec:
dbclusterRef: adbo
allowSuperUserAccess: true
replicaCount: 2
parameters:
pool_mode: transaction
default_pool_size: "20"
max_client_conn: "500"
max_db_connections: "100"
podSpec:
resources:
cpu: 1
memory: 1Gi
image: "gcr.io/alloydb-omni/operator/g-pgbouncer:1.4.0"
serviceOptions:
type: ClusterIP
EOF
২. PgBouncer স্ট্যাটাস যাচাই করুন
PHASE, Ready না হওয়া পর্যন্ত PgBouncer স্ট্যাটাস দেখুন:
kubectl get pgbouncer omni-pgbouncer -n omni-demo -w
চলমান PgBouncer পড এবং পরিষেবা চেক করুন:
kubectl get pods -n omni-demo
kubectl get svc al-omni-pgbouncer-pgb-svc -n omni-demo
৩. PgBouncer-এর মাধ্যমে কানেক্ট করুন
6432 পোর্টে PgBouncer পরিষেবার মাধ্যমে ক্লায়েন্ট কানেক্ট করুন:
kubectl run pg-client --rm -i --tty --image=postgres:16 --restart=Never -n omni-demo \
--env="PGPASSWORD=ChangeMe123" -- \
psql -h al-omni-pgbouncer-pgb-svc -p 6432 -U postgres -d postgres -c "
SELECT pg_catalog.version();
SELECT * FROM customers;
"
PgBouncer নির্বিঘ্নে প্রাইমারি AlloyDB Omni ডেটাবেসে কোয়েরি প্রক্সি করে।
১১. ডেটাবেস অ্যাক্সেস করতে pgAdmin4 ডিপ্লয় করা
AlloyDB Omni কোয়েরি, ম্যানেজ ও পরীক্ষা করার জন্য ওয়েব-ভিত্তিক অ্যাডমিনিস্ট্রেশন কনসোল প্রদান করতে, আপনি সরাসরি Kubernetes ক্লাস্টারের মধ্যে pgAdmin4 চালাতে পারবেন।
১. Helm-এর মাধ্যমে pgAdmin4 ইনস্টল করুন
omni-demo নেমস্পেসে pgadmin4 ইনস্টল করুন:
helm install my-pgadmin oci://docker.io/dpage/pgadmin4-helm \
--namespace omni-demo \
--set ingress.enabled=false \
--set image.tag=latest \
--set auth.email="admin@example.com" \
--set auth.password="AdminPassword123"
এই চার্টটি তার Kubernetes রিসোর্সগুলির নাম pgadmin4 (Deployment, Service, PersistentVolumeClaim) এবং তার Pods-কে app=pgadmin4 দিয়ে লেবেল করে, Helm রিলিজের নাম (my-pgadmin) যাই হোক না কেন।
pgAdmin4 পড চলছে কিনা তা যাচাই করুন:
kubectl wait --namespace omni-demo \
--for=condition=ready pod \
--selector=app=pgadmin4 \
--timeout=300s
২. পোর্ট ফরওয়ার্ড করুন এবং ওয়েব UI অ্যাক্সেস করুন
আপনার লোকাল এনভায়রনমেন্ট বা Cloud Shell-এ pgAdmin4 পোর্ট-ফরওয়ার্ড করুন:
kubectl port-forward service/pgadmin4 5050:80 -n omni-demo
আপনি যতক্ষণ pgAdmin4 ওয়েব UI ব্যবহার করবেন, ততক্ষণ kubectl port-forward ফোরগ্রাউন্ডে চলতে থাকবে। অন্যান্য কমান্ডের জন্য দ্বিতীয় টার্মিনাল (বা নতুন Cloud Shell ট্যাব) খুলুন এবং পরবর্তী ধাপে যাওয়ার জন্য প্রস্তুত হলে এই টার্মিনালে Ctrl+C প্রেস করুন।
pgAdmin4 ওয়েব ইন্টারফেস খুলুন:
- পাথ ১ (Google Cloud Shell): উপরে ডানদিকের মেনুতে ওয়েব প্রিভিউ বোতামে ক্লিক করুন, পোর্ট পরিবর্তন করুন বিকল্প বেছে নিন,
5050লিখুন এবং পরিবর্তন ও প্রিভিউ করুন বিকল্পে ক্লিক করুন। - পাথ ২ (লোকাল ওয়ার্কস্টেশন):
kubectl port-forwardকমান্ড চলাকালীন আপনার ব্রাউজারেhttp://localhost:5050খুলুন।
এর মাধ্যমে লগ-ইন করুন:
- ইমেল:
admin@example.com - পাসওয়ার্ড:
AdminPassword123
৩. pgAdmin4-এ AlloyDB Omni রেজিস্টার করা
- pgAdmin4-এ, সার্ভার > রেজিস্টার করুন > সার্ভার... বিকল্পে মাউস রেখে ডানদিকের বোতামে ক্লিক করুন।
- সাধারণ ট্যাবের অধীনে:
- নাম:
AlloyDB Omni Primary
- নাম:
- কানেকশন ট্যাবের মধ্যে:
- হোস্টের নাম/অ্যাড্রেস:
al-adbo-rw-ilb.omni-demo.svc.cluster.local(অথবা PgBouncer-এর জন্যal-omni-pgbouncer-pgb-svc.omni-demo.svc.cluster.local) - পোর্ট:
5432(অথবা PgBouncer-এর জন্য6432) - রক্ষণাবেক্ষণ ডেটাবেস:
postgres - ইউজারনেম:
postgres - পাসওয়ার্ড:
ChangeMe123
- হোস্টের নাম/অ্যাড্রেস:
- সেভ করুন বিকল্পে ক্লিক করুন এবং অ্যাক্টিভ ডেটাবেস সেশন ও টেবিল যাচাই করুন।
১২. লো ডাউনটাইম মেইনটেন্যান্স (LDTM) সহ সিপিইউ ও মেমরি স্কেল করুন
প্রোডাকশন ডেটাবেসে কম্পিউট ও মেমরি ভার্টিক্যালি স্কেল করার সময়, ট্র্যাডিশনাল আপডেট ডেটাবেস রিস্টার্ট করার ক্ষেত্রে বিঘ্ন ঘটায়। AlloyDB Omni, লো ডাউনটাইম মেইনটেন্যান্স (LDTM) প্রদান করে যাতে অ্যাপ্লিকেশন বিঘ্নিত না করে রেপ্লিকার মাধ্যমে আপডেট রোল-আউট করা যায়।
১. LDTM অ্যানোটেশন চালু করুন
আপডেটের জন্য LDTM চালু করতে DBCluster অ্যানোটেট করুন:
kubectl annotate dbclusters.alloydbomni.dbadmin.goog adbo -n omni-demo dbcluster.dbadmin.goog/enableLDTM=true --overwrite
২. সিপিইউ ও মেমরি রিসোর্স স্কেল করা
cpu: 1, memory: 4Gi থেকে cpu: 2, memory: 8Gi-এ প্রাথমিক রিসোর্স আপডেট করুন:
kubectl patch dbcluster adbo -n omni-demo --type=merge -p '{
"spec": {
"primarySpec": {
"resources": {
"cpu": 2,
"memory": "8Gi"
}
}
}
}'
৩. LDTM স্কেলিংয়ের অগ্রগতি মনিটর করুন
রোলিং আপডেট এবং স্ট্যান্ডবাই-টু-প্রাইমারি সুইচওভারের পরিস্থিতি মনিটর করুন:
kubectl get dbcluster adbo -n omni-demo -o yaml | grep -A 5 -B 2 "LDTMScalingInProgress"
পডগুলি সুন্দরভাবে রোল করছে কিনা তা লক্ষ্য করুন:
kubectl get pods -n omni-demo -w
LDTM প্রথমে আপডেট করা স্ট্যান্ডবাই প্রস্তুত করে, স্ট্রিমিং রেপ্লিকেশন যাচাই করে, দ্রুত সুইচওভার কার্যকর করে এবং পরিষেবাতে কোনও বাধা ছাড়াই বাকি ইনস্ট্যান্স আপডেট করে।
আপডেট করা রিসোর্স অ্যালোকেশন যাচাই করুন:
kubectl get dbcluster adbo -n omni-demo -o jsonpath='{.spec.primarySpec.resources}'
১৩. রিসোর্স ক্লিন-আপ করুন
ক্লাস্টার ক্যাপাসিটি খালি করতে এবং আপনার Google Cloud অ্যাকাউন্টে অপ্রয়োজনীয় চার্জ এড়াতে, এই কোডল্যাবের সময় প্রোভিশন করা রিসোর্সগুলি ক্লিন-আপ করুন।
আপনি যদি নতুন টার্মিনাল সেশনে (পাথ ১) ক্লিন-আপ চালান, তাহলে আগের ধাপের এনভায়রনমেন্ট ভেরিয়েবল আর সেট করা থাকবে না। আগে ব্যবহার করা একই ভ্যালু দিয়ে সেগুলি আবার এক্সপোর্ট করুন:
export PROJECT_ID="<YOUR_PROJECT_ID>"
export REGION="us-central1"
export CLUSTER_NAME="omni-autopilot-cluster"
export BUCKET_NAME="${PROJECT_ID}-omni-backups"
export SA_NAME="omni-backup-sa"
gcloud config set project ${PROJECT_ID}
১. ডেটাবেস ওয়ার্কলোড মুছুন (পাথ ১ এবং পাথ ২)
অ্যাডমিশন ওয়েবহুক চেক পাস করার জন্য দুটি ক্লাস্টারকেই মুছে ফেলা হয়েছে হিসেবে চিহ্নিত করুন, অপারেটর DBCluster রিসোর্স সরিয়ে না দেওয়া পর্যন্ত অপেক্ষা করুন এবং তারপর নেমস্পেস মুছে দিন:
kubectl patch dbcluster adbo -n omni-demo --type=merge -p '{"spec":{"isDeleted":true}}'
kubectl patch dbcluster adbo-cloned -n omni-demo --type=merge -p '{"spec":{"isDeleted":true}}'
kubectl wait --for=delete dbcluster/adbo dbcluster/adbo-cloned -n omni-demo --timeout=300s
kubectl delete namespace omni-demo
আপনি যদি নিজের Kubernetes ক্লাস্টার (পাথ ২) ব্যবহার করে থাকেন এবং AlloyDB Omni অপারেটর ও cert-manager সরাতে চান:
helm uninstall alloydbomni-operator -n alloydb-omni-system
kubectl delete namespace alloydb-omni-system
helm uninstall cert-manager -n cert-manager
kubectl delete namespace cert-manager
২. GCS বাকেট ও IAM পরিষেবা অ্যাকাউন্ট মুছে দিন (শুধু পাথ ১)
আপনি যদি পাথ ১-এ Google Cloud Storage বাকেট ও পরিষেবা অ্যাকাউন্ট তৈরি করে থাকেন:
gcloud storage rm --recursive gs://${BUCKET_NAME}
gcloud projects remove-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/storage.objectAdmin"
gcloud iam service-accounts delete ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com --quiet
৩. GKE ক্লাস্টার মুছুন (শুধু পাথ ১)
আপনি যদি পাথ ১-এ GKE Autopilot ক্লাস্টার প্রোভিশন করে থাকেন:
gcloud container clusters delete ${CLUSTER_NAME} --region=${REGION} --quiet
১৪. অভিনন্দন
অভিনন্দন! আপনি Kubernetes কোডল্যাবে AlloyDB Omni সম্পূর্ণ করেছেন।
আমরা কী কী কভার করেছি
- GKE Autopilot ক্লাস্টার (পাথ ১) প্রোভিশন করা বা আগে থেকে থাকা Kubernetes ক্লাস্টার (পাথ ২) প্রস্তুত করা।
- Helm-এর মাধ্যমে
cert-managerএবং AlloyDB Omni Kubernetes অপারেটর ডিপ্লয় করা হয়েছে। - সিঙ্গেল-ইনস্ট্যান্স AlloyDB Omni
DBClusterডিপ্লয় করা হয়েছে। - সিঙ্ক্রোনাস স্ট্যান্ডবাই সহ ক্লাস্টারকে হাই অ্যাভেলেবিলিটি (HA)-তে আপগ্রেড করা হয়েছে এবং শুধুমাত্র পড়ার জন্য স্ট্যান্ডবাই রাউটিং চালু করা হয়েছে।
- লোকাল পারসিস্টেন্ট স্টোরেজ এবং Google Cloud Storage (GCS) দুটির জন্যই অটোমেটেড
BackupPlanরিসোর্স তৈরি করা হয়েছে। - চাহিদা অনুযায়ী ব্যাক-আপ নেওয়া এবং ডেটাবেস রিস্টোর করার কাজ যাচাই করা।
- নতুন ক্লোন করা ডেটাবেস ক্লাস্টারে পয়েন্ট-ইন-টাইম রিকভারি (PITR) এক্সিকিউট করা হয়েছে।
- স্কেলেবল ক্লায়েন্ট কানেকশনের জন্য
PgBouncerকানেকশন পুলার ডিপ্লয় করা হয়েছে। - ডেটাবেস ম্যানেজমেন্টের জন্য
pgAdmin4ডেপ্লয় ও কানেক্ট করা হয়েছে। - কম্পিউট ও মেমরি রিসোর্স ডায়নামিকভাবে স্কেল করার জন্য লো ডাউনটাইম মেইনটেন্যান্স (LDTM) এক্সিকিউট করা হয়েছে।
পরবর্তী ধাপ
- মাল্টি-ক্লাস্টার এনভায়রনমেন্ট জুড়ে AlloyDB Omni Disaster Recovery (DR) এক্সপ্লোর করুন।
- AlloyDB Omni AI এবং pgvector-এর ক্ষমতা সম্পর্কে আরও জানুন।