সরাসরি পর্বে যান
পর্ব ২৪ · ৮১-এর মধ্যে · মডিউল ৪

Backup আর disaster recovery — RPO, RTO, snapshot আর চারটি কৌশল

Backup and Disaster Recovery — RPO, RTO, Snapshots and the Four DR Strategies

Taught in Bangla, this lesson covers disaster types and matching defences, setting RPO and RTO from business loss, why replication copies mistakes, the 3-2-1 rule with immutable cross-account copies and key protection, crash-consistent and application-consistent snapshots, calculating RPO and RTO by hand, testing restores, comparing backup and restore, pilot light, warm standby and active-active, and running failover, failback and game days, with a simulator and worked examples.

এই পর্বে যা শিখবেন

  • চার ধরনের বিপর্যয় চেনা, আর কোনটির বিরুদ্ধে কোন প্রতিরক্ষা কাজ করে
  • ব্যবসার ক্ষতি থেকে RPO, RTO আর workload-এর স্তর ঠিক করা
  • Backup-এর ব্যবধান থেকে RPO আর ডেটার মাপ ও গতি থেকে RTO হাতে হিসাব করা
  • 3-2-1, immutable কপি, snapshot-এর ধরন, cross-account কপি আর key-এর সুরক্ষা সাজানো
  • চার DR কৌশলের খরচ তুলনা, আর failover, failback ও game day চালানো

১ · বিপর্যয় কী — মানুষের ভুল থেকে account চুরি পর্যন্ত

আপনার বাড়ির জমির দলিলের কথা ভাবুন। আসল দলিল থাকে আলমারিতে। সাবধানী মানুষ একটি ফটোকপি রাখেন ব্যাংকের লকারে, আরেকটি গ্রামের বাড়িতে। আলমারিতে উই ধরলে লকারের কপি বাঁচায়। বাড়িতে আগুন লাগলে গ্রামের কপি। চোর আলমারি আর লকারের চাবি, দুটোই পেয়ে গেলে গ্রামের কপিই শেষ ভরসা। Backup মানে এই ফটোকপি। আর পুরো ব্যবস্থা, মানে বিপদের পর সেবা আর ডেটা গ্রহণযোগ্য সময়ে ফেরানোর পরিকল্পনা, প্রস্তুতি ও চর্চার নাম disaster recovery (DR).

নকশার তত্ত্ব, মানে replication-এর ধরন আর multi-region-এর গঠন, আছে System Design-এর disaster recovery পর্বে। এখানে আমাদের প্রশ্ন operational: backup কীভাবে নেবেন, কোথায় রাখবেন, ফেরাতে কত সময় লাগবে, মাসে কত খরচ হবে, আর রাত তিনটায় কে কী করবেন। পর্ব ২২-এ managed database-এর backup দেখেছেন; এবার পুরো সেবার ছবি।

পর্ব ৫-এ দেখেছেন, multi-AZ নকশা একটি zone হারালে বাঁচায়। কিন্তু সব বিপদ zone-এর মাপে আসে না। চার ধরনের বিপদ আলাদা করে ভাবতে হয়:

বিপদউদাহরণযা বাঁচায়যা বাঁচায় না
মানুষের ভুলভুল DELETE, ভুল environment-এ script, খারাপ migrationPoint-in-time recovery, versioning, delayed replicaReplication, multi-AZ
Region হারানোবড় বিদ্যুৎ, network বা provider-এর নিজের ত্রুটিঅন্য region-এ কপি আর চালানোর প্রস্তুতিএকই region-এ সব কপি
Ransomwareডেটা encrypt করে টাকা দাবিImmutable বা offline কপি, পরিষ্কার পরিবেশে restoreলেখা যায় এমন backup, replica
Account চুরিফাঁস হওয়া key দিয়ে সব মুছে ফেলাঅন্য account-এ কপি, least privilege, MFAএকই account-এর সব কিছু, snapshot-সহ

এই চারটির মধ্যে নাটকীয় হলো region হারানো, কিন্তু সাধারণ অভিজ্ঞতায় সবচেয়ে ঘনঘন আসে মানুষের ভুল আর software-এর bug. কারণটি সহজ: প্রতিদিন শতবার deploy আর migration হয়, region প্রায় পড়েই না। তাই DR পরিকল্পনা শুরু করুন “কেউ ভুল করে ডেটা মুছলে কী হবে” দিয়ে, “পুরো region ডুবে গেলে কী হবে” দিয়ে নয়। এই ক্রমই খরচের দিক থেকেও সস্তা।

কোন কপি কোন বিপদে: প্রতিটি কপিকে একটি প্রশ্ন করুন: যে কারণে আসল ডেটা গেল, সেই একই কারণে কি এই কপিও যাবে? একই কারণে একসাথে যা নষ্ট হতে পারে, তা একটি failure domain. একই account একটি failure domain, একই credential-ও একটি failure domain, যদিও কপি দুটি দুই মহাদেশে।

২ · RPO আর RTO — দুটি সংখ্যা, আর কোন কাজের জন্য কোনটি

DR-এর সব সিদ্ধান্ত দুটি প্রশ্ন থেকে আসে। ব্যাংকে বিদ্যুৎ চলে গেলে আর খাতা পুড়ে গেলে দুটি জিনিস জানতে হয়: শেষ কখনকার হিসাব হাতে আছে, আর কতক্ষণে কাউন্টার আবার খুলবে।

  • RPO (Recovery Point Objective): সর্বোচ্চ কত সময়ের ডেটা হারানো মেনে নেবেন। পেছনের দিকে মাপা হয়।
  • RTO (Recovery Time Objective): বিপর্যয়ের পর সর্বোচ্চ কত সময়ে সেবা ফেরাতে হবে। সামনের দিকে মাপা হয়।

একটি বিপর্যয়ের সময়রেখা

RPO looks back from the failure, RTO looks forward

RPO আর RTO-এর সময়রেখা ডেটা হারায় সেবা বন্ধ RPO ৩৭ মিনিট RTO ৬০ মিনিট 14:00 14:37 15:37 শেষ নিরাপদকপি বিপর্যয় সেবা ফিরল বিপর্যয় থেকে পেছনে: কত ডেটা গেল বিপর্যয় থেকে সামনে: কত সময় গেল
ছবি ২৪.১ — দুটি সংখ্যা মাপা হয় বিপর্যয়ের মুহূর্ত থেকে, উল্টো দুই দিকে।

দুটিই লক্ষ্য। মহড়ায় মাপা আসল মান আলাদা হতে পারে, আর পার্থক্যটিই সবচেয়ে দামি তথ্য। RPO-তে ডেটার মাপ নেই, আছে সময়। “১ TB পর্যন্ত হারানো চলে” এমন কথার মানে নেই। অর্ডারের হিসাবে বলুন: “১৫ মিনিটের অর্ডার হারালে ক্ষতি কত।”

সংখ্যা আসে ব্যবসার ক্ষতি থেকে

প্রতিটি সেবার জন্য জিজ্ঞেস করুন: এক ঘণ্টা বন্ধ থাকলে কত টাকা আর কতটা আস্থা যায়? এক ঘণ্টার ডেটা হারালে সেটি কি আবার বানানো যায়? এই বিশ্লেষণের নাম business impact analysis. এর ফল হলো workload tiering, মানে সেবাগুলোকে স্তরে ভাগ করা। সবকিছুকে সর্বোচ্চ স্তরে রাখলে বিল আকাশে ওঠে; কিছু না ভাগ করলে আসল জরুরি সেবাটি পড়ে থাকে সারির পেছনে।

একটি কাল্পনিক অনলাইন বাজার অ্যাপের উদাহরণ (সংখ্যাগুলো উদাহরণ মাত্র):

স্তরসেবাRPORTOকৌশল
Tier 0অর্ডার আর পেমেন্টের হিসাব১ মিনিটের কম১৫ মিনিটWarm standby
Tier 1পণ্যের তালিকা, লগইন১৫ মিনিট১ ঘণ্টাPilot light
Tier 2Admin panel, report২৪ ঘণ্টা১ দিনBackup and restore
Tier 3পুরোনো log, cacheআবার বানানো যায়কয়েক দিনকপি নয়, পুনর্গঠন

একটি ফাঁদ মনে রাখুন: নির্ভরতা। Tier 0-এর অর্ডার সেবা যদি লগইন ছাড়া চলতে না পারে, তাহলে লগইনও আসলে Tier 0. কাগজের স্তর নয়, নির্ভরতার গ্রাফ দেখে স্তর দিন। DNS, secret store আর certificate-ও এই গ্রাফের অংশ।

৩ · Backup বনাম replication — ভুলও কপি হয়

পর্ব ২২-এ দেখেছেন replica কী। অনেকেই ভাবেন, replica যখন আছে, backup-এর কী দরকার? দুটির কাজ আলাদা। ক্লাসে পাশের বন্ধু আপনার খাতা হুবহু টুকে নিচ্ছে, এটি replication. আপনি ভুল লিখলে সেও ভুল লেখে। পরীক্ষার আগের রাতে খাতার ফটোকপি করে রাখা হলো backup; পরে যত ভুলই লিখুন, ফটোকপি বদলায় না।

Replication প্রশ্ন করে: “এই মুহূর্তের ডেটার আরেকটি কপি কোথায়?”
Backup প্রশ্ন করে: “গতকালের ভালো অবস্থায় ফিরব কীভাবে?”

একটি কাল্পনিক অনলাইন বাজার অ্যাপে বিকেল ১৪:৩৭-এ একজন প্রকৌশলী orders টেবিলে WHERE ছাড়া DELETE চালালেন। মিনিটে ১০টি অর্ডার আসে, আর রাত ০২:০০-তে টেবিলে ছিল ১,০০,০০০ সারি। হাতে আছে চারটি ব্যবস্থা: replica (lag ২ সেকেন্ড), রাতের full backup, ঘণ্টায় একটি snapshot আর point-in-time recovery. “পরে” চেপে দেখুন কে কতটা ফেরাতে পারে।

orders টেবিলের সারি
সময়
Production
Replica
পরীক্ষিত উৎস
ফিরল
হারানো অর্ডার
  1. ১৪:৩৬, সব ঠিক। ০২:০০ থেকে ৭৫৬ মিনিট, প্রতি মিনিটে ১০টি অর্ডার, তাই ১,০৭,৫৬০ সারি। Replica দুই সেকেন্ড পিছিয়ে চলছে।
  2. ১৪:৩৭:০০, ভুল। ১,০৭,৫৭০ সারি মুছে গেল, আর transaction সফলভাবে commit হলো। Database-এর চোখে এটি একটি বৈধ আদেশ। Replica-তে তখনো সব আছে, কিন্তু মাত্র দুই সেকেন্ডের জন্য।
  3. ১৪:৩৭:০২, replica-ও খালি। Replication তার কাজ ঠিকমতোই করল। Failover করলে এখন খালি টেবিলের কাছেই যাবেন। ভুলটি দুই জায়গায় পৌঁছে গেল।
  4. ১৪:৫২, ধরা পড়ল। অ্যাপ চালু ছিল, তাই ১৫ মিনিটে ১৫০টি নতুন অর্ডার এসেছে। এগুলো মূল্যবান। আগে লেখা থামান আর এই ১৫০টি আলাদা করে রাখুন। হুট করে পুরো database-এর ওপর restore করলে এরাই মুছে যাবে।
  5. Nightly backup থেকে। পাশে নতুন database-এ restore করলে ফেরে ১,০০,০০০ সারি। ০২:০০ থেকে ১৪:৩৭, মোট ৭৫৭ মিনিট, তাই ৭,৫৭০টি অর্ডার গেল।
  6. Hourly snapshot থেকে। ১৪:০০-এর কপিতে ১,০৭,২০০ সারি। ৩৭ মিনিটের ৩৭০টি অর্ডার গেল। মনে রাখুন: backup-এর ব্যবধানই ক্ষতির সীমা।
  7. Point-in-time recovery থেকে। ০২:০০-এর base backup-এর ওপর transaction log চালিয়ে ঠিক ১৪:৩৬:৫৯-এ থামা হলো, DELETE-এর এক সেকেন্ড আগে। ফিরল ১,০৭,৫৭০ সারি, ক্ষতি ০।
  8. জোড়া লাগানো। পাশের database থেকে সারিগুলো মূল টেবিলে কপি হলো, আলাদা রাখা ১৫০টি রইল। মোট ১,০৭,৭২০. শিক্ষা: restore করুন পাশে, মূল ডেটার ওপরে নয়।

দুটি বিষয় খেয়াল করুন। এক, এখানে PITR-এর ক্ষতি শূন্য, কারণ primary বেঁচে ছিল, log-ও বেঁচে ছিল। Region হারালে শেষ না-পাঠানো log-টুকু যায়। তাই একই ব্যবস্থার RPO বিপদভেদে আলাদা। দুই, মাঝামাঝি একটি হাতিয়ার আছে: delayed replica, যা ইচ্ছা করে ধরুন এক ঘণ্টা পিছিয়ে চলে (PostgreSQL-এ recovery_min_apply_delay). ভুল ধরা পড়লে replay থামিয়ে সেখান থেকে ডেটা তুলে আনা যায়। এটি backup-এর বিকল্প নয়, দ্রুত উদ্ধারের সংযোজন।

৪ · 3-2-1, immutable কপি আর চাবি — backup বাঁচাবে কে

Backup নিজেও আক্রমণের লক্ষ্য। যে মানুষ বা ভুল আসল ডেটা শেষ করে, সে backup-এও পৌঁছাতে পারে। তাই backup কোথায় আর কার নাগালে আছে, সেটিই আসল নকশা।

মূল ধারণা

3-2-1 নিয়ম: অন্তত ৩টি কপি, ২ ধরনের আলাদা মাধ্যমে, ১টি অন্য জায়গায়। Cloud-এ পড়ুন এভাবে: আসল disk, একই region-এর object storage-এ একটি কপি, আর অন্য region ও অন্য account-এ একটি কপি। অনেকে যোগ করেন আরও একটি শর্ত: অন্তত একটি কপি immutable বা air-gapped, মানে বদলানো বা অনলাইনে পৌঁছানো যায় না।

  • Immutable কপি: নির্দিষ্ট মেয়াদের আগে কেউ মুছতে বা বদলাতে পারে না। একে অনেক provider-এ object lock বা vault lock বলে। কড়া mode-এ এটি অনুমতির ওপর নির্ভর নয়, storage-এর নিজের নিয়ম; নরম mode-এ বিশেষ অনুমতি থাকলে সরানো যায়। মেয়াদ বুঝে দিন: কড়া mode-এ ভুল করে ১০ বছর লিখলে ১০ বছরের বিলও আটকে থাকে।
  • Air-gap: ইংরেজি শব্দটির অর্থ মাঝখানে ফাঁকা হাওয়া। পুরোনো দিনে tape খুলে আলমারিতে রাখা। Cloud-এ এটি সাধারণত যৌক্তিক দেওয়াল: আলাদা account, আলাদা পরিচয়, কড়া নিয়ন্ত্রণ।
  • Cross-region কপি: Region হারানোর বিরুদ্ধে। সাবধান: ডেটা অন্য দেশে গেলে data localisation-এর নিয়ম প্রযোজ্য হতে পারে। বাংলাদেশে আপনার ডেটার ক্ষেত্রে কী প্রযোজ্য, আইনি পরামর্শ নিয়ে জেনে নিন।
  • Cross-account কপি: Account চুরি আর ভেতরের ভুলের বিরুদ্ধে। Production-এর পরিচয় backup account-এ শুধু নতুন কপি লিখতে পারবে, মুছতে নয়। Backup account-এর root আলাদা মানুষের হাতে, আলাদা MFA-সহ। Account ভাগের নকশা আসবে পর্ব ৩৫-এ।
  • Retention: কত দিনের কপি রাখবেন। এটি হতে হবে ভুল ধরা পড়তে যত সময় লাগে, তার চেয়ে বেশি। পুরোনো কপি মোছার নিয়মের জন্য পর্ব ১০-এর backup rotation দেখুন।

Encryption key-ও বাঁচতে হবে। Backup encrypt করা ভালো। কিন্তু key যদি production account-এই থাকে আর সেটি মুছে যায়, তাহলে পুরো backup অর্থহীন শব্দের স্তূপ। অন্য region-এ কপি করলেও ওই region-এ key পৌঁছায় কি না দেখুন। তাই backup account-এ আলাদা key রাখুন, key মোছার অপেক্ষার মেয়াদ চালু রাখুন, আর restore মহড়ায় key-সহ পরীক্ষা করুন। KMS-এর বিস্তারিত পর্ব ৩৩-এ।

তিন provider-এ একই ধারণার নাম (লেখার সময়ের নাম, service-এর সুবিধা অঞ্চল আর সময়ভেদে বদলাতে পারে):

ধারণাAWSAzureGoogle Cloud
কেন্দ্রীয় backupAWS BackupAzure BackupBackup and DR Service
Disk snapshotEBS snapshotManaged disk snapshotPersistent Disk snapshot
Immutable storageS3 Object LockImmutable Blob StorageBucket Lock
Region-পার DRElastic Disaster RecoveryAzure Site RecoveryBackup and DR Service
DNS failoverRoute 53 failover routingTraffic ManagerCloud DNS routing policy
# উদাহরণ: অন্য region-এ snapshot কপি। সব ID নমুনা, খরচ হতে পারে।
aws ec2 copy-snapshot \
  --region ap-southeast-1 \
  --source-region ap-south-1 \
  --source-snapshot-id snap-0example1234567890 \
  --encrypted --kms-key-id alias/dr-backup \
  --description "orders nightly, DR copy"

এবার সবচেয়ে কঠিন দৃশ্যটি। একটি কাল্পনিক অ্যাপে চুরি যাওয়া একটি admin credential দিয়ে ransomware চলল। Backup-এর নকশা কীভাবে পরিণতি বদলায়, ধাপে ধাপে দেখুন। এখানে শুধু প্রতিরক্ষা আর উদ্ধার দেখানো হয়েছে।

কপিগুলোর অবস্থা
সময়
Production
একই account-এর backup
Immutable কপি
পুরোনো credential
Backup account
  1. প্রস্তুতি। প্রতিদিন ০২:০০-তে কপি, ৩০ দিনের lock, আলাদা account আর আলাদা key. এই কাজটি ঘটনার অনেক আগে করা হয়েছিল। বিপদের দিনে এটি আর বানানো যায় না।
  2. T−৯ দিন, নীরব অনুপ্রবেশ। একটি credential চুরি হলো, কেউ টের পেল না। অনুপ্রবেশ থেকে ধরা পড়া পর্যন্ত এই সময়কে বলে dwell time. এই ৯ দিনের server image আর বিশ্বাসযোগ্য নয়।
  3. T, রাত ২২:০০। ডেটা encrypt হতে শুরু করল, আর একই account-এর backup মুছে গেল, কারণ চুরি যাওয়া পরিচয়ের সেই অধিকার ছিল। Backup account-এর কপি মোছার অনুরোধ storage নিজেই ফিরিয়ে দিল, আর সেই চেষ্টা audit log-এ রইল।
  4. T ২২:৩০, থামানো। Storage-এ অস্বাভাবিক বদলের alert পেয়ে দল network বিচ্ছিন্ন করল, credential বাতিল করল, log আর প্রমাণ সংরক্ষণ করল। এখনই restore নয়, ঘর পরিষ্কার না করে মাল তুললে আবার নষ্ট হবে।
  5. T+১ দিন, পরিষ্কার ঘর। নতুন account আর নতুন credential দিয়ে একটি clean room তৈরি হলো। পুরোনো পরিবেশের সাথে কোনো সংযোগ নেই। সব কপি আগে এখানে এনে পরীক্ষা করা হয়।
  6. T+২ দিন, ভালো কপি বাছাই। শুধু ডেটা ফেরানো হলো T ০২:০০-এর কপি থেকে, encryption শুরুর ২০ ঘণ্টা আগের। Server ফেরানো হলো না, ওগুলো নতুন করে বানানো হলো IaC আর golden image থেকে। পুরোনো পুরো-VM কপি ফেরালে অনুপ্রবেশের পথটিও ফিরে আসতে পারত।
  7. T+৩ দিন, সেবা ফিরল। সব secret আর key বদলে, পরীক্ষা শেষে traffic এলো। ক্ষতি: ২০ ঘণ্টার ডেটা, প্রায় তিন দিন সময়। Retention ৩০ দিন আর dwell time ৯ দিন, তাই ভালো কপি মিলেছে। Retention ৭ দিন হলে পরিষ্কার server কপি মিলত না।

একটি সীমা মনে রাখুন: backup ফেরায় প্রাপ্যতা, গোপনীয়তা নয়। ডেটা চুরি হয়ে থাকলে backup সেই ক্ষতি ঠিক করে না। সে জন্য লাগে encryption, least privilege আর নজরদারি। আর আইনি জানানো, মুক্তিপণ ইত্যাদি প্রশ্ন আগে থেকেই ব্যবস্থাপনা আর আইনজীবীর সাথে ঠিক করে রাখুন।

৫ · Snapshot — crash-consistent, application-consistent আর incremental চেইন

Snapshot হলো একটি disk-এর নির্দিষ্ট মুহূর্তের ছবি। পর্ব ১৫-এ VM-এর disk-এর সাথে নামটি দেখেছেন। কিন্তু ছবিটি ঠিক কী ধরল, সেই প্রশ্নটিই এখানে গুরুত্বপূর্ণ। রান্না চলাকালে হঠাৎ ছবি তুললে দেখা যাবে চুলায় আধসেদ্ধ ভাত; সব থামিয়ে ছবি তুললে দেখা যাবে গোছানো রান্নাঘর।

Crash-consistent

Crash-consistent snapshot হলো হঠাৎ বিদ্যুৎ গেলে disk যেমন থাকত, ঠিক তেমন। Memory-তে থাকা লেখা নেই। Database আবার চালু হলে log দেখে নিজেকে সারিয়ে নেয়, তবে সারাতে সময় লাগে, আর সব app এতটা সহনশীল নয়।

সহজ, কোনো থামা নেই

Application-consistent

Application-consistent snapshot নেওয়ার আগে app-কে বলা হয়: লেখা থামান, memory-র সব disk-এ নামান। Windows-এ VSS, Linux-এ fsfreeze আর database-এর নিজস্ব backup হুক এই কাজ করে।

পরিষ্কার, ক্ষণিক থামা
# উদাহরণ: filesystem থামিয়ে snapshot. নমুনা ID, বাস্তবে trap-সহ লিখুন।
sudo fsfreeze --freeze /data
aws ec2 create-snapshot \
  --volume-id vol-0example1234567890 \
  --description "orders app-consistent"
sudo fsfreeze --unfreeze /data

এখানে ফাঁদ আছে: script ভেঙে গেলে /data জমে থাকে, আর app আটকে যায়। তাই trap দিয়ে unfreeze নিশ্চিত করুন (পর্ব ১০). আর database-এর ক্ষেত্রে শুধু filesystem থামানো যথেষ্ট না-ও হতে পারে; সবচেয়ে ভরসার পথ database-এর নিজের backup পদ্ধতি বা managed service-এর backup. একাধিক disk একসাথে নিতে হলে provider-এর multi-volume snapshot সুবিধা দেখুন, নইলে দুই disk-এর ছবি দুই মুহূর্তের হবে।

Incremental চেইন

Full backup পুরো ডেটা কপি করে। Incremental শুধু আগের কপির পরে বদলানো অংশ রাখে। সোমবার full ১০০ GB, বাকি ছয় দিন ৫ GB করে বদল হলে সপ্তাহে জমে ১৩০ GB, সাতটি full-এ লাগত ৭০০ GB. কিন্তু শনিবারের অবস্থা ফেরাতে নিজে বানানো চেইনে সোমবারের full-এর ওপর পাঁচটি incremental পরপর বসাতে হয়, আর মাঝের একটি নষ্ট হলে তার পরের সব অকেজো।

Cloud-এর block snapshot সাধারণত ভিন্নভাবে চলে। প্রথমটি সব ব্যবহৃত block রাখে, পরেরগুলো শুধু বদলানো block, তবু প্রতিটি snapshot থেকে সরাসরি পুরো disk ফেরানো যায়। যেমন AWS-এর documentation অনুযায়ী, EBS-এর মাঝের snapshot মুছলে পরেরগুলো ফেরাতে দরকারি block রেখে দেওয়া হয়। তবে এই আচরণ সব ব্যবস্থায় এক নয়, নিজের tool-এর documentation মিলিয়ে নিন।

“সঙ্গে সঙ্গে restore” মানে সঙ্গে সঙ্গে দ্রুত নয়। অনেক provider-এ snapshot থেকে বানানো disk তৎক্ষণাৎ দেখা যায়, কিন্তু block আসে প্রথম পড়ার সময়, object storage থেকে। তাই বড় database-এর প্রথম ঘণ্টাগুলো ধীর হতে পারে। RTO মাপার সময় “disk তৈরি” নয়, “চাপ নিতে প্রস্তুত” ধরুন।

৬ · হিসাব — backup-এর ব্যবধান থেকে RPO, গতি থেকে RTO

RPO-এর সূত্র

ধরুন backup নেওয়া হয় I ব্যবধানে, আর কপিটি নিরাপদ জায়গায় পৌঁছাতে সময় লাগে S. Backup শুরু হওয়ার মুহূর্তের ডেটাই তাতে থাকে, কিন্তু কপি নিরাপদ না হওয়া পর্যন্ত ভরসা নেই। সবচেয়ে খারাপ সময় হলো পরের কপি নিরাপদ হওয়ার ঠিক আগে:

সবচেয়ে খারাপ RPO ≈ I + S
গড় ক্ষতি ≈ I ÷ 2 + S

উদাহরণ: দিনে একবার ০২:০০-তে backup, পৌঁছাতে ২ ঘণ্টা। সবচেয়ে খারাপ ক্ষতি ২৪ + ২ = ২৬ ঘণ্টা, গড় ১২ + ২ = ১৪ ঘণ্টা। নিচের simulator পুরো দিনের প্রতিটি মিনিটে বিপর্যয় ঘটিয়ে এই সংখ্যা মেলায়। plans-এ নিজের সময়সূচি বসিয়ে দেখুন।

// Data loss across one day for a backup schedule. Clock is in minutes (0..1439).
// A backup taken at b is only safe at b + ship (copied to the other place).
const every = (step, from = 0) => { const a = []; for (let m = from; m < 1440; m += step) a.push(m); return a; };
const plans = [
  { name: "daily 02:00",  times: [120],      ship: 120 },
  { name: "every 6 h",    times: every(360), ship: 30 },
  { name: "hourly",       times: every(60),  ship: 10 },
  { name: "log, 5 min",   times: every(5),   ship: 1 },
];
const hm = m => `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, "0")}m`;

function lossAt(p, t) {                 // t = failure minute today
  let best = -Infinity;
  for (const b of p.times) for (const day of [0, -1440]) {
    const taken = b + day;
    if (taken + p.ship <= t && taken > best) best = taken;
  }
  return t - best;
}
const FAIL = 14 * 60 + 37;              // the failure in the story: 14:37
const hours = [0, 3, 6, 9, 12, 15, 18, 21];
console.log("plan         worst    average  at 14:37");
for (const p of plans) {
  let worst = 0, sum = 0;
  for (let t = 0; t < 1440; t++) { const l = lossAt(p, t); sum += l; if (l > worst) worst = l; }
  console.log(p.name.padEnd(12), hm(worst).padStart(7), hm(Math.round(sum / 1440)).padStart(8), hm(lossAt(p, FAIL)).padStart(8));
}
console.log("\nloss in hours if the failure hits at (daily plan):");
const d = plans[0];
for (const h of hours) {
  const l = lossAt(d, h * 60) / 60;
  console.log(`${String(h).padStart(2, "0")}:00 ${String(l.toFixed(1)).padStart(5)} ${"#".repeat(Math.round(l))}`);
}

আউটপুট:

plan         worst    average  at 14:37
daily 02:00  25h 59m  14h 00m  12h 37m
every 6 h     6h 29m   3h 30m   2h 37m
hourly        1h 09m   0h 40m   0h 37m
log, 5 min    0h 05m   0h 03m   0h 02m

loss in hours if the failure hits at (daily plan):
00:00  22.0 ######################
03:00  25.0 #########################
06:00   4.0 ####
09:00   7.0 #######
12:00  10.0 ##########
15:00  13.0 #############
18:00  16.0 ################
21:00  19.0 ###################

প্রথম সারিতে 25h 59m এসেছে, কারণ হিসাব মিনিট ধরে; সূত্রের ২৬ ঘণ্টার এক মিনিট আগের মুহূর্ত। গড় 14h 00m, সূত্রের সাথে মেলে। at 14:37 কলামে nightly-র 12h 37m আর hourly-র 0h 37m ধাপে ধাপে দেখা ৭৫৭ আর ৩৭ মিনিট।

নিচের ছবিটি ক্ষতির করাতের দাঁত। ০৩:০০-তে ক্ষতি 25.0 ঘণ্টা, কারণ রাতের কপি তখনো পথে। ০৬:০০-তে নেমে আসে 4.0-এ। Backup শেষ হওয়া নয়, নিরাপদ জায়গায় পৌঁছানোই আসল মুহূর্ত।

RTO-এর সূত্র

RTO একটি সংখ্যা নয়, কয়েকটি ধাপের যোগফল:

RTO ≈ টের পাওয়া + সিদ্ধান্ত + পরিবেশ তৈরি + ডেটার মাপ ÷ গতি + যাচাই + traffic সরানো

গতি হলো পথের সবচেয়ে সরু অংশ: network, disk-এর লেখা আর সমান্তরাল download, এই তিনের সর্বনিম্ন। একটি বড় ফাঁদ বিট আর বাইট। Network মাপা হয় bit-এ, ডেটা byte-এ। ১ Gbps = ১,০০০ Mbit/s ÷ ৮ = ১২৫ MB/s.

কষে দেখা: ২ TB ডেটা, ১ Gbps পথ। গতি ১২৫ MB/s, তাই ২ × ১০১২ ÷ (১২৫ × ১০৬) = ১৬,০০০ সেকেন্ড, মানে প্রায় ২৬৭ মিনিট। বাকি ধাপ ৮০ মিনিট। মোট প্রায় ৩৪৭ মিনিট, মানে ৫ ঘণ্টা ৪৭ মিনিট। ডেটা কত বড়, সেই একটি সংখ্যাই RTO-এর বেশিরভাগ ঠিক করে দিল।

// Restore time: RTO = fixed steps + data / bottleneck speed.
// ASSUMED numbers for a 2 TB database. Change them and press Run.
const GB = 1e9, TB = 1e12;
const DATA = 2 * TB;
const disk = 300;                     // restore target disk write, MB/s
const streams = 8, perStream = 40;    // parallel downloads, MB/s each
const steps = { detect: 15, decide: 15, build: 20, verify: 20, traffic: 10 }; // min
const fixed = Object.values(steps).reduce((a, b) => a + b, 0);

const speed = gbps => Math.min(gbps * 125, disk, streams * perStream); // 1 Gbit/s = 125 MB/s
const copyMin = (bytes, mbps) => bytes / (mbps * 1e6) / 60;
const hm = m => `${Math.floor(m / 60)}h ${String(Math.round(m % 60)).padStart(2, "0")}m`;

console.log(`fixed steps = ${fixed} min`);
console.log("link     bottleneck   copy     total RTO");
for (const g of [1, 2.5, 10]) {
  const s = speed(g), c = copyMin(DATA, s);
  console.log(`${String(g).padEnd(4)}Gbps ${String(s).padStart(5)} MB/s ${hm(c).padStart(8)} ${hm(fixed + c).padStart(9)}`);
}
// an incremental chain: every piece is applied in order, each with its own overhead
const s = speed(1), parts = 23, partGB = 5, overheadMin = 2;
const chain = parts * (copyMin(partGB * GB, s) + overheadMin);
console.log(`\n1 full + ${parts} incrementals adds ${chain.toFixed(1)} min`);
console.log(`total with chain: ${hm(fixed + copyMin(DATA, s) + chain)}`);
// reverse question: how big can the data be for a 4 h RTO?
for (const g of [1, 10]) {
  const left = 240 - fixed;
  console.log(`RTO 4h on ${g} Gbps: at most ${(left * 60 * speed(g) * 1e6 / TB).toFixed(2)} TB`);
}

আউটপুট:

fixed steps = 80 min
link     bottleneck   copy     total RTO
1   Gbps   125 MB/s   4h 27m    5h 47m
2.5 Gbps   300 MB/s   1h 51m    3h 11m
10  Gbps   300 MB/s   1h 51m    3h 11m

1 full + 23 incrementals adds 61.3 min
total with chain: 6h 48m
RTO 4h on 1 Gbps: at most 1.20 TB
RTO 4h on 10 Gbps: at most 2.88 TB

২.৫ Gbps আর ১০ Gbps-এ ফল একই 3h 11m. Network বাড়ানোর পর সরু অংশ হলো disk-এর ৩০০ MB/s, আর ১০ Gbps-এর টাকা জলে গেল। বদলানোর আগে bottleneck খুঁজুন।

Incremental চেইন যোগ করলে আরও 61.3 মিনিট, প্রতি টুকরোর ৪০ সেকেন্ড কপি আর ২ মিনিট বাড়তি কাজ মিলে। ফলে RPO ভালো করতে গিয়ে RTO দাঁড়াল 6h 48m. শেষ দুই সারি উল্টো প্রশ্ন: ৪ ঘণ্টার RTO রাখতে ১ Gbps-এ ডেটা 1.20 TB-এর বেশি হতে পারবে না। ডেটা বাড়ে, RTO নিঃশব্দে পেরিয়ে যায়।

৭ · Restore পরীক্ষা — যাচাই না করা backup, backup নয়

পরীক্ষার হলে গিয়ে কলম খুলে দেখলেন কালি শুকিয়ে গেছে। কলম ব্যাগে ছিল, কিন্তু কাজের ছিল না। Backup-এরও তাই। Backup job-এর “success” মানে শুধু job শেষ হয়েছে। কপিটি পড়া যায়, পুরো, আর তা দিয়ে app চলে, এই কথা কেবল restore test প্রমাণ করে।

২০১৭ সালের ৩১ জানুয়ারি GitLab.com-এ একটি পরিচিত ঘটনা ঘটে, যার বিস্তারিত postmortem প্রতিষ্ঠানটি নিজেই প্রকাশ করেছিল। Replication-এর সমস্যা সারানোর সময় একজন প্রকৌশলী ভুল server-এ, মানে primary-তে, ডেটা ফোল্ডার মোছার কমান্ড চালান, আর প্রায় ৩০০ GB ডেটা মুছে যায়। প্রকাশিত বিবরণ অনুযায়ী এরপর দেখা যায়, কাগজে থাকা কয়েকটি backup পদ্ধতি নীরবে কাজ করছিল না, আর ব্যর্থতার সতর্কবার্তাও পৌঁছায়নি। শেষে staging-এর জন্য নেওয়া প্রায় ৬ ঘণ্টা আগের একটি কপি থেকে ডেটা ফেরে, আর ওই সময়ের database-এর তথ্য হারায়; git repository-গুলো নিরাপদ ছিল। প্রতিষ্ঠানটির খোলাখুলি লেখা এই বিশ্লেষণ postmortem সংস্কৃতিরও একটি উদাহরণ।

যাচাইয়ের চারটি ধাপ আছে, প্রতিটি আগেরটির চেয়ে শক্ত প্রমাণ:

  1. আছে: কপি জায়গামতো আছে, মাপ স্বাভাবিক। শূন্য বা হঠাৎ ছোট ফাইলে alert.
  2. অক্ষত: Checksum মিলছে, পথে একটি byte-ও বদলায়নি।
  3. ফেরানো যায়: আলাদা পরিবেশে restore হয়, key-সহ, আর সময় মাপা হয়।
  4. কাজ করে: App চলে, সারির সংখ্যা মেলে, নমুনা অর্ডার খোলে।

দ্বিতীয় ধাপটি নিচের block-এ চালিয়ে দেখুন। সব কিছু একটি temporary directory-তে হয়, আর শেষে মুছে যায়। sha256sum প্রতিটি ফাইলের একটি ছাপ বানায়। একটি অক্ষর বদলালেও ছাপ সম্পূর্ণ বদলে যায়।

#!/usr/bin/env bash
# Verify backup copies with checksums, inside a temporary directory.
set -euo pipefail
work=$(mktemp -d); trap 'rm -rf "$work"' EXIT; cd "$work"
mkdir src offsite

printf 'id,amount\n1,450\n2,1200\n3,875\n' > orders-mon.csv
printf 'id,amount\n4,300\n5,450\n'         > orders-tue.csv
: > orders-wed.csv                  # the export job failed: empty file
mv orders-*.csv src/

( cd src && sha256sum orders-*.csv > ../MANIFEST )
cut -c1-12,65- MANIFEST             # first 12 hex digits are enough to read
cp src/orders-*.csv offsite/

# One byte changes in the offsite copy. Same size, no error from cp.
sed -i 's/,450/,950/' offsite/orders-tue.csv

check() { ( cd offsite && sha256sum -c --quiet ../MANIFEST 2>&1 ); }
echo "--- check 1"
if check; then echo "all copies match"; else echo "BAD COPY, do not trust offsite"; fi

cp src/orders-tue.csv offsite/      # repair from the other copy
echo "--- check 2 after repair"
if check; then echo "all copies match"; fi

# A checksum proves "same as the source", not "the source was good".
echo "--- restore test: count rows"
for f in offsite/orders-*.csv; do
  rows=$(awk 'NR > 1' "$f" | wc -l)
  [ "$rows" -gt 0 ] && s=ok || s="EMPTY, backup job failed"
  echo "$(basename "$f"): $rows rows, $s"
done

আউটপুট:

81abb2ac62df  orders-mon.csv
b53a3b222e3a  orders-tue.csv
e3b0c44298fc  orders-wed.csv
--- check 1
orders-tue.csv: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
BAD COPY, do not trust offsite
--- check 2 after repair
all copies match
--- restore test: count rows
orders-mon.csv: 3 rows, ok
orders-tue.csv: 2 rows, ok
orders-wed.csv: 0 rows, EMPTY, backup job failed

sed একটি মাত্র অঙ্ক বদলেছে (450 থেকে 950), ফাইলের মাপ একই, cp-ও কোনো error দেয়নি। তবু check 1-এ FAILED. দ্বিতীয় কপি থেকে সারানোর পর সব মিলল। একটি কপি নষ্ট হলে আরেকটি থাকতে হয়, 3-2-1-এর কারণ এটাই।

শেষ অংশটি আসল শিক্ষা। orders-wed.csv-এর checksum মিলেছে, কারণ উৎসেও ফাইলটি খালি ছিল। তালিকায় তার ছাপ e3b0c44298fc, যা SHA-256-এ খালি ইনপুটের পরিচিত ছাপ। Checksum বলে “কপি উৎসের সমান”, “উৎস ভালো ছিল” বলে না। সেটি ধরল সারি গোনা, মানে restore test.

এই পরীক্ষা হাতে করবেন না, স্বয়ংক্রিয় করুন। প্রতি রাতে একটি job সর্বশেষ কপি ছোট আলাদা পরিবেশে restore করবে, সারি গুনবে, সময় লিখবে, পরিবেশ মুছবে, আর ব্যর্থ হলে alert দেবে। এই job নিজে না চললেও alert আসা চাই; পর্ব ১০-এর dead man's switch এই কাজের জন্যই। এতে যে সময়টি মাপা হলো, সেটিই আপনার সত্যিকার RTO-এর ভিত্তি।

৮ · চারটি DR কৌশল — খরচ আর RTO-এর সিঁড়ি

পুরো region হারালে কী হবে, তার চারটি পরিচিত উত্তর আছে। AWS তার disaster recovery whitepaper-এ এগুলোর নাম দিয়েছে backup and restore, pilot light, warm standby আর multi-site active/active. অন্য provider-রা ধারণাটি একই রাখে, নাম কিছুটা বদলায়। বিয়েবাড়ির উদাহরণে এগুলো সহজে মনে থাকে:

বিয়েবাড়িতে বিদ্যুৎ গেলে কী করবেন? Backup and restore: গুদামে জেনারেটরের পার্টস আছে, ডেকে এনে জোড়া লাগাতে হবে। Pilot light: গ্যাসের চুলায় ছোট্ট পাইলট শিখা জ্বলছে, নব ঘোরালেই পুরো আগুন, তবে ডেকচি বসাতে সময় লাগে। Warm standby: ছোট জেনারেটর চালু, কয়েকটি বাতি জ্বলছে, বড়টি চালালেই সব চলবে। Active-active: দুই লাইনেই একসাথে বিদ্যুৎ, একটি গেলেও অতিথিরা টের পান না, কিন্তু দুই লাইনেরই বিল দেন।

কৌশলদ্বিতীয় region-এ যা চালুসাধারণ RTOসাধারণ RPOখরচ
Backup and restoreশুধু কপি। বিপদে সব বানাতে হয়কয়েক ঘণ্টা থেকে দিনশেষ backup পর্যন্তসবচেয়ে কম
Pilot lightছোট database replica, app বন্ধকয়েক দশ মিনিটreplica-র lagকম
Warm standbyছোট আকারে পুরো সেবা চালুকয়েক মিনিটreplica-র lagমাঝারি
Multi-site active-activeপুরো সেবা, আসল traffic-সহপ্রায় শূন্য থেকে মিনিটপ্রায় শূন্য, ডেটার নকশাভেদেসবচেয়ে বেশি

এই সময়গুলো মোটা দিকনির্দেশ, আপনার ডেটার মাপ আর মহড়াই আসল সংখ্যা বলবে। প্রথম তিনটি মূলত active-passive. একটি সতর্কতা: সিঁড়ির ওপরে উঠলে region হারানোর ঝুঁকি কমে, কিন্তু ভুল DELETE আর ransomware-এর ঝুঁকি একটুও কমে না। সবচেয়ে দামি active-active-এও backup লাগে।

চারটি কৌশল: খরচ বনাম RTO

Four strategies on a cost and RTO axis, not to scale

চারটি DR কৌশলের খরচ আর RTO RTO (ওপরে মানে দীর্ঘ) মাসিক খরচ বাড়ে Backup and restore৮ ঘণ্টা · $৪৬ Pilot light১ ঘণ্টা · $২৩৬ Warm standby১৫ মিনিট · $৭২২ Active-active৩ মিনিট · $১,২৪৬
ছবি ২৪.২ — সংখ্যাগুলো নিচের হিসাবের ধরে নেওয়া মান; RTO-এর পরের অংশ দামি হলেও কমে সামান্যই।

পথটি কেমন, দেখা যাক। কাল্পনিক অনলাইন বাজার অ্যাপের মূল region রাত ০৩:১০-এ বন্ধ হয়ে গেল। অন্য region-এ আছে ছোট একটি database replica, lag ৮ সেকেন্ড। App server শূন্য, তবে image আর IaC তৈরি। দরকার ১২টি VM আর TTL ৬০ সেকেন্ড।

  1. টের পাওয়াalert, সিদ্ধান্ত
  2. ডেটাfencing, promote
  3. ক্ষমতাDB বড়, VM চালু
  4. Trafficযাচাই, DNS
DR region-এর অবস্থা
ঘড়ি
মোট মিনিট
Database
App VM ready
Traffic
  1. ০৩:১৫, ৫ মিনিট। বাইরে থেকে চালানো health check ব্যর্থ, on-call-এর ফোন বাজল। Alert ব্যবস্থাটি নষ্ট region-এর বাইরে আছে, নইলে এই ধাপই আসত না।
  2. ০৩:২৫, ১৫ মিনিট। সিদ্ধান্ত: disaster ঘোষণা। সবচেয়ে কঠিন ধাপ, কারণ region হয়তো দুই মিনিটেই ফিরবে, আর failover নিজেই ঝুঁকি। Runbook-এ লেখা নিয়ম আর নির্দিষ্ট দায়িত্বপ্রাপ্ত মানুষ এই দশ মিনিটকে ছোট করে।
  3. ০৩:২৭, ১৭ মিনিট। Fencing: পুরোনো primary যাতে ফিরে এসে লেখা না নেয়, তা নিশ্চিত করা। নইলে দুই writer, মানে split-brain. মূল region-এ পৌঁছানো না গেলে DNS আর পরিচয় স্তর থেকে পথ বন্ধ করা হয়।
  4. ০৩:৩০, ২০ মিনিট। Replica-কে promote করা হলো। Lag ৮ সেকেন্ড ছিল, তাই এই বিপর্যয়ের আসল RPO ৮ সেকেন্ড. ওই লেখাগুলো গেল।
  5. ০৩:৪০, ৩০ মিনিট। ছোট database চাপ নিতে পারবে না, তাই বড় instance-এ বদলানো হলো। Pilot light-এর দামি অংশ এখানেই বেঁচেছিল, আর দামও দিতে হচ্ছে এখানেই: ১০ মিনিট।
  6. ০৩:৪৬, ৩৬ মিনিট। IaC দিয়ে ১২টি VM চালু, boot ৬ মিনিট। Quota আগেই বাড়ানো ছিল। একই সময়ে region-এর অন্য গ্রাহকেরাও ছুটে এলে ক্ষমতা না-ও মিলতে পারে; এই ঝুঁকিই warm standby-র পক্ষে যুক্তি।
  7. ০৩:৫০, ৪০ মিনিট। ধোঁয়া পরীক্ষা (smoke test), মানে মূল পথগুলোর দ্রুত যাচাই: লগইন, পণ্য দেখা, একটি পরীক্ষামূলক অর্ডার। পরিষ্কার হওয়ার আগে traffic আনলে ক্রেতারা ভাঙা অ্যাপ দেখবেন।
  8. ০৩:৫৪, ৪৪ মিনিট। DNS বদল, TTL ৬০ সেকেন্ড, চার মিনিটে প্রায় সব traffic এলো। মাপা RTO ৪৪ মিনিট: ৫ + ১০ + ২ + ৩ + ১০ + ৬ + ৪ + ৪. লক্ষ্য ১ ঘণ্টা হলে পাশ, তবে হাতে ১৬ মিনিটই বাকি।

এবার খরচের হিসাব। নিচের সব দাম ধরে নেওয়া গোল সংখ্যা; আসল দাম provider-এর pricing page-এ দেখুন। Production-এ ১০টি VM (ঘণ্টায় $০.১০), একটি database (ঘণ্টায় $০.৫০) আর ১,০০০ GB disk. মাস ধরা ৭২০ ঘণ্টা।

কষে দেখা, pilot light: Backup: ২,০০০ GB × $০.০২ + ৩০০ GB transfer × $০.০২ = $৪৬. ছোট database: $০.১২৫ × ৭২০ = $৯০. DB disk: ১,০০০ × $০.১০ = $১০০. মোট $২৩৬ মাসে। লক্ষ্য করুন, এই খরচ production-এর ওপরে অতিরিক্ত। প্রত্যাশিত ক্ষতি = বছরে বিপর্যয়ের সম্ভাবনা × (RTO × ঘণ্টার ক্ষতি + RPO × ঘণ্টাপ্রতি ডেটার ক্ষতি)। সবচেয়ে সস্তা কৌশলটি হলো চালানোর খরচ আর প্রত্যাশিত ক্ষতির যোগফল যেখানে কম।

// Four DR strategies: yearly cost vs expected yearly disaster loss.
// All prices are ASSUMED round numbers. Check your provider's pricing page.
const H = 720;                         // hours in a 30-day month
const vm = 0.10, db = 0.50, smallDb = 0.125;   // $ per hour
const diskGB = 0.10, backupGB = 0.02, xferGB = 0.02;  // $ per GB (month or transfer)
const backup = 2000 * backupGB + 300 * xferGB;  // 2 TB kept, 300 GB moved
const dbDisk = 1000 * diskGB;
const S = [
  { n: "backup-restore", m: backup,                                  rto: 8,    rpo: 1 },
  { n: "pilot light",    m: backup + smallDb * H + dbDisk,           rto: 1,    rpo: 0.02 },
  { n: "warm standby",   m: backup + db * H + dbDisk + 3 * vm * H,   rto: 0.25, rpo: 0.01 },
  { n: "active-active",  m: backup + db * H + dbDisk + 10 * vm * H + 1000 * xferGB, rto: 0.05, rpo: 0.005 },
];
function yearly(s, perYear, downPerH, dataPerH) {
  const run = s.m * 12;
  const risk = perYear * (s.rto * downPerH + s.rpo * dataPerH);
  return { run, risk, total: run + risk };
}
const usd = x => "$" + Math.round(x).toLocaleString("en-US");
const P = 0.2, D = 2000, L = 3000;     // once in 5 years; $/h down; $/h of data lost
console.log(`assumed: ${P} disasters/year, ${usd(D)}/h down, ${usd(L)}/h of lost data`);
console.log("strategy        $/month     run/yr    risk/yr   total/yr");
for (const s of S) {
  const y = yearly(s, P, D, L);
  console.log(s.n.padEnd(15), usd(s.m).padStart(7), usd(y.run).padStart(10), usd(y.risk).padStart(10), usd(y.total).padStart(10));
}
console.log("\ncheapest total as the cost of downtime grows:");
for (const d of [200, 2000, 10000, 50000, 200000]) {
  const best = S.map(s => [s.n, yearly(s, P, d, L).total]).sort((a, b) => a[1] - b[1])[0];
  console.log(`${usd(d).padStart(9)}/h -> ${best[0].padEnd(15)} ${usd(best[1])}`);
}

আউটপুট:

assumed: 0.2 disasters/year, $2,000/h down, $3,000/h of lost data
strategy        $/month     run/yr    risk/yr   total/yr
backup-restore      $46       $552     $3,800     $4,352
pilot light        $236     $2,832       $412     $3,244
warm standby       $722     $8,664       $106     $8,770
active-active    $1,246    $14,952        $23    $14,975

cheapest total as the cost of downtime grows:
     $200/h -> backup-restore  $1,472
   $2,000/h -> pilot light     $3,244
  $10,000/h -> pilot light     $4,844
  $50,000/h -> warm standby    $11,170
 $200,000/h -> active-active   $16,955

ধরা হিসাবে pilot light জেতে, $3,244. Backup and restore-এর চালানোর খরচ মাত্র $552, কিন্তু ৮ ঘণ্টার RTO-এর ঝুঁকি $3,800 ধরে তা হারে। Active-active-এর ঝুঁকি প্রায় শূন্য, তবু মোট $14,975. ঘণ্টায় $50,000-এ warm standby আর $200,000-এ active-active সস্তা হয়।

এই হিসাব গড়ের। প্রত্যাশিত মান বলে না যে একটি বিপর্যয়েই ব্যবসা বন্ধ হতে পারে, তাই নিয়ন্ত্রক শর্ত বা অস্তিত্বের ঝুঁকি থাকলে শুধু এই হিসাবে থামবেন না। P বদলে দেখুন: ঝুঁকি এখানে region হারানোর, মানুষের ভুলের নয়। আর active-active-এর মানুষের খরচ, মানে জটিলতা আর পরীক্ষা, এখানে ধরাই হয়নি।

৯ · Failover চালানো — DNS, runbook, game day, failback আর দায়িত্ব

DNS failover

DNS failover-এ health check মূল ঠিকানাকে অসুস্থ দেখলে DNS উত্তর বদলে দ্বিতীয় ঠিকানা দেয়। এটি সস্তা আর provider-নিরপেক্ষ। কিন্তু এটি তাৎক্ষণিক নয়: TTL ৬০ সেকেন্ড হলেও পথের কোনো resolver বেশি সময় রাখতে পারে, আর আগে খোলা connection নিজে থেকে সরে না। তাই বদল ধীরে ছড়ায়। TTL আগে থেকেই ছোট রাখুন; বিপদের সময় কমালে পুরোনো মান শেষ হওয়ার অপেক্ষাই করতে হবে। Global load balancing বা anycast ঠিকানায় এই দেরি কম, খরচ ও নির্ভরতা আলাদা। DNS-এর বিস্তারিত পর্ব ২৯-এ।

একটি গভীর নিয়ম: failover-এর পথ যেন নষ্ট জিনিসের ওপর নির্ভর না করে। যে স্বয়ংক্রিয় ব্যবস্থা মূল region-এ বসে আছে, সে region-এর সাথেই যায়। এই গুণের নাম static stability: বিপদের সময় নতুন কিছু তৈরি না করেই টিকে থাকা। পর্ব ৫ থেকে পরিচিত এই ধারণাটিই warm standby-কে pilot light-এর চেয়ে ভরসার করে। মনে রাখুন, automatic failover সবসময় ভালো নয়: ছোট network ঝাঁকুনিতে region বদলে গেলে ক্ষতি বেশি হয়। অনেক দল ডেটার failover-এ মানুষের সিদ্ধান্ত রাখে।

Runbook আর game day

Runbook হলো রাত তিনটায় ঘুমচোখে পড়ার মতো নির্দেশিকা। এখানে কমান্ড লেখা থাকে, ধারণা নয়। সবচেয়ে গুরুত্বপূর্ণ কথা: runbook থাকবে নষ্ট হওয়া ব্যবস্থার বাইরে। সেটি যদি নষ্ট region-এর wiki-তে থাকে, তাহলে দরকারের সময়ই পাবেন না।

Runbook: orders region failover (নমুনা)
ঘোষণা করেন: incident lead; না পেলে তাঁর সহকারী
শর্ত: মূল region ১৫ মিনিট অচল, আর provider-এর ফেরার সময় অজানা
১. Fencing: পুরোনো primary-র পথ বন্ধ, যাচাই
২. Replica lag লিখে রাখুন (এটিই আসল RPO)
৩. Promote, তারপর database বড় করুন
৪. IaC চালান: app 12, quota যাচাই
৫. ধোঁয়া পরীক্ষা: লগইন, পরীক্ষামূলক অর্ডার
৬. DNS বদলান, error rate দেখুন
থামার নিয়ম: ধাপ ৩ ব্যর্থ হলে incident lead-কে জানান

Game day হলো নির্ধারিত দিনে ইচ্ছা করে বিপর্যয় সাজিয়ে চর্চা করা, স্কুলের অগ্নি-মহড়ার মতো। ছোট থেকে শুরু করুন: প্রথমে টেবিলে বসে আলোচনা, তারপর একটি backup restore, তারপর staging-এ failover, শেষে সাবধানে production-এ। প্রতিবার মাপুন আসল RPO আর RTO, আর runbook-এ যা ভুল পেলেন তা ঠিক করুন। Quota, হারানো key, মেয়াদ-উত্তীর্ণ certificate আর যে মানুষ ছুটিতে, এসব কাগজে ধরা পড়ে না, মহড়ায় পড়ে। Chaos engineering-এর বিস্তারিত পর্ব ৬৮-এ।

Failback

বিপদ কাটলে মূল region-এ ফেরার নাম failback বা ফিরে আসা। অনেকে এটিকে ছোট কাজ ভাবেন, অথচ এটিও একটি পুরো failover, উল্টো দিকে। পুরোনো primary-তে সেই ৮ সেকেন্ডের লেখা থাকতে পারে, যা নতুন primary পায়নি। তাই পুরোনো ডেটাকে সরাসরি চালু করা যায় না। ক্রমটি হলো: পুরোনো region-কে নতুন করে replica বানানো, ফাঁকে পড়া লেখাগুলো আলাদা করে দেখা, lag শূন্যের কাছে আনা, শান্ত সময়ে পরিকল্পিত বদল, তারপর আবার DR-এর পুরো সুরক্ষা চালু। তাড়াহুড়ো নেই; সেবা এখন চলছে। আর failback শেষের পরই যেন পরের বিপদের সুরক্ষা ফেরে, এই কথাটি runbook-এ লিখুন।

দায়িত্ব — সহজ করে

কঠিন ছক লাগে না। প্রতিটি প্রশ্নের পাশে একজন নাম আর একজন বিকল্প লিখে রাখলেই হয়:

  • Disaster কে ঘোষণা করবেন? (incident lead)
  • Backup আর restore test-এর মালিক কে?
  • ডেটা ঠিক ফিরেছে, এই কথা কে বলবেন? (সেবার মালিক দল)
  • গ্রাহক আর ব্যবস্থাপনাকে কে জানাবেন?
  • Backup account-এর চাবি কার হাতে?

Provider-এর দায়িত্ব কোথায় শেষ, সেটিও পর্ব ২-এর shared responsibility মনে রেখে দেখুন: Managed service-এর backup সুবিধা provider দেয়, কিন্তু চালু করা, মেয়াদ ঠিক করা আর ফিরিয়ে দেখা আপনার কাজ। মানুষের ভূমিকার বিস্তারিত পর্ব ৬৭-এ।

আরও গভীরে: DR-এর মূল নথি হলো NIST SP 800-34 Rev. 1 (২০১০, contingency planning), ব্যবসার ধারাবাহিকতার মান ISO 22301, আর ICT প্রস্তুতির মান ISO/IEC 27031. 3-2-1 নিয়মটির কৃতিত্ব সাধারণত আলোকচিত্রী Peter Krogh-কে দেওয়া হয়। আজকাল “3-2-1-1-0” কথাটিও শোনা যায়: একটি immutable কপি আর restore-এ শূন্য ত্রুটি, যদিও এটি কোনো আনুষ্ঠানিক মান নয়। আর সূক্ষ্ম একটি পার্থক্য: RPO আর RTO লক্ষ্য, MTD (maximum tolerable downtime) হলো সেই সীমা, যার পরে ব্যবসা নিজেই টেকে না।

পরীক্ষা ও ইন্টারভিউতে:

  • RPO আর RTO-এর পার্থক্য? RPO কত ডেটা হারানো চলে, পেছনে মাপে; RTO কত সময় বন্ধ থাকা চলে, সামনে মাপে।
  • Replica থাকলে backup লাগে? লাগে। Replica হার্ডওয়্যার হারানো সামলায়, কিন্তু ভুল DELETE আর ransomware-ও কপি করে।
  • ঘণ্টায় backup, পৌঁছাতে ১০ মিনিট, সবচেয়ে খারাপ RPO? ৬০ + ১০ = ৭০ মিনিট।
  • Pilot light আর warm standby-র পার্থক্য? Pilot light-এ শুধু ডেটা স্তর চালু, app বন্ধ; warm standby-তে ছোট আকারে পুরো সেবা চালু, তাই সঙ্গে সঙ্গে কিছু traffic নিতে পারে।
  • Snapshot কি backup? অন্য জায়গায় আর অন্য account-এ কপি না হওয়া পর্যন্ত নয়; সে পর্যন্ত এটি একই failure domain-এ দ্রুত ফেরার সুবিধা।

১০ · AI-এর যুগে backup আর DR যাচাই

AI কয়েক সেকেন্ডে backup script আর DR পরিকল্পনা লিখে দেয়। কিন্তু সে আপনার ডেটার মাপ, ঝুঁকি বা account-এর গঠন জানে না। আর সবচেয়ে বড় কথা, সে কখনো restore করে দেখে না। সাধারণ ভুলগুলো:

AI যা লেখেবিপদযাচাই
Backup শেষে “success” লিখে থামেRestore কখনো পরীক্ষা হয় নাস্বয়ংক্রিয় restore test
Backup একই account আর region-এএকটি চুরিতে সব যায়Failure domain আলাদা কি না দেখা
Backup role-এ * অনুমতিBackup মোছাও যায়শুধু লেখার অনুমতি
Backup bucket public বা key script-এ লেখাপুরো ডেটা ফাঁসPublic access বন্ধ, secret store
Key-এর কথা ভোলেRestore-এ পড়াই যায় নাঅন্য region-এ key নিয়ে মহড়া
RTO-তে শুধু কপির সময়আসল সময় অনেক বেশিসব ধাপ যোগ করে মাপা
আন্দাজে flag বা resource argumentScript ভাঙে বা ভুল কাজ করেDocumentation, --dry-run
Restore-এ rm -rf, terraform destroyভালো ডেটাও শেষপাশে restore, মানুষের অনুমোদন
Cross-region খরচ বাদবিলে বিস্ময়হিসাব আর budget alert

AI-কে পরিকল্পনা লিখতে না বলে পরিকল্পনা খুঁত ধরতে বলুন। নিচের কাঠামোয় আগে নিজের মাপগুলো দিন। কোনো key, account id বা গ্রাহকের ডেটা prompt-এ দেবেন না।

তুমি একজন সতর্ক SRE. আমার backup আর DR পরিকল্পনা পর্যালোচনা করো। ডেটা: [মাপ, দৈনিক বদল] RPO আর RTO লক্ষ্য: [সংখ্যা] এখনকার ব্যবস্থা: [কী, কত ঘন ঘন, কোন region, কোন account] Encryption key কোথায়: [জায়গা] শেষ restore পরীক্ষা: [তারিখ, কত সময় লেগেছে] ১. প্রতিটি বিপদের জন্য বলো কোন কপি বাঁচবে: মানুষের ভুল, region হারানো, ransomware, account চুরি। ২. RPO আর RTO হিসাব করে দেখাও, সব ধাপ যোগ করে, ধরে নেওয়া মান আলাদা লিখে। ৩. একই failure domain-এ পড়া কপি আর key খুঁজে বলো। ৪. কোনো destructive কমান্ড দেবে না। দিতে হলে আগে সতর্ক করবে। ৫. যে service-এর নাম বা flag নিশ্চিত নও, তা স্পষ্ট বলো।

চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Backup ছিল, তবু একটি প্রতিষ্ঠান কেন কয়েক ঘণ্টায় শেষ হয়ে গেল? ২০১৪ সালের Code Spaces থেকে account-এর শিক্ষা কী?

Code Spaces ছিল source code রাখার একটি ছোট সেবা, যা চলত public cloud-এ। ২০১৪ সালের জুনে প্রতিষ্ঠানটির প্রকাশিত বিবৃতি অনুযায়ী, কেউ তাদের cloud console-এ ঢোকার অধিকার পেয়ে টাকা দাবি করে। প্রতিষ্ঠানটি নিয়ন্ত্রণ ফেরানোর চেষ্টা করলে সেই ব্যক্তি server, ডেটা আর backup মুছতে শুরু করে। কয়েক দিনের মধ্যে প্রতিষ্ঠানটি জানায়, তারা আর ব্যবসা চালাতে পারবে না।

লক্ষ্য করুন, এখানে কোনো disk নষ্ট হয়নি, কোনো region পড়েনি। কাগজে কপি ছিল একাধিক। কিন্তু সব কপি ছিল একই পরিচয়ের নাগালে। মানে কপি অনেক, failure domain একটি।

আজকের operational উত্তর কয়েকটি স্তরে। প্রথম, backup থাকবে আলাদা account-এ, যেখানে production-এর পরিচয় শুধু লিখতে পারে। দ্বিতীয়, মেয়াদের আগে মোছা ঠেকাতে immutable lock. তৃতীয়, root-এ MFA আর দৈনন্দিন কাজে temporary credential, যাতে একটি ফাঁস হওয়া key-এর ক্ষমতা ছোট থাকে। চতুর্থ, মোছার মতো ভয়ংকর API কলে alert. পঞ্চম, আগেই লেখা ঘটনার পরিকল্পনা: কোন বোতাম কে চাপবেন, যাতে চাপের মুখে কেউ ভুল সিদ্ধান্ত না নেন।

এগুলোর কোনোটিই খুব দামি নয়। আলাদা account সাধারণত বিনা মূল্যে খোলা যায়; দাম লাগে শুধু কপি রাখার। ছোট দলের জন্যও তাই এটি প্রথম সিদ্ধান্তগুলোর একটি হওয়া উচিত।

মূল উপলব্ধি: কপির সংখ্যা নয়, স্বাধীনতার সংখ্যা গুনুন। একটি চাবিতে যত কপি মোছা যায়, ঝুঁকির চোখে সেগুলো একটিই কপি।

প্র ০২Cloud provider নিজেই যদি আপনার সব কিছু মুছে ফেলে? ২০২৪ সালের UniSuper-এর ঘটনা কী বলে?

২০২৪ সালের মে মাসে অস্ট্রেলিয়ার বড় অবসর-তহবিল UniSuper-এর সেবা প্রায় দুই সপ্তাহ ব্যাহত হয়। UniSuper আর Google Cloud-এর যৌথ বিবৃতি অনুযায়ী, কারণ ছিল একটি অস্বাভাবিক ত্রুটি: provisioning-এর সময় একটি ভুল কনফিগারেশনের ফলে UniSuper-এর Private Cloud subscription মুছে যায়। প্রতিষ্ঠানটির ব্যবস্থা দুটি ভৌগোলিক অঞ্চলে সাজানো ছিল, কিন্তু মোছা হয়েছিল দুই জায়গাতেই। তাই সাধারণ অঞ্চল-পার সুরক্ষা কাজে আসেনি। বিবৃতি অনুযায়ী উদ্ধার সম্ভব হয় কারণ UniSuper-এর আরেকটি সেবাদাতার কাছে backup ছিল।

এই ঘটনা খুব বিরল, আর তার ওপর ভিত্তি করে সবাইকে দুই cloud-এ যেতে বলা ঠিক নয়। তবু এটি একটি দামি ধারণা দেখায়। আমরা বলি “region আলাদা, তাই failure domain আলাদা।” কিন্তু region-এর ওপরেও স্তর আছে: account, subscription, আর provider নিজে। প্রতিটি স্তরের ওপর একটি প্রশ্ন আছে: এই স্তরে একটি ভুল হলে কী যায়?

Shared responsibility-র ভাষায়, provider-এর durability সংখ্যা মূলত হার্ডওয়্যারের ঝুঁকি মাপে; ভুল করে মোছা, account বন্ধ হওয়া বা দেনা নিয়ে বিরোধ সেই হিসাবে পড়ে না। যে ডেটা ছাড়া ব্যবসা চলে না, তার জন্য অন্য provider বা নিজের জায়গায় একটি কপি রাখা যুক্তিসংগত বীমা। খরচ তুলনায় কম, কারণ এই কপির জন্য পুরো সেবা চালাতে হয় না, শুধু ডেটা রাখতে হয়। তবে নিজেকে জিজ্ঞেস করুন, ওই কপি ফেরাতে কত সময় লাগবে, আর সেখানে চালানোর মতো পরিবেশ কি IaC-তে লেখা আছে? ফাঁকা কপি দিয়ে সেবা চলে না।

মূল উপলব্ধি: নিজের ঝুঁকির তালিকায় provider-কেও একটি failure domain হিসেবে লিখুন। সিদ্ধান্ত যাই হোক, সেটি জেনেবুঝে নিন।

প্র ০৩Ransomware-এ টাকা দিলে কি RTO কমে? ২০২১ সালের Colonial Pipeline-এর ঘটনা কী দেখায়?

২০২১ সালের মে মাসে যুক্তরাষ্ট্রের জ্বালানি পাইপলাইন প্রতিষ্ঠান Colonial Pipeline ransomware আক্রমণের পর সতর্কতা হিসেবে পাইপলাইন কয়েক দিন বন্ধ রাখে, যার প্রভাব পড়ে পূর্ব উপকূলের জ্বালানি সরবরাহে। প্রতিষ্ঠানটির প্রধান নির্বাহী পরে জানান, তাঁরা প্রায় ৪৪ লাখ ডলার মুক্তিপণ দিয়েছিলেন। সংবাদমাধ্যমের খবর অনুযায়ী, পাওয়া decryption tool এত ধীর ছিল যে প্রতিষ্ঠানটি নিজের backup দিয়েই পুনরুদ্ধার চালিয়ে যায়। মার্কিন বিচার বিভাগ পরে মুক্তিপণের একটি অংশ উদ্ধারের কথা জানায়।

এখান থেকে একটি operational সত্য বেরোয়। টাকা দেওয়া মানে সবকিছু ঠিক হওয়া নয়। সবচেয়ে ভালো ক্ষেত্রেও আপনি একটি অপরিচিত tool পান, যা আপনার ডেটার ওপর পরীক্ষা হয়নি, আর গতি কত কেউ জানে না। RTO-এর সূত্রের “ডেটার মাপ ÷ গতি”-তে গতিটি তখন অজানা। তার ওপর ঘর পরিষ্কার না হলে আবার আক্রান্ত হওয়ার ঝুঁকি থাকে, কারণ decrypt করলেই অনুপ্রবেশের পথ বন্ধ হয় না। আর ফাঁস হওয়া ডেটা ফেরত আসে না।

তাই প্রশ্নটি উল্টে দিন: আক্রান্ত হলে আপনার নিজের restore-এর RTO কত? মহড়ায় ১২ ঘণ্টা মাপা থাকলে ব্যবস্থাপনার সামনে আসল বিকল্প আছে। মাপা না থাকলে চাপের মুখে আন্দাজই ভরসা। মুক্তিপণের সিদ্ধান্তটি আইন, নীতি আর ব্যবসার; অনেক দেশের সরকারি সংস্থা এটিকে নিরুৎসাহিত করে, আর আইনও জায়গাভেদে আলাদা। প্রকৌশলীর কাজ সেই সিদ্ধান্তকে অপ্রয়োজনীয় করে তোলা।

মূল উপলব্ধি: Immutable কপি আর মাপা restore সময় হলো দর-কষাকষির সবচেয়ে বড় শক্তি। সবচেয়ে ভালো মুক্তিপণ সেটিই, যা দেওয়ার প্রয়োজনই পড়ে না।

প্র ০৪Failover-এর চেয়ে failback কেন কঠিন হতে পারে? ২০১৮ সালের GitHub-এর ২৪ ঘণ্টার ঘটনা কী শেখায়?

২০১৮ সালের ২১ অক্টোবর GitHub-এর একটি network রক্ষণাবেক্ষণের সময় যুক্তরাষ্ট্রের পূর্ব উপকূলের data center-এর সাথে সংযোগ মাত্র ৪৩ সেকেন্ডের জন্য বিচ্ছিন্ন হয়। প্রতিষ্ঠানটির প্রকাশিত বিশ্লেষণ অনুযায়ী, এই অল্প সময়েই স্বয়ংক্রিয় ব্যবস্থা কিছু MySQL cluster-এর primary পশ্চিম উপকূলে সরিয়ে দেয়। সংযোগ ফিরলে দেখা যায়, দুই দিকের database-এ এমন লেখা আছে, যা অন্য দিকে নেই। মাত্র ৪৩ সেকেন্ডের ঝাঁকুনির ফলে সেবা ২৪ ঘণ্টার বেশি সময় আংশিক ব্যাহত থাকে।

কেন এত সময় লাগল? সহজ পথ ছিল এক দিকের লেখা ফেলে দেওয়া, কিন্তু প্রতিষ্ঠানটি ব্যবহারকারীর ডেটার অখণ্ডতাকে প্রাপ্যতার ওপরে রাখে। তাই backup থেকে নতুন replica বানানো, দূর region-এ রাখা নিয়ে latency-র সমস্যা সামলানো আর আলাদা হয়ে যাওয়া লেখা মেলানো, সব মিলে অনেক সময় লাগে। Restore-এর বিশাল মাপও এখানে সরাসরি RTO হয়ে দাঁড়ায়।

এই ঘটনায় failback কঠিন হওয়ার কারণগুলো স্পষ্ট। Failover-এ আপনি একটি লক্ষ্য বাছেন আর এগিয়ে যান। Failback-এ দুটি ইতিহাস একটিতে আনতে হয়, আর সেটি স্বয়ংক্রিয়ভাবে হয় না। তার ওপর সেবা এখন চলছে এমন region-এ, যেখানে পুরো চাপ, cache আর latency আগে পরীক্ষা হয়নি।

Operational শিক্ষা তিনটি। Automatic failover-এ একটি ন্যূনতম অপেক্ষা রাখুন, যাতে ক্ষণিকের ঝাঁকুনিতে region না বদলায়। Region-পার ডেটা সরানোর সিদ্ধান্তে মানুষের অনুমোদন ভাবুন। আর আগেই ঠিক করুন, সংঘাতে কোন দিকের লেখা জিতবে, আর আলাদা হওয়া লেখা কোথায় তোলা থাকবে।

মূল উপলব্ধি: Failover-এর সিদ্ধান্ত সেকেন্ডে হতে পারে, কিন্তু তার দাম ঘণ্টায় শোধ করতে হতে পারে। তাই failback-কেও মহড়ায় আনুন।

প্র ০৫উদ্ধারের হাতিয়ারগুলোই যদি বিপর্যয়ে পড়ে? ২০২১ সালের Facebook-এর বিভ্রাট runbook সম্পর্কে কী শেখায়?

২০২১ সালের ৪ অক্টোবর Facebook, Instagram আর WhatsApp কয়েক ঘণ্টা অচল ছিল। প্রতিষ্ঠানটির প্রকাশিত প্রকৌশল-বিবরণ অনুযায়ী, backbone network-এর রক্ষণাবেক্ষণের একটি কমান্ড ভুলবশত data center-গুলোর সংযোগ কেটে দেয়, আর নিরীক্ষার tool-এর একটি bug সেটি আটকাতে পারেনি। তারপর DNS server-গুলো নিজেদের ঠিকানা ঘোষণা বন্ধ করে দেয়, ফলে বাইরের দুনিয়া থেকে সব অদৃশ্য হয়ে যায়।

আমাদের জন্য সবচেয়ে শিক্ষণীয় অংশটি পরের। বিবরণ অনুযায়ী, প্রকৌশলীদের দূর থেকে ঢোকার পথ আর ভেতরের tool-গুলো সেই একই network-এর ওপর নির্ভর করত। ফলে সমস্যা বোঝা সত্ত্বেও মানুষকে শারীরিকভাবে data center-এ যেতে হয়। সেখানে যন্ত্রের সুরক্ষা ইচ্ছা করেই কঠিন, তাই আরও সময় গেল। সংযোগ ফেরার পরও ধীরে ধীরে চাপ আনতে হয়, যাতে একসাথে সবাই ফিরে এসে নতুন ব্যর্থতা না ঘটায়।

এখান থেকে একটি প্রশ্ন বের হয়, যা নিজের runbook-এ করা উচিত: এই ধাপের জন্য কী কী চালু থাকতে হবে? প্রতিটি ধাপের নির্ভরতা লিখুন: SSO, VPN, chat, wiki, CI, secret store. এগুলো কি মূল region-এ? Chat নষ্ট হলে দল কোথায় কথা বলবে? Identity provider নষ্ট হলে কে প্রবেশ করবে?

উত্তরে আসে কয়েকটি সহজ ব্যবস্থা: runbook-এর বাইরের কপি, মাঝেমধ্যে পরীক্ষা করা জরুরি প্রবেশ পথ (break-glass account), আলাদা যোগাযোগের মাধ্যম, আর মানুষের ফোন নম্বরের একটি ছাপা তালিকা। এগুলো শান্ত দিনে অপ্রয়োজনীয় মনে হয়, তাই game day-তে এগুলোই পরীক্ষা করুন।

মূল উপলব্ধি: DR শুধু আপনার সেবার পরিকল্পনা নয়, আপনার সেবা ফেরানোর ব্যবস্থারও পরিকল্পনা। উদ্ধারের পথ বিপদের একই failure domain-এ থাকলে, তা পথ নয়।

অনুশীলন

কোনো cloud account লাগবে না। কাগজ-কলম আর ওপরের simulator যথেষ্ট।

  1. RPO আর RTO কষুন: ৮০০ GB database, রাত ০১:০০-তে দৈনিক backup, অন্য region-এ পৌঁছাতে ৩০ মিনিট। Restore-এর পথ ১ Gbps, disk-এ লেখা ৯০ MB/s, বাকি সব ধাপ মিলে ৬০ মিনিট। (ক) সবচেয়ে খারাপ RPO কত? (খ) রাত ২০:১৫-এ region গেলে কতটা ডেটা হারাবে? (গ) RTO কত? (ঘ) ৪ ঘণ্টা RTO রাখতে এই ডেটা কত বড় হতে পারে?

    (ক) ২৪ ঘণ্টা + ৩০ মিনিট = ২৪ ঘণ্টা ৩০ মিনিট. (খ) শেষ নিরাপদ কপি ০১:০০-এর, তাই ২০:১৫ − ০১:০০ = ১৯ ঘণ্টা ১৫ মিনিট।

    (গ) ১ Gbps = ১২৫ MB/s, কিন্তু disk ৯০ MB/s, তাই গতি ৯০ MB/s. কপি: ৮ × ১০১১ ÷ (৯ × ১০৭) ≈ ৮,৮৮৯ সেকেন্ড ≈ ১৪৮ মিনিট। মোট ১৪৮ + ৬০ = প্রায় ২০৮ মিনিট, মানে ৩ ঘণ্টা ২৮ মিনিট।

    (ঘ) কপির জন্য বাকি ২৪০ − ৬০ = ১৮০ মিনিট = ১০,৮০০ সেকেন্ড। ১০,৮০০ × ৯০ MB/s = ৯৭২ GB. ডেটা প্রায় ২২% বাড়লেই এই সীমা পেরিয়ে যাবে, তাই RTO-কে প্রতি প্রান্তিকে আবার মাপুন।

  2. ফল আগে বলুন: নিচের কমান্ডগুলো খালি একটি ফোল্ডারে পরপর চালালে শেষ পর্যন্ত কী দেখা যাবে, আর a.txt-এর অবস্থা কী হবে? প্রথমে ভাবুন।
    printf 'hello\n' > a.txt
    sha256sum a.txt > m
    cp a.txt b.txt
    printf 'x' >> a.txt
    sha256sum -c m; echo "exit=$?"
    mv b.txt a.txt
    sha256sum -c m; echo "exit=$?"

    প্রথম sha256sum -c-তে a.txt: FAILED, একটি WARNING আর exit=1, কারণ a.txt-এর শেষে একটি অক্ষর জুড়েছে। b.txt তার আগেই কপি হয়েছিল, তাই সেটি অক্ষত। mv ভালো কপিটি দিয়ে নষ্ট ফাইলটি প্রতিস্থাপন করে, তাই দ্বিতীয়বার a.txt: OK আর exit=0. শেষে ফোল্ডারে থাকে a.txt (মূল লেখা hello) আর m; b.txt আর নেই। এটিই ছোট আকারে একটি ভালো কপি থেকে সারানো।

  3. নকশা সমালোচনা: একটি দল বলছে: “আমরা নিরাপদ। Database multi-AZ, প্রতি ঘণ্টায় একই region আর একই account-এ snapshot, ৭ দিন রাখা হয়, সব একই KMS key-এ encrypted, আর dashboard-এ সব সবুজ। কখনো restore করতে হয়নি।” চার বিপদের সামনে এই পরিকল্পনার দুর্বলতা বলুন, আর সবচেয়ে সস্তা তিনটি উন্নতি প্রস্তাব করুন।

    মানুষের ভুল: ঘণ্টায় snapshot মোটামুটি চলে, তবে ৭ দিনের পর ধরা পড়া ভুল ফেরে না। Region হারানো: সব কপি একই region-এ, তাই কিছুই নেই। Ransomware আর account চুরি: একই account-এর পরিচয় snapshot আর key দুটোই মুছতে পারে, তাই সব একসাথে যেতে পারে। “সব সবুজ” মানে job চলেছে; restore কখনো পরীক্ষা হয়নি, তাই আসল RTO অজানা।

    সস্তা উন্নতি: (১) অন্য account আর অন্য region-এ দৈনিক immutable কপি, নিজের key-সহ, ৩০ দিনের বেশি রাখা। (২) মাসে একবার, পরে প্রতিদিন, স্বয়ংক্রিয় restore test. (৩) Log-ভিত্তিক PITR চালু করা, যা অনেক managed database-এ একটি setting মাত্র।

  4. নিজের Tier বানান: আপনার জানা একটি অ্যাপ নিন, যেমন একটি কোচিং সেন্টারের ফি আদায়ের ওয়েবসাইট। চারটি অংশ বেছে স্তর, RPO, RTO আর কৌশল লিখুন। তারপর বলুন: কোন অংশ কোনটির ওপর নির্ভর করে, আর সেটি কি আপনার স্তর বদলে দেয়?

    একটি সম্ভাব্য উত্তর: ফি-র হিসাব Tier 0-এর কাছাকাছি (RPO কয়েক মিনিট, RTO ১ ঘণ্টা, PITR আর pilot light), লগইন Tier 1, নোটিশ বোর্ড Tier 2 (দৈনিক backup), আর ছবি ও ক্যাশ Tier 3. নির্ভরতা দেখুন: ফি জমা নিতে লগইন লাগে, তাই লগইন ফি-র সমান স্তরে ওঠে। Payment gateway বাইরের সেবা, তাই সেটি নষ্ট হলে আপনার DR কাজে আসে না; ম্যানুয়াল রসিদের একটি বিকল্প ব্যবসায়িক পথ রাখুন। ছোট প্রতিষ্ঠানে এই মাপের জন্য backup and restore প্লাস নিয়মিত restore test-ই অনেক সময় যথেষ্ট; দামি কৌশল প্রমাণ ছাড়া নেবেন না।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমPilot light failover-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. বাইরের health check-এর alert আর disaster ঘোষণা
  2. Fencing: পুরোনো primary-র লেখা বন্ধ
  3. Replica promote করে database বড় করা
  4. IaC দিয়ে app server চালু করা
  5. ধোঁয়া পরীক্ষা করে DNS বদলানো
  6. পরে শান্ত সময়ে পরিকল্পিত failback

প্রতি ঘণ্টার শুরুতে backup নেওয়া হয়, আর কপিটি অন্য region-এ পৌঁছাতে ১০ মিনিট লাগে। Region হারালে সবচেয়ে খারাপ ক্ষেত্রে কত সময়ের ডেটা হারাবে?

  • ১০ মিনিট
  • ৬০ মিনিট
  • ৭০ মিনিট
  • ১২০ মিনিট

১ TB ডেটা ১ Gbps পথে restore করতে হবে। Disk আর পথের অন্য কোনো অংশ বাধা নয়। বাকি সব ধাপে লাগে ২০ মিনিট। RTO প্রায় কত? (1 GB = 109 B)

  • প্রায় ৩৭ মিনিট
  • প্রায় ১৫৩ মিনিট
  • প্রায় ১৩৩ মিনিট
  • প্রায় ২২ ঘণ্টা

একজন প্রকৌশলী ভুল করে production-এ একটি টেবিল মুছে ফেললেন। দুই সেকেন্ড lag-এর asynchronous replica-ও সেটি পেয়ে গেল। কোনটি এই ডেটা ফেরাতে সবচেয়ে উপযোগী?

  • Point-in-time recovery দিয়ে ভুলের আগের মুহূর্তে ফেরা
  • Replica-তে failover করা
  • আরেকটি availability zone যোগ করা
  • Database-এর disk বড় করা

একটি DR নকশায় দ্বিতীয় region-এ একটি ছোট database replica চলছে, app server বন্ধ, কিন্তু image আর IaC তৈরি। বিপদে database বড় করে app চালু করা হবে। এই কৌশলের নাম কী?

  • Backup and restore
  • Warm standby
  • Multi-site active-active
  • Pilot light

চলমান database-এর disk-এর crash-consistent snapshot বলতে কী বোঝায়?

  • App-কে থামিয়ে সব লেখা disk-এ নামানোর পর নেওয়া ছবি
  • হঠাৎ বিদ্যুৎ গেলে disk যে অবস্থায় থাকত, সেই অবস্থার ছবি
  • Database crash করার পর নেওয়া নষ্ট কপি
  • শুধু অন্য region-এ রাখা কপি

Backup অন্য account-এ immutable অবস্থায় আছে। কিন্তু সেটি যে encryption key দিয়ে লক করা, সেটি production account-এ ছিল আর মুছে গেছে। কী হবে?

  • Immutable কপি বলে কোনো সমস্যা হবে না
  • Provider নিজের key দিয়ে পড়ে দেবে
  • কপি অক্ষত থাকলেও পড়া যাবে না, তাই ফেরানো যাবে না
  • Checksum চালালেই ডেটা ফিরবে

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. RPO মাপে কত ডেটা গেল (≈ ব্যবধান + পৌঁছানোর সময়), RTO মাপে কত সময় গেল (সব ধাপ + ডেটা ÷ গতি)।
  2. Replication ভুলও কপি করে; ভুল আর ransomware থেকে বাঁচায় backup আর PITR.
  3. 3-2-1: অন্তত একটি কপি অন্য account-এ, immutable, আর তার key-ও বেঁচে থাকে।
  4. Restore করে না দেখলে backup নেই। Checksum কপি মেলায়, restore test কাজের প্রমাণ দেয়।
  5. চার কৌশল খরচ আর RTO-এর সিঁড়ি; সব ধাপে backup, runbook, game day আর failback-এর চর্চা লাগে।

পরের পর্বে: Storage আর database-এর মডিউল শেষ। এবার যে পথে এসব কথা বলে, সেই network. পর্ব ২৫-এ দেখব VPC আর subnet: CIDR, public-private ভাগ আর ঠিকানার নকশা।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান