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

Failover আর disaster recovery — backup, RPO-RTO আর multi-region

Failover & Disaster Recovery — Backups, RPO/RTO, Point-in-Time Restore, DR Strategies & Multi-Region Design

Taught in Bangla, this lesson plans for disasters that replication alone cannot fix: setting RPO and RTO from business impact, full, incremental and differential backups, snapshots and point-in-time recovery, the 3-2-1 rule and immutable copies, every step of region failover and failback, the backup-and-restore, pilot light, warm standby and active-active ladder, multi-AZ versus multi-region, cells, static stability and game days.

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

  • ছয় রকম বিপর্যয় চেনা, আর কোনটির বিরুদ্ধে replication, backup বা দ্বিতীয় region কাজ করে
  • ব্যবসার ক্ষতি থেকে RPO আর RTO ঠিক করা, আর RTO-কে ধাপে ভেঙে হিসাব করা
  • Full, incremental, differential backup, snapshot আর point-in-time recovery-র নকশা; 3-2-1, immutable কপি, encryption আর retention
  • Region failover-এর প্রতিটি ধাপ — detection, fencing, promotion, traffic shift আর failback
  • চার DR কৌশল, multi-AZ বনাম multi-region, DNS failover-এর সীমা, cell আর static stability, game day আর runbook

১ · বিপর্যয় কাকে বলে — ছয় রকম বিপদ, ছয় রকম প্রতিরক্ষা

পর্ব ৫-এ (Availability আর reliability) দেখেছেন, redundancy দিয়ে ছোট আর ঘনঘন ব্যর্থতা — একটি সার্ভার, একটি ডিস্ক — নিজে থেকেই সামলানো যায়। এই পর্বের প্রশ্ন বড় আর বিরল ঘটনা নিয়ে: পুরো data center অন্ধকার, কেউ ভুল করে production-এর টেবিল মুছে ফেলল, বা চুরি যাওয়া চাবি দিয়ে কেউ সব ডেটা encrypt করে দিল। এমন ঘটনার পর সেবা আর ডেটা গ্রহণযোগ্য সময়ে, গ্রহণযোগ্য ক্ষতিতে ফিরিয়ে আনার পরিকল্পনা, ব্যবস্থা আর অনুশীলনকে বলে disaster recovery (DR).

পাড়ার মুদি দোকানের বাকির খাতার কথা ভাবুন। সাবধানী দোকানদার প্রতি রাতে খাতাটি দেখে বাড়িতে রাখা দ্বিতীয় খাতায় হুবহু তুলে রাখেন। দোকানে আগুন লাগলে বাড়ির খাতা তাঁকে বাঁচায় — এটি replication. কিন্তু ছেলে যদি ভুল করে একটি পাতার সব হিসাব কেটে দেয়, রাতে সেই কাটা পাতাও বাড়ির খাতায় উঠে যায়! তখন দরকার গত সপ্তাহের একটি ফটোকপি, যা আর কেউ বদলাতে পারে না — এটি backup. প্রথমটি জবাব দেয় “এখন একটি কপি হারালে কী হবে”, দ্বিতীয়টি জবাব দেয় “অতীতের একটি ভালো অবস্থায় কি ফেরা যাবে”।

বিপদউদাহরণযা বাঁচায়যা বাঁচায় না
Hardwareডিস্ক, সার্ভার বা rack নষ্টঅন্য সার্ভার বা zone-এ replica (পর্ব ২২)একই rack-এ সব কপি
Zone বা region-এর বিভ্রাটবিদ্যুৎ, কুলিং, network বা প্রদানকারীর নিজের ত্রুটিmulti-AZ; পুরো region-এর জন্য দ্বিতীয় regionএকই region-এ সব কপি আর সব backup
মানুষের ভুল, খারাপ deployভুল DELETE, ভুল environment-এ script, ভুল configpoint-in-time backup, versioning, ধাপে ধাপে rollout (পর্ব ৫৩)replication — ভুলটিও কপি হয়
Data corruptionsoftware bug নীরবে ভুল লেখে, bit rotchecksum, অনেক দিন আগের ভালো কপিছোট retention — ভুল ধরা পড়ার আগেই ভালো কপি মুছে যায়
Ransomware, ইচ্ছাকৃত মোছাচুরি হওয়া চাবি দিয়ে encrypt বা deleteআলাদা account-এ immutable বা offline কপি, ন্যূনতম অধিকার (পর্ব ৫২)একই credential দিয়ে মোছা যায় এমন backup
প্রাকৃতিক দুর্যোগবন্যা, ঘূর্ণিঝড়, ভূমিকম্প, আগুন, দীর্ঘ বিদ্যুৎ-বিভ্রাটভৌগোলিকভাবে দূরের region বা siteএকই এলাকায় দুটি data center

তৃতীয় থেকে পঞ্চম সারিতে replica প্রায় অকেজো, কারণ replication-এর কাজই সব বদল দ্রুত সবখানে পৌঁছানো — ভালো-মন্দ আলাদা না করে। বড় ডেটা-হারানোর অনেক ঘটনা আসে মানুষ আর software থেকে; পর্ব ৫-এর ভাবনার প্রশ্নে ২০১৭ সালের GitLab-এর ঘটনা এর পরিচিত উদাহরণ।

বাংলাদেশের প্রেক্ষাপটে: নিজস্ব server room বা স্থানীয় data center চালালে শেষ সারিটি তাত্ত্বিক নয়: জলাবদ্ধতার এলাকায় যন্ত্র কি নিচতলায়? দীর্ঘ লোডশেডিংয়ে generator-এর জ্বালানি কত ঘণ্টা চলবে? দ্বিতীয় site কি একই বন্যা-এলাকা বা একই বিদ্যুৎ-গ্রিডে? ঝুঁকি জায়গাভেদে অনেক আলাদা — সাধারণ সংখ্যা ধরে না নিয়ে নিজের site স্থানীয়ভাবে যাচাই করুন।

২ · RPO আর RTO — ব্যবসার ক্ষতি থেকে দুটি সংখ্যা

DR পরিকল্পনার শুরু প্রযুক্তি দিয়ে নয়, দুটি প্রশ্ন দিয়ে। প্রথম, বিপর্যয়ের পর সর্বোচ্চ কত সময়ের সাম্প্রতিক ডেটা হারানো চলে? এর লক্ষ্যই RPO (Recovery Point Objective). দ্বিতীয়, বিপর্যয় থেকে সেবা আবার চালু হওয়া পর্যন্ত সর্বোচ্চ কত সময় চলে? এটি RTO (Recovery Time Objective).

শেষ নিরাপদ কপি ⟵ RPO ⟶ 💥 বিপর্যয় ⟵ RTO ⟶ সেবা আবার চালু
RPO মাপে অতীতের দিকে (কতটা ডেটা), RTO মাপে ভবিষ্যতের দিকে (কতটা সময়)

দুটিই লক্ষ্য; মহড়ায় বা আসল ঘটনায় মাপা প্রকৃত মানকে কেউ কেউ RPA আর RTA (actual) বলেন। কাগজে ১ ঘণ্টা, মহড়ায় ৯ ঘণ্টা — এই ফাঁক ধরাই মহড়ার কাজ (অংশ ৪)।

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

প্রতিটি সুবিধার জন্য আলাদা করে ভাবুন: এক ঘণ্টা বন্ধ থাকলে কী ক্ষতি — টাকা, আস্থা, আইনি দায়? এক ঘণ্টার লেখা হারালে কী ক্ষতি — আবার তৈরি করা যায়, নাকি চিরতরে গেল? এই বিশ্লেষণকে বলে business impact analysis. একটি কাল্পনিক mobile banking সেবায় উত্তরগুলো এমন হতে পারে (সংখ্যা উদাহরণ মাত্র):

অংশডেটা হারালেRPORTO
লেনদেনের ledgerকার কত টাকা — আর ফেরানো যায় নাপ্রায় শূন্যকয়েক মিনিট
লগইন ও sessionব্যবহারকারী আবার লগইন করবেনযা হারায় হারাককয়েক মিনিট
মাসিক statement-এর PDFledger থেকে আবার বানানো যায়এক দিনকয়েক ঘণ্টা
Analytics আর reportবিরক্তিকর, কিন্তু আবার হিসাব করা যায়এক দিনএক-দুই দিন

শিক্ষা দুটি। এক, “পুরো সিস্টেমের RPO” প্রায়ই ভুল প্রশ্ন — অংশভেদে আলাদা স্তর (tier) রাখলে খরচ অনেক কমে। দুই, RPO শূন্যের কাছে নিতে লেখাটি client-কে “সফল” বলার আগেই অন্য জায়গায় পৌঁছাতে হয় — synchronous replication, যার দাম প্রতিটি লেখায় latency (অংশ ৭)।

RTO-কে ধাপে ভাঙুন

RTO একটি সংখ্যা নয়, কয়েকটি ধাপের যোগফল: টের পাওয়া (MTTD) + সিদ্ধান্ত নেওয়া + নতুন যন্ত্র বা পরিবেশ তৈরি + ডেটা restore + log replay + যাচাই + traffic সরানো। নিচের হিসাবযন্ত্রে একটি ৫ TB database-এর চারটি কৌশল তুলনা করা হয়েছে। সব সংখ্যা ধরা যাক — নিজের মাপ বসিয়ে চালান।

// Worst-case data loss (RPO) and recovery time (RTO) for four strategies.
// Every number below is an assumption for a 5 TB database, not a product figure.
const TB = 1e12, GB = 1e9, MB = 1e6;
const DATA = 5 * TB;                       // size of the full backup
const SPEED = 400 * MB;                    // restore: download + decompress + write, bytes/s
const hrs = (bytes, speed = SPEED) => bytes / speed / 3600;
const base = 0.25 + 0.5 + 0.5 + 0.1;       // detect + decide + verify + traffic shift (h)
const S = [                                // every = backup interval, ship = time until the copy is safe (h)
  { name: "A daily full",          every: 24,   ship: 2,    build: 1,  restore: hrs(DATA) },
  { name: "B full + hourly incr",  every: 1,    ship: 0.25, build: 1,
    restore: hrs(DATA) + 23 * (hrs(4 * GB) + 3 / 60) },   // 23 incrementals, 3 min overhead each
  { name: "C full + WAL archive",  every: 1/60, ship: 1/60, build: 1,
    restore: hrs(DATA) + hrs(300 * GB, 100 * MB) },        // replay up to 24 h of WAL at 100 MB/s
  { name: "D async replica",       every: 0,    ship: 5/3600, build: 0.25, restore: 0.1 }, // scale up + promote
];
const fmt = h => h >= 1 ? h.toFixed(2) + " h" : h * 60 >= 1 ? (h * 60).toFixed(1) + " min" : (h * 3600).toFixed(0) + " s";
console.log("strategy               worst data loss   recovery time");
for (const s of S) {
  const loss = s.every + s.ship;           // disaster just before the next copy is safe
  const rto = base + s.build + s.restore;
  console.log(s.name.padEnd(23) + fmt(loss).padEnd(18) + fmt(rto));
}
console.log("\nrestoring 5 TB at different effective speeds:");
for (const mbps of [100, 400, 1000, 4000]) console.log(String(mbps).padStart(5) + " MB/s -> " + fmt(hrs(DATA, mbps * MB)));

আউটপুট:

strategy               worst data loss   recovery time
A daily full           26.00 h           5.82 h
B full + hourly incr   1.25 h            7.04 h
C full + WAL archive   2.0 min           6.66 h
D async replica        5 s               1.70 h

restoring 5 TB at different effective speeds:
  100 MB/s -> 13.89 h
  400 MB/s -> 3.47 h
 1000 MB/s -> 1.39 h
 4000 MB/s -> 20.8 min

A: backup দিনে একবার, শেষ হয়ে নিরাপদ জায়গায় পৌঁছাতে ২ ঘণ্টা — তাই সবচেয়ে খারাপ ক্ষতি ২৪ নয়, 26.00 h: পরের backup নিরাপদ হওয়ার ঠিক আগমুহূর্তে বিপর্যয় হলে আগের backup-এর পরের সব লেখা যায়। B: ঘণ্টায় incremental দিয়ে ক্ষতি নামল 1.25 h-এ, কিন্তু recovery বাড়ল 7.04 h-এ — full-এর ওপর ২৩টি incremental একটির পর একটি বসাতে হয়, প্রতিটির নিজস্ব খরচসহ। RPO ভালো করার কৌশল RTO খারাপ করতে পারে। C: প্রতি মিনিটে WAL পাঠালে ক্ষতি মাত্র 2.0 min, তবু restore-এ প্রায় একই সময় লাগে — 6.66 h. D: চালু replica-তে ক্ষতি কয়েক সেকেন্ড, recovery 1.70 h — যার ১.৩৫ ঘণ্টাই মানুষ, যাচাই আর traffic. শেষ চার লাইন: ৫ TB নামাতে ১০০ MB/s-এ প্রায় ১৪ ঘণ্টা; গতি বাড়াতে লাগে সমান্তরালে অনেক টুকরো আর ডেটার কাছেই restore.

৩ · Backup-এর নকশা — full, incremental, differential, snapshot আর point-in-time

Database-স্তরের খুঁটিনাটি — logical বনাম physical backup, pg_dump, base backup — DBMS কোর্সের Backup, replication আর high availability পর্বে, আর WAL থেকে crash-এর পর ফেরা Recovery পর্বে। এখানে সিস্টেমের চোখে দেখব: কোন ধরন কত লম্বা restore-চেইন বানায়, আর কী কী backup লাগে।

Full

Full backup: পুরো ডেটার সম্পূর্ণ কপি। Restore সবচেয়ে সরল — একটিই টুকরো; কিন্তু প্রতিবার সময়, জায়গা আর network লাগে সবচেয়ে বেশি।

সাপ্তাহিক বা দৈনিক ভিত্তি

Incremental

Incremental: শেষ backup-এর (যে ধরনেরই হোক) পরের বদলটুকু। প্রতিদিন ছোট আর দ্রুত; restore-এ লাগে full + তার পরের সব incremental, একটিও হারালে চেইন ভাঙে।

ছোট, ঘনঘন

Differential

Differential: শেষ full-এর পরের সব বদল। দিন যত যায় তত বড় হয়; কিন্তু restore-এ লাগে মাত্র দুটি — full আর শেষ differential.

মাঝামাঝি

অনেক backup ব্যবস্থা পুরোনো full-এর সাথে incremental-গুলো পেছনে মিলিয়ে নতুন একটি “synthetic full” বানিয়ে রাখে, যাতে চেইন ছোট থাকে আর production-এ আবার পুরো কপির ভার না পড়ে।

Snapshot কি backup?

Cloud disk বা storage array-এর snapshot সেকেন্ডে নেওয়া যায়, কারণ সাধারণত তা copy-on-write — শুধু পরে বদলানো block আলাদা রাখে। দ্রুত ফেরার জন্য চমৎকার। কিন্তু snapshot প্রায়ই একই storage, একই account আর একই region-এর ওপর নির্ভর করে; storage নষ্ট হলে বা account-এর অধিকারধারী মুছলে snapshot-ও যায়। তাই নিয়ম: snapshot ততক্ষণ backup নয়, যতক্ষণ না তা স্বাধীন জায়গায় কপি হয়েছে। আর চলমান database-এর disk snapshot সাধারণত “crash-consistent” — হঠাৎ বিদ্যুৎ গেলে disk যেমন থাকত; একাধিক disk বা সার্ভিসের snapshot একই মুহূর্তের হবে, তার নিশ্চয়তা আলাদা করে দিতে হয়।

Point-in-time recovery — ঠিক ভুলের আগের মুহূর্তে ফেরা

ভিত্তি backup-এর সাথে database-এর পরিবর্তনের log — PostgreSQL-এর WAL বা MySQL-এর binlog — অবিরাম আলাদা storage-এ পাঠাতে থাকলে (continuous archiving) যেকোনো মুহূর্তে ফেরা যায়: backup restore করে log-কে ঠিক কাঙ্ক্ষিত সময় পর্যন্ত replay. একে বলে point-in-time recovery (PITR). নিচে একটি কাল্পনিক অনলাইন দোকানের ভুল DELETE থেকে ফেরা দেখুন।

  1. Base backupরবি 02:00+ WAL archive
  2. ভুল DELETE14:32:10replica-তেও
  3. থামা14:41production ছোঁয়া নয়
  4. লক্ষ্য খোঁজাLSN / xidঠিক আগের মুহূর্ত
  5. Restore + replayনতুন instance14:32:09 পর্যন্ত
  6. যাচাইcount, checksumঅ্যাপ দিয়ে দেখা
  7. মেরামতসারি ফেরতনতুন লেখা অক্ষত
orders টেবিলের খাতা
সময়
Production-এ সারি
Restore instance
  1. রবিবার রাত ২টা: ভিত্তি তৈরি। Full base backup নেওয়া হলো, তখন orders টেবিলে ৮,১২,৫০০টি সারি। এরপর থেকে প্রতি মিনিটে WAL-এর টুকরো আলাদা backup account-এ যাচ্ছে — এই ধারাটিই পরে যেকোনো মুহূর্তে ফেরার পথ।
  2. মঙ্গলবার ১৪:৩২:১০: ভুল DELETE. একজন প্রকৌশলী শুধু বাতিল হওয়া পুরোনো অর্ডার মুছতে চেয়েছিলেন, কিন্তু status-এর শর্ত বাদ পড়ল — ২০২৬-এর আগের সব ১,২০,০০০টি অর্ডার মুছে গেল, যার বেশিরভাগই বৈধ; সারি নামল ৭,২০,০০০-এ। Replica-গুলোতেও এক সেকেন্ডের মধ্যে একই DELETE পৌঁছে গেছে।
  3. ১৪:৪১: থামুন, তাড়াহুড়ো নয়। গ্রাহকের অভিযোগে ভুল ধরা পড়ল; incident ঘোষণা হলো। সবচেয়ে বড় ভুল হতো production-এর ওপরেই পুরোনো backup বসানো — তাতে ১৪:৩২-এর পরের সব বৈধ অর্ডার মুছে যেত। নতুন অর্ডার আসছে, সারি এখন ৭,২০,৬০০।
  4. ১৪:৫০: ঠিক কোথায় থামবেন? সময় দিয়ে থামা ঝুঁকির — একই সেকেন্ডে অন্য বৈধ লেখাও থাকতে পারে। Audit log আর WAL থেকে ভুল transaction-এর পরিচয় (xid 88412) বের হলো; লক্ষ্য ঠিক তার আগের অবস্থা। আলাদা একটি নতুন instance তৈরি হচ্ছে।
  5. ১৮:২০: Restore আর replay. নতুন instance-এ রবিবারের base backup বসল, WAL replay থামল ওই transaction-এর ঠিক আগে — ৮,৪০,০০০টি সারি, ১৪:৩২:০৯-এর হুবহু অবস্থা। সাড়ে তিন ঘণ্টার বেশিরভাগ গেল ডেটা নামানো আর replay-তে।
  6. ১৮:৪৫: যাচাই। মুছে যাওয়া id-এর সংখ্যা ১,২০,০০০ কি না, নমুনা অর্ডার রসিদের সাথে মেলে কি না, অ্যাপ দিয়ে খুলে দেখা হলো। যাচাই ছাড়া ফেরত দেওয়া মানে আরেকটি ভুলের ঝুঁকি।
  7. ১৯:৩০: শুধু হারানো অংশ ফেরত। পুরো database বদলানো হলো না; restore instance থেকে মুছে যাওয়া ১,২০,০০০টি সারি id ধরে production-এ কপি হলো। ফল: ৭,২২,৯৫০ + ১,২০,০০০ = ৮,৪২,৯৫০টি সারি — DELETE-এর আগের ৮,৪০,০০০ আর পরের ২,৯৫০টি নতুন অর্ডার, কেউ হারাল না।

ব্যবহারিক কনফিগ কেমন দেখায়, তার একটি উদাহরণ — PostgreSQL-এ restore-এর সময় কোথায় থামবেন তা বলা যায় সময়, transaction id বা LSN দিয়ে; MySQL-এ একই কাজ হয় mysqlbinlog-এর থামার সময় বা অবস্থান দিয়ে। খুঁটিনাটি সংস্করণভেদে আলাদা, অফিসিয়াল ডকুমেন্টেশন মিলিয়ে নিন।

restore_command = 'cp /restore/wal/%f %p'   # fetch WAL segments from the archive
recovery_target_xid = '88412'               # id of the bad transaction
recovery_target_inclusive = false           # stop just BEFORE that transaction
recovery_target_action = 'pause'            # pause: verify first, open later
# MySQL idea: mysqlbinlog --stop-position=... (or --stop-datetime=...)

Database-ই সব নয় — আর কী backup লাগে

  • Object storage: ছবি, ফাইল, export — versioning আর অন্য account-এ কপি (পর্ব ২৬); “এগারো nine durability” ভুল DELETE ঠেকায় না।
  • Infrastructure-এর বর্ণনা: সার্ভার, network আর permission-এর config কোডে লেখা থাকলে (infrastructure as code) নতুন region-এ পরিবেশ ঘণ্টায় বানানো যায়, হাতে বানাতে দিন লাগে।
  • Secrets আর encryption key: চাবি হারালে encrypted backup অর্থহীন — চাবির আলাদা নিরাপদ কপি লাগে (পর্ব ৫২)।
  • DNS zone, certificate, container image, CI/CD config — এগুলো ছাড়া restore করা ডেটা কাজে আসে না।
  • Queue আর stream: retention শেষে message মুছে যায় — Kafka-ধাঁচের log backup নয় (পর্ব ৩৩)।

৪ · “যে backup restore করে দেখেননি, তা backup নয়” — 3-2-1, immutable কপি আর মহড়া

3-2-1 নিয়ম

বহুল প্রচলিত 3-2-1 নিয়ম (আলোকচিত্রী Peter Krogh-এর নামে পরিচিত): ডেটার অন্তত ৩টি কপি (মূলটিসহ), ২ রকম আলাদা storage-এ, যার ১টি অন্য জায়গায়। Cloud-এ “অন্য জায়গা” মানে অন্য region আর অন্য account — একই account-এর অধিকারধারী বা তাঁর চুরি যাওয়া চাবি সব কপিই মুছতে পারে। অনেক নির্দেশিকা এখন 3-2-1-1-0 বলে: আরও ১টি কপি immutable বা offline, আর restore-যাচাইয়ে ০টি ত্রুটি; নামটি সর্বজনীন মান নয়, ধারণাটি কাজের।

বদলানো যায় না এমন কপি

Immutable backup এমন কপি, যা নির্দিষ্ট মেয়াদ পর্যন্ত কেউ — admin-ও — বদলাতে বা মুছতে পারে না; অনেক object store-এ এর জন্য object lock বা WORM (write once, read many) সুবিধা থাকে, নিয়ম প্রদানকারীভেদে আলাদা। আরও এক ধাপ air-gapped কপি — network থেকে বিচ্ছিন্ন, যেমন আলাদা রাখা tape. প্রতিরক্ষার নিয়ম সরল: backup লেখা আর মোছার অধিকার আলাদা হাতে; backup account-এ বহু-স্তরের যাচাই; মোছার অনুরোধে বিলম্ব আর সতর্কবার্তা। Ransomware আর চুরি যাওয়া credential থেকে সুরক্ষার বিস্তারিত পর্ব ৫২-এ।

Encryption আর retention

Backup-এ থাকে পুরো ডেটা, তাই চুরি হলে ক্ষতিও পুরো। Backup পাঠানোর পথে TLS আর রাখার জায়গায় encryption at rest দুটিই লাগে; চাবি থাকে আলাদা key management ব্যবস্থায়, নিয়মিত key rotation-সহ। সতর্কতা: চাবি যদি শুধু বিকল region-এই থাকে, অন্য region-এর backup খোলাই যাবে না।

Retention দুই দিক থেকে টানে। ছোট হলে নীরব corruption ধরা পড়ার আগেই শেষ ভালো কপি মুছে যায় — ভুল যদি তিন সপ্তাহ পরে ধরা পড়ে, সাত দিনের retention কোনো কাজে আসে না। লম্বা হলে খরচ বাড়ে, আর ব্যক্তিগত তথ্য মোছার আইনি দায় মানা কঠিন হয় — তাই কেউ কেউ crypto-shredding ব্যবহার করেন। প্রচলিত একটি ধাঁচ (grandfather-father-son): ৭টি দৈনিক, ৪টি সাপ্তাহিক আর ১২টি মাসিক কপি।

Restore-মহড়া — আসল পরীক্ষা

Backup job “সফল” লিখলেই কিছু প্রমাণ হয় না: ফাইলটি হয়তো ফাঁকা, হয়তো ভুল database-এর, হয়তো চাবি হারিয়েছে, হয়তো restore-এর script পুরোনো সংস্করণের। তাই restore drill নিয়মিত আর স্বয়ংক্রিয় হওয়া উচিত:

  1. নির্দিষ্ট সময় পরপর (ধরুন সাপ্তাহিক) সাম্প্রতিক backup একটি বিচ্ছিন্ন পরিবেশে restore.
  2. সারির সংখ্যা, checksum আর অ্যাপের স্বয়ংক্রিয় পরীক্ষা।
  3. প্রতিটি ধাপের সময় মেপে আসল RTO-RPO লেখা, লক্ষ্যের সাথে তুলনা।
  4. Backup না হলে, আকার হঠাৎ কমলে বা মহড়া ব্যর্থ হলে alert.
  5. বছরে কয়েকবার সেই মাপের restore, যা আসলে লাগতে পারে — একটি টেবিল, একজন গ্রাহক, পুরো region.

সবচেয়ে বিপজ্জনক ফাঁক: restore-এর নির্ভরতা। নতুন region-এ restore করতে কি সেই identity ব্যবস্থা লাগে যা বিকল region-এ ছিল? Runbook কি বিকল wiki-তে? Backup খোলার চাবি কি শুধু একজনের ল্যাপটপে? এগুলো মহড়াতেই ধরা পড়ে, কাগজে নয়।

৫ · Failover — টের পাওয়া থেকে failback পর্যন্ত

Backup অতীতে ফেরায়; failover বর্তমানকে বাঁচায় — বিকল অংশের কাজ একটি প্রস্তুত বিকল্পের হাতে তুলে দিয়ে। একটি database জোড়ার failover-এর সময়রেখা পর্ব ৫-এ দেখেছেন, আর replication-এর ভেতরে leader বদল পর্ব ২২-এ। এখানে মাপ বড়: পুরো একটি region.

স্বয়ংক্রিয় না মানুষের সিদ্ধান্ত?

একটি availability zone হারালে failover সাধারণত স্বয়ংক্রিয় — দূরত্ব কম, synchronous কপি সম্ভব, ভুলের দামও কম। Region-স্তরে অনেক দল ইচ্ছা করে মানুষকে সিদ্ধান্তে রাখে: ভুল করে region ছাড়লে async কপির শেষ কয়েক সেকেন্ডের লেখা হারায়, cache ঠান্ডা হয়, অন্য region-এ হঠাৎ দ্বিগুণ ভিড় আসে। তবে “মানুষ” মানে অনির্দিষ্ট আলোচনা নয় — আগে থেকে লেখা মানদণ্ড (ধরুন “error rate ১৫ মিনিট ধরে ৫০%-এর বেশি”) আর এক ক্লিকে চালানো যায় এমন প্রক্রিয়া।

  • টের পাওয়া: এক জায়গার health check যথেষ্ট নয় — সেই জায়গার network-ও বিকল হতে পারে। কয়েকটি এলাকার probe আর ব্যবহারকারীর আসল error rate মিলিয়ে সিদ্ধান্ত; gray failure আর failure detector-এর trade-off পর্ব ৪৪-এ।
  • পুরোনো primary-কে থামানো: বিকল মনে হওয়া region হয়তো শুধু বিচ্ছিন্ন; সে লেখা নিতে থাকলে split-brain. তাই promote-এর আগে fencing: পুরোনোটির লেখার অধিকার কাটা, আর প্রতিটি লেখায় বাড়তে থাকা fencing token বা epoch যাচাই (পর্ব ৪৩)। কে primary, তা নিজেই consensus-এর প্রশ্ন (পর্ব ৪২)।
  • ডেটার হিসাব: region পেরোনো কপি সাধারণত asynchronous, তাই promote-এর মুহূর্তের replication lag-ই সেই ঘটনার আসল RPO. পুরোনো primary-র না-কপি-হওয়া লেখাগুলো ফেলে না দিয়ে পরে মেলানোর জন্য আলাদা রাখতে হয়।
  1. বিপর্যয়t = 0region ক
  2. টের পাওয়া+3 minবহু জায়গা থেকে
  3. সিদ্ধান্ত+10 minrunbook-এর মানদণ্ড
  4. Fence+12 minepoch 7 বাতিল
  5. Promote + বাড়ানো+18 minregion খ
  6. Traffic+25 minDNS ওজন 0/100
  7. স্থির+40 minRTO পূরণ
  8. Failback৩ দিন পরেপরিকল্পিত
দুই region-এর খাতা
ঘড়ি
Region ক
Region খ
RPO / RTO খাতা
  1. t = ০: region ক-তে বিপর্যয়। একটি কাল্পনিক ticket booking সেবার primary region-এ বড় network বিভ্রাট — সব অনুরোধ ব্যর্থ। Region খ-তে warm standby: database replica আর পূর্ণ মাপের চার ভাগের এক ভাগ app server.
  2. ৩ মিনিট: টের পাওয়া। চারটি এলাকার probe-এর তিনটি আর ব্যবহারকারীর error rate বলছে region ক অচল। একটিমাত্র probe-এর কথায় চললে probe-এর নিজের সমস্যাতেই অকারণ failover হতো। এই ৩ মিনিটই MTTD; on-call প্রকৌশলীর কাছে ডাক গেল।
  3. ১০ মিনিট: সিদ্ধান্ত। Incident commander runbook-এর মানদণ্ড মিলিয়ে দেখলেন: বিভ্রাট চলছে, প্রদানকারীও স্বীকার করছে, ফেরার সময় অনিশ্চিত। Standby-র replication lag ৪ সেকেন্ড — অর্থাৎ এই failover-এ সর্বোচ্চ ৪ সেকেন্ডের লেখা হারাতে পারে। সিদ্ধান্ত: region ক খালি করা, ইংরেজিতে যাকে evacuate বলে।
  4. ১২ মিনিট: পুরোনোকে থামানো। Region ক-এর database credential বাতিল হলো, আর নতুন epoch ৮ চালু হওয়ায় epoch ৭-এর কোনো লেখা storage নেবে না। Region ক হঠাৎ ফিরে এলেও আর লিখতে পারবে না — split-brain-এর দরজা বন্ধ।
  5. ১৮ মিনিট: Promote আর বাড়ানো। Region খ-এর replica primary হলো; app server ৪টি থেকে ১৬টিতে। আগে থেকে capacity reserve না থাকলে এই ধাপ সবচেয়ে অনিশ্চিত — বিপর্যয়ের সময় অনেকেই একসাথে একই region-এ যন্ত্র চান (অংশ ৮)।
  6. ২৫ মিনিট: Traffic সরানো। Global DNS-এ ওজন ক = ০, খ = ১০০; TTL ৬০ সেকেন্ড। মিনিটখানেকে প্রায় ৯০%, কয়েক মিনিটে প্রায় ৯৫% traffic খ-তে, কিন্তু কিছু resolver আর client পুরোনো উত্তর ধরে রাখে — অংশ ৭-এর simulator এটাই মাপে।
  7. ৪০ মিনিট: স্থির। এই ঘটনায় RTO ৪০ মিনিট, RPO ৪ সেকেন্ড। কিন্তু এখন আর কোনো DR কপি নেই — খ একা; তাই প্রথম কাজ নতুন কপি তৈরি শুরু। ঘটনা এখনো “শেষ” নয়।
  8. ৩ দিন পরে: Failback. এটি আগের অবস্থায় ফেরা নয় — region ক-এর পুরোনো ডেটা আর বিশ্বাসযোগ্য নয়। তাকে খ-এর follower হিসেবে নতুন করে মেলানো হলো, না-কপি-হওয়া ৪ সেকেন্ডের লেখা আলাদা করে দেখা হলো, তারপর রাতে পরিকল্পিত switchover-এ ধাপে ধাপে traffic ফেরত। এবার কিছু হারায়নি।

দুটি region সমান মাপের হলে failback না করাও একটি বৈধ পছন্দ — খ-ই নতুন primary থাকে, ক হয় নতুন standby. প্রতিবার ফেরত যাওয়া মানে আরেকটি ঝুঁকির কাজ।

৬ · DR কৌশলের সিঁড়ি — backup & restore থেকে multi-site active-active

Cloud প্রদানকারীদের DR নির্দেশিকায় (যেমন AWS-এর প্রকাশিত DR whitepaper) চারটি কৌশলের নাম বহুল প্রচলিত। অন্য বই বা প্রতিষ্ঠানে একই ধারণা cold, warm আর hot site নামেও পাবেন; সীমারেখা সবখানে একরকম নয়।

রেস্তোরাঁর রান্নাঘরে আগুন লাগলে কী হবে? (১) রেসিপি আর মালের তালিকা মালিকের বাড়িতে — নতুন রান্নাঘর ভাড়া নিয়ে শুরু থেকে। (২) দ্বিতীয় রান্নাঘরে ফ্রিজ ভরা, চুলায় শুধু ছোট্ট pilot শিখা — বাবুর্চি এলেই রান্না। (৩) সেখানে দুজন বাবুর্চি ছোট পরিসরে রাঁধছেন — লোক বাড়ালেই পুরো দমে। (৪) দুই শাখাই প্রতিদিন পুরো দমে চলে, একটি বন্ধ হলে অন্যটি সব অতিথি নেয়।

  1. Backup & restore+5 এককশুধু কপি
  2. Pilot light+20 এককডেটা চালু
  3. Warm standby+45 এককছোট পূর্ণ stack
  4. Active-active+110 এককদুই region-ই চালু
region ক হারালে (খরচ: primary region-এর মাসিক খরচ = ১০০ একক, ধরা যাক)
Region খ-তে আগে থেকে
বিপর্যয়ে যা করতে হয়
সবচেয়ে খারাপ RPO
RTO (মহড়া-করা)
  1. Backup & restore. Backup & restore-এ দ্বিতীয় region-এ কিছুই চলে না — আছে শুধু backup আর পরিবেশ বানানোর কোড। খরচ সবচেয়ে কম (+৫ একক), কিন্তু ক্ষতি ৭৫ মিনিট পর্যন্ত লেখা আর ৭ ঘণ্টা বন্ধ। অংশ ২-এর B কৌশলের হিসাবই এখানে।
  2. Pilot light. Pilot light-এ ডেটার স্তর সবসময় চালু — database replica প্রতি মুহূর্তে কপি নিচ্ছে, তাই RPO এক মিনিটে নামল। App server বন্ধ, শুধু image আর config প্রস্তুত; চালু করে বাড়াতে প্রায় এক ঘণ্টা। খরচ +২০ একক।
  3. Warm standby. Warm standby-এ পুরো stack ছোট মাপে সবসময় চলে, এমনকি নিয়মিত পরীক্ষার traffic-ও নেয়। শুধু বাড়াতে হয়, তাই RTO ১৫ মিনিট, RPO ১২ সেকেন্ড। খরচ +৪৫ একক। চালু জিনিস যে কাজ করে, তা প্রতিদিন দেখা যায় — এটি বড় সুবিধা।
  4. Multi-site active-active. Active-active-এ দুই region-ই প্রতিদিন আসল ব্যবহারকারী সামলায়। একটি হারালে শুধু traffic সরে — RTO প্রায় ২ মিনিট, RPO কয়েক সেকেন্ড। খরচ +১১০ একক: দুই region-কেই একা পুরো ভার নেওয়ার মতো বড় রাখতে হয়, সাথে region-এর মাঝে ডেটা পাঠানোর খরচ আর conflict-এর জটিলতা (অংশ ৭)।
  5. সারসংক্ষেপ। বাঁ থেকে ডানে বিপর্যয়ের দিনের কাজ কমে, প্রতিদিনের খরচ বাড়ে। প্রশ্ন “সবচেয়ে ভালো কোনটি” নয় — “RPO আর RTO মেটায় এমন সবচেয়ে সস্তা কোনটি”। সংখ্যাগুলো মহড়া-করা অবস্থার; মহড়া ছাড়া ডানের কৌশলও ধীর হতে পারে।
// Four DR strategies. Assumed EXTRA monthly cost (primary region = 100 units),
// worst-case RPO and RTO in minutes. Change them to your own numbers.
const S = [
  { name: "backup & restore", cost: 5,   rpo: 75,   rto: 420 },  // copies in another region only
  { name: "pilot light",      cost: 20,  rpo: 1,    rto: 60  },  // DB replica on, app servers off
  { name: "warm standby",     cost: 45,  rpo: 0.2,  rto: 15  },  // full stack at ~25% size
  { name: "active-active",    cost: 110, rpo: 0.05, rto: 2   },  // two full regions + cross-region traffic
];
console.log("strategy          +cost/month  RPO(min)  RTO(min)");
for (const s of S) console.log(s.name.padEnd(18) + String(s.cost).padStart(8) +
  String(s.rpo).padStart(12) + String(s.rto).padStart(10));

const need = [                             // [label, max RPO, max RTO] in minutes
  ["monthly reports", 1440, 1440], ["online shop", 15, 240],
  ["ticket booking", 1, 30], ["payments", 1 / 6, 5], ["zero loss, 1 min", 0, 1],
];
console.log("\nrequirement        RPO<=     RTO<=   cheapest that meets it");
for (const [label, rpo, rto] of need) {
  const ok = S.filter(s => s.rpo <= rpo && s.rto <= rto).sort((a, b) => a.cost - b.cost);
  const pick = ok.length ? ok[0].name + " (+" + ok[0].cost + ")" : "none: needs synchronous replication";
  console.log(label.padEnd(19) + String(+rpo.toFixed(2)).padEnd(10) + String(rto).padEnd(8) + pick);
}

// Business view: expected yearly cost = 12 x DR cost + p(disaster) x (downtime + lost data)
const p = 0.1;                             // one region-scale disaster every ~10 years (assumed)
for (const [biz, perHourDown, perHourData] of [["reporting tool", 2, 1], ["payment service", 400, 3000]]) {
  const tot = S.map(s => [s.name, 12 * s.cost + p * (perHourDown * s.rto + perHourData * s.rpo) / 60]);
  tot.sort((a, b) => a[1] - b[1]);
  console.log("\n" + biz + ": " + tot.map(([n, v]) => n + " " + v.toFixed(0)).join(" | "));
}

আউটপুট:

strategy          +cost/month  RPO(min)  RTO(min)
backup & restore         5          75       420
pilot light             20           1        60
warm standby            45         0.2        15
active-active          110        0.05         2

requirement        RPO<=     RTO<=   cheapest that meets it
monthly reports    1440      1440    backup & restore (+5)
online shop        15        240     pilot light (+20)
ticket booking     1         30      warm standby (+45)
payments           0.17      5       active-active (+110)
zero loss, 1 min   0         1       none: needs synchronous replication

reporting tool: backup & restore 62 | pilot light 240 | warm standby 540 | active-active 1320

payment service: pilot light 285 | warm standby 551 | backup & restore 715 | active-active 1322

প্রথম অংশ প্রতিটি চাহিদার শর্ত-মেটানো সবচেয়ে সস্তা কৌশল বাছে। শেষ চাহিদা RPO 0 কোনো asynchronous কৌশল মেটায় না — লাগবে synchronous replication, প্রতিটি লেখায় দূরের round trip (পর্ব ৪০)। দ্বিতীয় অংশ ব্যবসার চোখে: বছরে বিপর্যয়ের সম্ভাবনা ০.১ ধরে বাৎসরিক DR খরচ আর প্রত্যাশিত ক্ষতির যোগফল। Reporting tool-এ backup & restore (62) সেরা। চমক payment service-এ: প্রত্যাশিত মানে pilot light (285) জেতে, active-active (1322) নয় — বিরল ঘটনার গড় ক্ষতি ছোট দেখায়। কিন্তু নিয়ন্ত্রকের নিয়ম, চুক্তির SLA আর “একবারেই প্রতিষ্ঠান শেষ” ধরনের ঝুঁকি গড়ে মাপা যায় না; সেগুলো সরাসরি RPO-RTO-র শর্ত হয়ে আসে, যেমন প্রথম অংশের payments সারি।

৭ · Multi-AZ, multi-region আর global traffic routing

Multi-AZ বনাম multi-region

Multi-AZ নকশায় একই region-এর কয়েকটি zone-এ কপি থাকে। Zone-গুলো কাছাকাছি (round trip প্রায়ই এক-দুই millisecond-এর ঘরে, প্রদানকারীভেদে আলাদা), তাই synchronous replication চলে — zone হারালেও লেখা হারায় না, failover স্বয়ংক্রিয়। বেশিরভাগ hardware আর ভবন-স্তরের বিপদ এতেই ঢাকা পড়ে। Multi-region ঢাকে region-ব্যাপী বিভ্রাট আর প্রাকৃতিক দুর্যোগ, কিন্তু round trip কয়েক দশ থেকে শত millisecond. তখন বাছাই দুটি: asynchronous কপি (RPO শূন্য নয়), নয়তো synchronous কপি আর প্রতিটি লেখায় সেই latency — পর্ব ৪০-এর PACELC-এর latency বনাম consistency-র দর-কষাকষি। সাথে আসে data residency: আইন অনুযায়ী কিছু ডেটা দেশের বাইরে রাখা না-ও চলতে পারে।

দুই region-এর DR নকশা — কোন কপি কোথায়

Primary region, warm-standby region, global DNS and a separate backup account

দুই region-এর DR নকশা: global DNS, primary region, standby region আর আলাদা backup account ব্যবহারকারী Global DNS / GSLB health check · TTL 60 s · বা anycast 100% 0% failover-এ 100% Region ক · primary Region খ · standby App × 8 AZ-1 · AZ-2 · AZ-3 App × 2 (warm) দরকারে বাড়ে DB primary DB sync standby DB replica read-only async replication · lag কয়েক সেকেন্ড পূর্ণ capacity প্রায় 25% capacity backup: রাতে full, প্রতি মিনিটে WAL আলাদা backup account · তৃতীয় region full + incremental + WAL archive object lock (বদলানো যায় না) · encrypted
ছবি ৫১.১ — zone হারালে sync standby, region হারালে region খ, আর ভুল বা ক্ষতিকর মোছা হলে আলাদা account-এর বদলানো যায় না এমন backup; তিনটি আলাদা বিপদের তিনটি আলাদা উত্তর।

Active-passive বনাম active-active — একাধিক region-এ

ছবির নকশাটি active-passive: সব লেখা এক region-এ — সহজ, conflict নেই, কিন্তু দূরের ব্যবহারকারীর প্রতিটি লেখায় latency, আর standby প্রায় অলস। Active-active-এ দুই region-ই লেখা নেয়, তাই একই ডেটা দুই জায়গায় একসাথে বদলাতে পারে। প্রচলিত তিন পথ: (১) প্রতিটি ব্যবহারকারী বা key-এর একটি “বাড়ির” region — conflict এড়ানো; (২) দুই দিকেই লেখা নিয়ে পরে conflict resolution বা CRDT (দুটিই পর্ব ৪৬-এ); (৩) region পেরোনো consensus — consistency থাকে, প্রতিটি লেখায় latency যায় (পর্ব ৪০, ৪২)। আর capacity: যেকোনো একটি region পুরো ভার নিতে হলে স্বাভাবিক দিনে প্রতিটি ৫০%-এর কম ব্যস্ত থাকবে, নইলে failover-এর মুহূর্তে বাকিটি ভিড়ে ভেঙে পড়ে (পর্ব ১৮)।

Global traffic routing — DNS আর anycast

ব্যবহারকারীকে কোন region-এ পাঠাবেন, সেই কাজ global load balancing-এর (পর্ব ১৪)। সবচেয়ে প্রচলিত পথ DNS failover: health check বিকল region দেখলে DNS উত্তর থেকে তাকে সরায়। এর গতি বাঁধা TTL-এ — resolver আগের উত্তর মেয়াদ পর্যন্ত মনে রাখে (সবচেয়ে খারাপ ক্ষেত্রের হিসাব পর্ব ৭-এ)। কিন্তু সবাই TTL মানে না: কিছু resolver খুব ছোট TTL বাড়িয়ে নেয়, কিছু client নিজের মতো বেশি সময় রাখে, আর খোলা keep-alive connection ভাঙার আগে DNS আবার জিজ্ঞেসই করে না (আচরণ সংস্করণভেদে আলাদা)। নিচের simulator-এ ২,০০০টি resolver; ৯০% TTL মানে, ৭% ছোট TTL বাড়িয়ে অন্তত ৩০০ সেকেন্ড রাখে, ৩% দুই ঘণ্টা রাখে — এই অনুপাত শেখার জন্য ধরা, মাপা নয়।

// DNS failover: share of users still sent to the dead region, for three TTLs.
function rng(seed) {                                   // mulberry32: seeded, repeatable
  return () => { seed = seed + 0x6D2B79F5 | 0;
    let t = Math.imul(seed ^ seed >>> 15, 1 | seed);
    t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
    return ((t ^ t >>> 14) >>> 0) / 4294967296; };
}
const CHANGE = 60;                         // s: health check notices + DNS record now points to region B
const T = [0, 60, 120, 300, 900, 3600, 7200];
console.log("TTL    " + T.map(t => (t + "s").padStart(7)).join(""));
for (const TTL of [60, 300, 3600]) {
  const rand = rng(51);                    // same resolver population for every TTL
  let total = 0; const stuck = T.map(() => 0);
  for (let r = 0; r < 2000; r++) {
    const users = 1 + Math.floor(rand() * 100);        // users behind this resolver
    const kind = rand();                   // 90% obey TTL, 7% raise it to >= 300 s, 3% keep 2 h
    const hold = kind < 0.90 ? TTL : kind < 0.97 ? Math.max(TTL, 300) : 7200;
    let expiry = hold * (1 - rand());      // cached the old answer some time ago
    while (expiry < CHANGE) expiry += hold;  // re-asked before the change: got the OLD IP again
    total += users;
    T.forEach((t, i) => { if (t < expiry) stuck[i] += users; });
  }
  console.log(String(TTL).padEnd(7) + stuck.map(s => (100 * s / total).toFixed(1).padStart(6) + "%").join(""));
}

আউটপুট (প্রতিটি ঘরে: বিকল region-এ তখনো যাওয়া ব্যবহারকারীর অংশ):

TTL         0s    60s   120s   300s   900s  3600s  7200s
60      100.0% 100.0%   9.2%   4.9%   3.2%   2.3%   0.0%
300     100.0% 100.0%  81.6%  22.6%   3.2%   2.3%   0.0%
3600    100.0% 100.0%  98.8%  94.4%  77.1%   3.7%   0.0%

প্রথম ৬০ সেকেন্ড সবাই বিকল region-এ — বিকলতা ধরা আর DNS বদলের সময়। TTL ৬০-এ দুই মিনিটে ৯০% সরে যায়, কিন্তু একটি “লেজ” থাকে: ৯০০ সেকেন্ডেও 3.2%, এক ঘণ্টায় 2.3% — TTL না মানা ৩% resolver-এর মানুষ। TTL ৩,৬০০-এ ১৫ মিনিট পরেও 77.1% আটকে, DR-এর জন্য প্রায় অকেজো। ছোট TTL দ্রুত সরায় (বিনিময়ে authoritative DNS-এ বেশি প্রশ্ন), কিন্তু শূন্যে নামায় না; তাই অ্যাপে retry-র সময় অন্য region-এর ঠিকানা চেষ্টা, বা DNS বদল ছাড়াই region বদলানোর ব্যবস্থা লাগে।

সেই ব্যবস্থার একটি anycast: একই IP ঠিকানা কয়েকটি জায়গা থেকে BGP-তে ঘোষণা হয়, routing ব্যবহারকারীকে কাছেরটিতে নেয়। একটি জায়গা ঘোষণা তুলে নিলে routing নিজেই বাকিগুলোতে সরে — DNS cache-এর প্রশ্নই নেই। Routing স্থির হতে সাধারণত সেকেন্ড থেকে কয়েক মিনিট লাগে (নেটওয়ার্কভেদে আলাদা), আর চলমান TCP connection ভেঙে যেতে পারে। তাই অনেক নকশায় সামনে থাকে anycast-এর edge বা global load balancer, যা পেছনে health check দেখে region বাছে — পর্ব ১৭-এর CDN-এর মতো।

কোন নকশায় বছরে কত downtime?

একই কাল্পনিক ঘটনাপ্রবাহে তিন নকশা: single-AZ, multi-AZ (এক region-এর তিন zone), আর দুই region-এর প্রতিটিতে multi-AZ, অর্থাৎ multi-region. ধরা যাক: zone-বিভ্রাট বছরে ০.৫ বার (গড়ে ৩ ঘণ্টা), region-ব্যাপী বিভ্রাট ০.০৫ বার (গড়ে ৪ ঘণ্টা), সবখানে পৌঁছানো খারাপ deploy ২ বার (গড়ে ৩০ মিনিট)। Zone failover ২ মিনিট, region failover ১৫ মিনিট, আর ১০% ক্ষেত্রে region failover নিজেই ব্যর্থ।

// Yearly downtime of three layouts under the same (assumed) incidents. 20,000 simulated years.
function rng(seed) {                                   // mulberry32: seeded, repeatable
  return () => { seed = seed + 0x6D2B79F5 | 0;
    let t = Math.imul(seed ^ seed >>> 15, 1 | seed);
    t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
    return ((t ^ t >>> 14) >>> 0) / 4294967296; };
}
const rand = rng(51);
const count = rate => { let k = 0, s = -Math.log(1 - rand()); while (s < rate) { k++; s -= Math.log(1 - rand()); } return k; };
const dur = mean => -mean * Math.log(1 - rand());     // random duration with this average (h)
const ZONE = [0.5, 3], REGION = [0.05, 4], DEPLOY = [2, 0.5];   // [per year, mean hours]
const AZ_FO = 2 / 60, REGION_FO = 15 / 60, FO_FAILS = 0.1;      // failover times (h), failover failure
const names = ["single-AZ", "multi-AZ", "multi-region"], Y = 20000, down = names.map(() => []);
for (let y = 0; y < Y; y++) {
  const d = [0, 0, 0];
  for (let i = count(ZONE[0]); i > 0; i--) { const x = dur(ZONE[1]);
    d[0] += x; d[1] += Math.min(x, AZ_FO); d[2] += Math.min(x, AZ_FO); }
  for (let i = count(REGION[0]); i > 0; i--) { const x = dur(REGION[1]);
    d[0] += x; d[1] += x; d[2] += rand() < FO_FAILS ? x : Math.min(x, REGION_FO); }
  for (let i = count(DEPLOY[0]); i > 0; i--) { const x = dur(DEPLOY[1]);
    d[0] += x; d[1] += x; d[2] += x; }                // a bad push hits every copy
  d.forEach((v, k) => down[k].push(v));
}
console.log("layout        mean h/yr  availability  worst 5% of years >=");
names.forEach((n, k) => {
  const a = down[k].sort((p, q) => p - q), mean = a.reduce((s, v) => s + v, 0) / Y;
  console.log(n.padEnd(14) + mean.toFixed(2).padStart(8) + (100 * (1 - mean / 8760)).toFixed(3).padStart(13) + "%" +
    (a[Math.floor(0.95 * Y)].toFixed(1) + " h").padStart(12));
});

আউটপুট:

layout        mean h/yr  availability  worst 5% of years >=
single-AZ         2.72       99.969%       9.7 h
multi-AZ          1.21       99.986%       3.6 h
multi-region      1.05       99.988%       3.0 h

Multi-AZ downtime প্রায় অর্ধেকে নামায় (2.72 → 1.21 ঘণ্টা), কারণ বছরে সবচেয়ে ঘন ঘটনা — zone হারানো — মাত্র ২ মিনিটে সামলায়। কিন্তু দ্বিতীয় region-এর পুরো খরচ দিয়ে লাভ হলো মাত্র 1.21 → 1.05. কেন? বাকি ১ ঘণ্টার প্রায় সবটাই খারাপ deploy — বছরে ২ × ০.৫ = ১ ঘণ্টা — যা দুই region-এ একসাথে পৌঁছায়। সূত্রেও মেলে: প্রত্যাশিত মান = হার × গড় সময়, যেমন single-AZ-এ ০.৫ × ৩ + ০.০৫ × ৪ + ২ × ০.৫ = ২.৭ ঘণ্টা। শিক্ষা: region যোগের আগে দেখুন downtime আসলে কোথা থেকে আসে; এখানে ধাপে ধাপে deploy (পর্ব ৫৩) দ্বিতীয় region-এর চেয়ে বেশি লাভ দেবে — অনুশীলন ৩-এ যাচাই করবেন।

৮ · Blast radius, cell আর static stability

আগের simulator-এর শিক্ষা এখানে নকশা হয়ে আসে: সবচেয়ে বড় ঝুঁকি প্রায়ই সেই ঘটনা, যা সব কপিতে একসাথে পৌঁছায় (correlated failure, পর্ব ৫)। প্রতিরক্ষার লক্ষ্য তাই blast radius ছোট রাখা — একটি ভুল যেন একসাথে অল্প অংশকে ছোঁয়।

Cell-ভিত্তিক নকশা

Cell-based architecture-এ পুরো সেবাকে কয়েকটি স্বাধীন, সম্পূর্ণ কপিতে (cell) ভাগ করা হয় — প্রতিটির নিজের app, cache আর database, প্রতিটি নির্দিষ্ট একদল ব্যবহারকারীর। সামনে খুব পাতলা একটি router শুধু বলে “এই ব্যবহারকারী কোন cell-এর”। নতুন সংস্করণ প্রথমে একটি cell-এ যায়; ভুল থাকলে ক্ষতি সেই cell-এর ব্যবহারকারীদের মধ্যে সীমিত। ঢাকার যানজটের ভাষায়: এক মোড়ে সব গাড়ি আটকানোর বদলে অনেক আলাদা রাস্তা — একটিতে দুর্ঘটনা হলে বাকিগুলো চলে। দাম: router সবার পথে বসে, তাই তাকে সবচেয়ে সরল রাখতে হয়; আর একাধিক cell ছোঁয়া কাজ (আরেক cell-এর কাউকে টাকা পাঠানো) জটিল হয়।

Static stability — বিপদের দিনে নতুন কিছু না চাওয়া

বিপর্যয়ের দিন সবচেয়ে অনির্ভরযোগ্য কাজ হলো পরিবর্তন করা: নতুন সার্ভার চাওয়া, config বদলানো, DNS-এ লেখা। এগুলো চলে cloud-এর পরিচালনা-ব্যবস্থার API দিয়ে, যা ব্যবহারকারীর অনুরোধ বহনকারী অংশের চেয়ে আলাদা, আর বড় বিভ্রাটে নিজেই ধীর বা অচল হতে পারে — হাজারো গ্রাহক একসাথে একই region-এ যন্ত্র চাইছেন। Static stability ধারণাটির (Amazon-এর প্রকাশিত Builders’ Library-র একটি প্রবন্ধে বিস্তারিত) মূল কথা: কোনো অংশ বিকল হলে বাকি সিস্টেম কোনো পরিবর্তন না করেই চলতে থাকবে। যেমন, তিন zone-এর প্রতিটিতে আগে থেকেই এত capacity যে একটি zone গেলে বাকি দুটিই যথেষ্ট — autoscaling-এর ওপর নির্ভর নয়। একই কারণে DR-এর জন্য দরকারি capacity অনেকে আগে থেকে reserve রাখেন।

মূল ধারণা

Recovery-র নির্ভরতার তালিকা বানান। Failover বা restore করতে কী কী চালু থাকা লাগে — identity ব্যবস্থা, secrets, CI/CD, monitoring, status page, chat? এদের কোনোটি বিকল region-এ থাকলে recovery নিজেই আটকে যায়। জরুরি “break-glass” account, অন্য জায়গার status page আর offline runbook সস্তা বীমা। পর্ব ১-এর ভাবনার প্রশ্নে দেখা ২০২১ সালের বড় বিভ্রাটটিও মনে করুন: মেরামতের সরঞ্জাম নিজেই বিকল network-এর ওপর নির্ভর করছিল।

৯ · DR পরীক্ষা — runbook, game day আর incident command

পরীক্ষা না করা DR পরিকল্পনা একটি অনুমান মাত্র। প্রস্তুতির তিনটি হাতিয়ার:

📘 Runbook

Runbook: ধাপে ধাপে লেখা নির্দেশ — কোন মানদণ্ডে শুরু, কে করবেন, কোন কমান্ড, প্রতিটি ধাপের পর কী যাচাই, কোথায় থামবেন, কীভাবে ফেরাবেন। লক্ষ্য: রাত ৩টায় ঘুমচোখে নতুন কেউও যেন ভুল না করেন।

বিকল region-এর বাইরে রাখা

🎯 Game day

Game day: পরিকল্পিত মহড়া। শুরু টেবিলে বসে কাগজে ঘটনা চালানো দিয়ে; তারপর staging-এ restore; শেষে production-এ সত্যিই একটি zone বা region থেকে traffic সরানো — ভিড় কম সময়ে, ফেরার পথ খোলা রেখে।

ছোট থেকে বড়

🧯 Incident command

বড় ঘটনায় একজন incident commander সমন্বয় করেন — নিজে কমান্ড চালান না; আলাদা কেউ কাজ করেন, আলাদা কেউ গ্রাহক ও দলকে জানান। বিস্তারিত আর postmortem পর্ব ৫০-এ।

ভূমিকা আগে ঠিক করা

মহড়ার উদ্দেশ্য সাফল্য দেখানো নয়, ফাঁক খোঁজা: runbook-এ বাদ পড়া ধাপ, মেয়াদোত্তীর্ণ চাবি, ছোট পড়া quota, কেউ না জানা নির্ভরতা। শেষে আসল RTO-RPO লিখে লক্ষ্যের সাথে তুলনা, আর ফাঁকগুলো কাজের তালিকায়। ইচ্ছা করে নিয়ন্ত্রিত ব্যর্থতা ঘটিয়ে সহনশীলতা যাচাইয়ের চর্চাকে বলে chaos engineering — ছোট মাপে, পর্যবেক্ষণসহ, থামানোর বোতাম হাতে রেখে।

Netflix ২০১০–২০১১ সালে “Chaos Monkey”-র কথা প্রকাশ্যে লেখে — কাজের সময়ে এলোমেলোভাবে production সার্ভার বন্ধ করার টুল, যাতে প্রতিটি দল সার্ভার হারানো সহ্য করার নকশা করে; পরে ধারণাটি পুরো region খালি করার মহড়া পর্যন্ত বাড়ে। Google-এর বার্ষিক DiRT মহড়া নিয়ে Kripa Krishnan-এর ২০১২ সালের ACM Queue প্রবন্ধ “Weathering the Unexpected” দেখায়, মহড়ায় মানুষ আর প্রক্রিয়াও পরীক্ষা হয়। Incident command-এর ধাঁচ এসেছে ১৯৭০-এর দশকে যুক্তরাষ্ট্রে দাবানল সামলানোর Incident Command System থেকে।

আরও গভীরে: Google-এর Site Reliability Engineering বইয়ের (২০১৬) “Data Integrity” অধ্যায় backup নয়, restore-কে লক্ষ্য ধরার যুক্তি দেয়, আর ২০১১ সালের একটি Gmail ঘটনার কথা বলে, যেখানে software ত্রুটিতে অল্প কিছু ব্যবহারকারীর mail মুছে গেলে tape backup থেকে ফেরানো হয় — replica-তে ভুলটি পৌঁছে গিয়েছিল। AWS-এর DR whitepaper চার কৌশলের বিস্তারিত তুলনা দেয়; ২০১৮ সালের একটি re:Invent বক্তৃতায় (Peter Vosshall) cell দিয়ে blast radius কমানোর অভিজ্ঞতা বর্ণিত।

পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:

  • RPO আর RTO-র পার্থক্য কী? — RPO: সর্বোচ্চ কত সময়ের ডেটা হারানো চলে (অতীতের দিকে); RTO: সর্বোচ্চ কতক্ষণ সেবা বন্ধ থাকা চলে (ভবিষ্যতের দিকে)।
  • Replication থাকলে backup লাগে কেন? — Replication ভুল DELETE, corruption আর ransomware-ও কপি করে; backup দেয় অতীতের নির্দিষ্ট অবস্থায় ফেরার পথ।
  • চার DR কৌশল আর তাদের trade-off? — Backup & restore, pilot light, warm standby, active-active; ডানে গেলে RPO-RTO কমে, খরচ ও জটিলতা বাড়ে।
  • DNS failover কেন ধীর, বিকল্প কী? — Resolver আর client TTL পর্যন্ত (কেউ কেউ তারও বেশি) পুরোনো উত্তর রাখে; বিকল্প anycast, global load balancer আর client-side retry.
  • Region failover-এ split-brain কীভাবে ঠেকাবেন? — Promote-এর আগে পুরোনো primary-র লেখার অধিকার কাটা আর epoch বা fencing token দিয়ে পুরোনো লেখা প্রত্যাখ্যান।

১০ · AI-এর যুগে DR পরিকল্পনা যাচাই

“আমার অ্যাপের জন্য একটি disaster recovery plan লিখে দাও” বললে AI কয়েক সেকেন্ডে সুন্দর শিরোনামে ভরা একটি দলিল দেবে। কিন্তু DR-এর প্রশ্নে কিছু ভুল AI প্রায় নিয়ম করে করে:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
“Multi-region active-active, Kafka আর Kubernetes দিন”RPO-RTO না জেনেই সবচেয়ে দামি কৌশল; ছোট সেবায় অকারণ জটিলতা, আর নতুন প্রতিটি অংশ নিজেই ব্যর্থ হতে পারেআগে প্রতিটি অংশের RPO-RTO লিখুন, তারপর সবচেয়ে সস্তা মেটানো কৌশল
Restore-এর সময়ের হিসাবে ভুলTB আর Tb, MB/s আর Mbps গুলিয়ে ফেলে; মানুষের সিদ্ধান্ত আর যাচাইয়ের সময় বাদ দেয়আকার ÷ গতি নিজে হিসাব করুন; RTO-র প্রতিটি ধাপ যোগ করুন
“Replication আছে, তাই RPO শূন্য”Region পেরোনো কপি সাধারণত async; আর ভুল DELETE-ও কপি হয়replication-এর ধরন আর lag জিজ্ঞেস করুন; PITR আছে কি না দেখুন
Failover-এর পর “ডেটা consistent থাকবে”ACID-এর consistency আর replica-দের consistency (CAP অর্থে) আলাদা; split-brain আর হারানো লেখার কথা নেইfencing, epoch আর না-কপি-হওয়া লেখার কী হবে — প্রশ্ন করুন
বানানো সীমা আর দামকোনো পণ্যের backup সীমা, DNS TTL-এর আচরণ বা cross-region দাম আত্মবিশ্বাসের সাথে লেখেপ্রদানকারীর অফিসিয়াল ডকুমেন্টেশন
Backup আর মহড়ার কথা নেইশুধু failover; restore-মহড়া, immutable কপি আর চাবির কপি বাদঅংশ ৪ ধরে failure-mode review

AI-কে কাজে লাগান খসড়া আর ফাঁক খোঁজায় — সংখ্যা আর সীমা নিজে দিন, অনুমান আলাদা করে চান:

আমি একটি কাল্পনিক অনলাইন ticket booking সেবার DR পরিকল্পনা করছি। তথ্য: database 2 TB, দিনে প্রায় 80 GB পরিবর্তন; লক্ষ্য: বুকিং-এর RPO 1 মিনিট, RTO 30 মিনিট; ছবি আর PDF-এর RPO 24 ঘণ্টা। এখন: এক region, তিন zone, রাতে একবার snapshot একই account-এ। ১. প্রতিটি অংশের জন্য চার DR কৌশলের কোনটি লক্ষ্য মেটায় — সবচেয়ে সস্তাটি কারণসহ বলো। ২. 2 TB restore-এ 300 MB/s গতিতে কত সময় লাগবে — ধাপে ধাপে হিসাব দেখাও, আর RTO-র বাকি ধাপ (টের পাওয়া, সিদ্ধান্ত, যাচাই, traffic) আলাদা করে যোগ করো। ৩. বর্তমান ব্যবস্থার সবচেয়ে বড় পাঁচটি ঝুঁকি বলো: ভুল DELETE, ransomware, region বিভ্রাট, চাবি হারানো, restore-এর নির্ভরতা। ৪. Region failover-এর runbook-এর কঙ্কাল দাও: মানদণ্ড, fencing, promote, DNS, যাচাই, failback. ৫. কোনো cloud পণ্যের সীমা, দাম বা SLA নিজে থেকে লিখবে না; দরকার হলে লিখবে "অফিসিয়াল ডকুমেন্টেশনে যাচাই করতে হবে"। প্রতিটি অনুমান আলাদা তালিকায় দাও।

AI-এর দেওয়া DR পরিকল্পনা হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১Backup ছিল, তবু ডেটা হারাল — ২০২১ সালের OVHcloud-এর Strasbourg অগ্নিকাণ্ড “অন্য জায়গা” সম্পর্কে কী শেখায়?

২০২১ সালের ১০ মার্চ ভোররাতে ইউরোপের বড় hosting প্রতিষ্ঠান OVHcloud-এর ফ্রান্সের Strasbourg ক্যাম্পাসে আগুন লাগে। প্রকাশিত প্রতিবেদন অনুযায়ী SBG2 নামের একটি data center ভবন প্রায় পুরো পুড়ে যায়, পাশের একটি ভবনের অংশও ক্ষতিগ্রস্ত হয়, আর নিরাপত্তার কারণে ক্যাম্পাসের বাকি ভবনগুলোও কয়েক দিন বন্ধ রাখতে হয়। হাজারো ওয়েবসাইট আর সেবা অচল হয়।

সবচেয়ে কষ্টের খবর এসেছিল সেই গ্রাহকদের কাছ থেকে, যাঁদের backup ছিল — কিন্তু একই ক্যাম্পাসে, কোনো কোনো ক্ষেত্রে একই ভবনে। কাগজে তাঁদের “দুটি কপি” ছিল; আগুনের চোখে দুটিই একটি failure domain. পাশাপাশি দুটি ভবন বিদ্যুৎ বা সার্ভার নষ্ট হওয়ার বিরুদ্ধে আলাদা, কিন্তু আগুন, বন্যা বা ক্যাম্পাস-জুড়ে নিরাপত্তাজনিত বন্ধের বিরুদ্ধে নয়।

শিক্ষাগুলো সরাসরি এই পর্বের সাথে মেলে। প্রথম, 3-2-1-এর “১টি অন্য জায়গায়” মানে এমন দূরত্ব, যা আপনার ভাবা বিপদগুলোর বাইরে — এক শহরের দুই প্রান্ত ভূমিকম্প বা বন্যার বিরুদ্ধে যথেষ্ট না-ও হতে পারে। দ্বিতীয়, managed backup কেনার সময় চুক্তিতে দেখুন backup ঠিক কোথায় থাকে; “backup অন্তর্ভুক্ত” কথাটি জায়গা বলে না। তৃতীয়, backup থাকলেই হয় না, restore করার জায়গাও লাগে: বিপর্যয়ের দিনে একসাথে হাজারো গ্রাহক নতুন সার্ভার চাইলে অন্য data center-এও capacity টান পড়তে পারে — static stability আর আগে থেকে reserve-এর যুক্তি এখানেই।

বাংলাদেশে যাঁরা নিজস্ব server room বা স্থানীয় data center চালান, তাঁদের জন্য একই প্রশ্ন: আগুন নেভানোর ব্যবস্থা কী, ব্যাটারি কোথায়, বন্যার পানি কত উঁচুতে উঠতে পারে, আর দ্বিতীয় কপি কি অন্তত আলাদা ভবনে, আলাদা এলাকায়?

মূল উপলব্ধি: কপির সংখ্যা নয়, কপিগুলো একসাথে কোন বিপদে মরে না — সেটাই আসল প্রশ্ন; “অন্য জায়গা”-র সংজ্ঞা আসে বিপদের তালিকা থেকে।

প্র ০২একটি চুরি যাওয়া পাসওয়ার্ড কীভাবে একটি প্রতিষ্ঠানের backup-সহ সব মুছে দিতে পারে? ২০১৪ সালের Code Spaces থেকে প্রতিরক্ষার শিক্ষা কী?

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

প্রযুক্তির দিক থেকে কোনো ডিস্ক নষ্ট হয়নি, কোনো region বিকল হয়নি। Replication, multi-AZ, এমনকি backup — সব ছিল। ব্যর্থ হয়েছিল অধিকারের নকশা: যে এক জোড়া চাবি দিয়ে সেবা চালানো যায়, সেই চাবি দিয়েই তার বীমাও মোছা যেত। এর blast radius ছিল গোটা প্রতিষ্ঠান। অংশ ১-এর টেবিলের ভাষায়, এটি ছিল “ইচ্ছাকৃত মোছা” — যার বিরুদ্ধে replication বা multi-AZ কোনো কাজেই আসে না, কারণ মোছার আদেশ সব কপিতেই বৈধ আদেশ হিসেবে পৌঁছায়।

প্রতিরক্ষার শিক্ষা কয়েকটি স্তরে। এক, backup রাখুন আলাদা account-এ, যেখানে production-এর কোনো পরিচয় শুধু লিখতে পারে, মুছতে বা বদলাতে পারে না। দুই, object lock বা WORM দিয়ে নির্দিষ্ট মেয়াদ পর্যন্ত কপি অপরিবর্তনীয় রাখুন — admin-এর হাতেও নয়। তিন, সবচেয়ে ক্ষমতাধর account-গুলোতে বহু-স্তরের যাচাই, প্রতিদিনের কাজে সেগুলো ব্যবহার না করা, আর ব্যাপক মোছা বা অধিকার-বদলের ঘটনায় সাথে সাথে সতর্কবার্তা। চার, offline বা ভিন্ন প্রদানকারীর কাছে অন্তত একটি কপি। এগুলোর বিস্তারিত নিরাপত্তা-নকশা পর্ব ৫২-এ।

মূল উপলব্ধি: backup-এর শত্রু শুধু প্রকৃতি আর হার্ডওয়্যার নয়, ভুল হাতে যাওয়া অধিকারও; যে চাবি সেবা চালায়, সেই চাবি দিয়ে যেন বীমা মোছা না যায়।

প্র ০৩২০১৭ সালের NotPetya-র আঘাতে একটি বৈশ্বিক জাহাজ কোম্পানির পুনরুদ্ধার কেন একটি দূরের অফিসের একটিমাত্র কপির ওপর নির্ভর করেছিল?

২০১৭ সালের জুনে NotPetya নামের একটি ক্ষতিকর software বিশ্বের বহু প্রতিষ্ঠানে ছড়ায়। দেখতে ransomware-এর মতো হলেও বিশ্লেষকেরা পরে দেখান, এটি কার্যত ডেটা ধ্বংসকারী — টাকা দিলেও ফেরার পথ ছিল না। আক্রান্তদের একটি ছিল ডেনমার্কের জাহাজ ও বন্দর-পরিচালনার প্রতিষ্ঠান Maersk, যার বিশ্বজুড়ে বহু বন্দর-টার্মিনালের কাজ কয়েক দিন ব্যাহত হয়েছিল।

Wired পত্রিকার ২০১৮ সালের একটি বিস্তারিত প্রতিবেদন অনুযায়ী, প্রতিষ্ঠানটির হাজারো কম্পিউটার আর সার্ভার কয়েক ঘণ্টার মধ্যে অকেজো হয়। সবচেয়ে বড় সমস্যা ছিল লগইন আর অধিকারের কেন্দ্রীয় ব্যবস্থা (domain controller) — এর অনেকগুলো কপি বিভিন্ন দেশে replicate হতো, আর সবগুলোই একসাথে মুছে যায়। প্রতিবেদনটি জানায়, শেষ পর্যন্ত একটি কপি পাওয়া যায় ঘানার একটি অফিসে, যা ঘটনার সময় স্থানীয় বিদ্যুৎ-বিভ্রাটে network-এর বাইরে ছিল; সেই কপি থেকেই পুনর্গঠন শুরু হয়।

এই ঘটনা থেকে তিনটি শিক্ষা। প্রথম, replication এখানে রক্ষা নয়, বিপদ ছড়ানোর পথ — সব কপি একই network-এ, একই বিশ্বাসের সম্পর্কে যুক্ত থাকায় একই আঘাতে মরে। দ্বিতীয়, offline বা air-gapped কপি তাত্ত্বিক বিলাস নয়; এখানে ভাগ্যক্রমে যা হয়েছিল, তা পরিকল্পনা করে রাখা যায়। তৃতীয়, পুনরুদ্ধারের একটি ক্রম আছে: identity ব্যবস্থা না ফিরলে কেউ লগইন করতে পারেন না, তাই বাকি কোনো সার্ভারও restore হয় না। DR পরিকল্পনায় তাই নির্ভরতার গ্রাফ এঁকে আগে ঠিক করুন — কোনটি প্রথম, কোনটি পরে — আর সেই প্রথম অংশগুলোর আলাদা, বিচ্ছিন্ন কপি রাখুন।

মূল উপলব্ধি: যে কপি network-এ যুক্ত আর একই অধিকারে চলে, সে একই আঘাতে মরতে পারে; পুনরুদ্ধারের ক্রমের প্রথম ইটগুলোর বিচ্ছিন্ন কপিই শেষ ভরসা।

প্র ০৪Backup আর point-in-time recovery থাকার পরও কিছু গ্রাহকের সেবা ফেরাতে প্রায় দুই সপ্তাহ লাগল কেন? ২০২২ সালের Atlassian-এর ঘটনা “restore-এর মাপ” সম্পর্কে কী বলে?

২০২২ সালের এপ্রিলে Atlassian-এর cloud সেবায় একটি রক্ষণাবেক্ষণের কাজ চলছিল — একটি পুরোনো সুবিধার ডেটা মোছা। প্রতিষ্ঠানটির প্রকাশিত post-incident review অনুযায়ী, মোছার script-কে সেই সুবিধার পরিচয়ের বদলে ভুল করে গ্রাহকের পুরো site-এর পরিচয় দেওয়া হয়, আর script সেগুলো স্থায়ীভাবে মোছার মোডে চলে। ফলে কয়েকশো গ্রাহক প্রতিষ্ঠানের পুরো site মুছে যায়; কারও কারও সেবা ফিরতে প্রায় দুই সপ্তাহ পর্যন্ত লাগে।

ডেটা চিরতরে হারায়নি — backup ছিল, point-in-time recovery-ও ছিল। তাহলে এত দেরি কেন? Review অনুযায়ী, তাদের restore প্রক্রিয়া মূলত দুই মাপের জন্য তৈরি ছিল: একজন গ্রাহকের ছোটখাটো ভুল ফেরানো, অথবা পুরো ব্যবস্থাকে আগের সময়ে ফেরানো। কিন্তু এখানে দরকার ছিল মাঝামাঝি — চালু বহু-গ্রাহকের ব্যবস্থার ভেতরে শুধু কয়েকশো site আলাদা করে ফেরানো, বাকি হাজারো গ্রাহকের নতুন লেখা না ছুঁয়ে। পুরো ব্যবস্থা পেছনে নিলে সবাই ক্ষতিগ্রস্ত হতেন; আর আলাদা করে ফেরানোর কাজের অনেকটাই স্বয়ংক্রিয় ছিল না, ধাপে ধাপে হাতে করতে হয়েছিল।

এই পর্বের PITR stepper-এর শেষ ধাপের সাথে মিলিয়ে দেখুন: আমরা পুরো database বদলাইনি, শুধু মুছে যাওয়া সারি ফেরত দিয়েছি। একই নীতি বড় মাপে — restore-এর মহড়া হতে হবে সেই মাপে, যা আসলে লাগবে: একটি টেবিল, একজন গ্রাহক, একশো গ্রাহক, পুরো region. আর প্রতিরোধের দিকে: ধ্বংসাত্মক কাজে আগে “soft delete” — চিহ্ন দিয়ে কিছুদিন রেখে দেওয়া — আর ছোট দলে ধাপে ধাপে চালানো, যাতে ভুল প্রথম ধাপেই ধরা পড়ে।

মূল উপলব্ধি: “backup আছে” আর “দ্রুত ফেরানো যায়” এক কথা নয়; RTO নির্ভর করে আপনি ঠিক যে মাপের restore চান, তার মহড়া করা হয়েছে কি না।

প্র ০৫সব সেবাকে multi-region active-active বানালেই কি disaster recovery-র সমস্যা মিটে যায়?

শুনতে আকর্ষণীয়: দুই region-ই চালু, একটি গেলে অন্যটি সব নেয়, RTO কয়েক মিনিট। কিন্তু অন্তত পাঁচটি কারণে এটি সবার উত্তর নয়।

এক, ডেটার দাম। দুই region-ই লেখা নিলে হয় conflict মেটাতে হবে (পর্ব ৪৬), নয়তো প্রতিটি লেখায় region পেরোনো consensus-এর latency দিতে হবে — পর্ব ৪০-এর PACELC-এর কথাই। ব্যাংকের ledger-এর মতো ডেটায় “দুই জায়গায় একই টাকা খরচ” মেনে নেওয়া যায় না, আবার প্রতিটি লেনদেনে দেশের এক প্রান্ত থেকে আরেক প্রান্তের round trip-ও সহজ নয়।

দুই, capacity. যেকোনো একটি region পুরো ভার নিতে পারবে, এই শর্তে স্বাভাবিক দিনে দুটিই অর্ধেকের কম ব্যস্ত থাকে — মোটামুটি দ্বিগুণ খরচ। না রাখলে failover-এর মুহূর্তে বাকি region ভিড়ে ভেঙে পড়ে।

তিন, ভুল ছড়ানো। অংশ ৭-এর simulator দেখিয়েছে, এক সাথে সবখানে যাওয়া খারাপ deploy দুই region-কেই একসাথে ফেলে; region যোগ করে সেই downtime কমে না। ভুল DELETE আর ransomware-এর বিরুদ্ধেও active-active কিছুই করে না — সেখানে লাগে backup.

চার, জটিলতা নিজেই ঝুঁকি। Failover-এর যন্ত্রপাতি — health check, স্বয়ংক্রিয় সিদ্ধান্ত, region পেরোনো replication — নিজেও ভুল করতে পারে, আর অকারণ failover বা দুই region-এর মধ্যে বারবার দোল খাওয়া নিজেই বিভ্রাট ঘটায়।

পাঁচ, দরকার নেই সবখানে। অংশ ২-এর স্তর-ভাগ মনে করুন: লগইন আর লেনদেনের পথ হয়তো active-active-এর যোগ্য, কিন্তু report, analytics বা ছবির archive-এর জন্য backup & restore-ই যুক্তিসংগত। অংশ ৬-এর হিসাবেও দেখেছেন, প্রত্যাশিত ক্ষতির চোখে অনেক সময় মাঝের কৌশলই সবচেয়ে সাশ্রয়ী।

মূল উপলব্ধি: active-active হলো কিছু নির্দিষ্ট পথের জন্য দামি একটি হাতিয়ার, সব সেবার ডিফল্ট নয়; প্রতিটি অংশের RPO-RTO, ডেটার ধরন আর আসল downtime-এর উৎস দেখে কৌশল বাছুন।

অনুশীলন

আগে নিজে চেষ্টা করুন, তারপর উত্তর মিলিয়ে নিন।

  1. হিসাব — RTO কি পূরণ হবে? একটি কাল্পনিক mobile banking সেবার statement database ৩ TB. Backup & restore কৌশলে restore-এর কার্যকর গতি ২৫০ MB/s, তারপর ২০০ GB WAL replay হয় ৮০ MB/s-এ। বাকি ধাপ (ধরা যাক): টের পাওয়া ১৫ মিনিট, সিদ্ধান্ত ৩০ মিনিট, নতুন পরিবেশ তৈরি ৪৫ মিনিট, যাচাই ৪০ মিনিট, traffic সরানো ১০ মিনিট। (ক) মোট RTO কত, ৬ ঘণ্টার লক্ষ্য পূরণ হয় কি? (খ) বাকি সব একই রেখে ৪ ঘণ্টায় নামাতে restore-এর গতি কত লাগবে? (গ) WAL টুকরো প্রতি ৫ মিনিটে archive হয় আর নিরাপদ জায়গায় পৌঁছাতে আরও ১ মিনিট লাগে — সবচেয়ে খারাপ RPO কত?

    (ক) মানুষের আর পরিবেশের ধাপ: ১৫ + ৩০ + ৪৫ + ৪০ + ১০ = ১৪০ মিনিট ≈ ২.৩৩ ঘণ্টা। Restore: ৩ × ১০১২ B ÷ (২৫০ × ১০৬ B/s) = ১২,০০০ সেকেন্ড = ৩.৩৩ ঘণ্টা। Replay: ২০০ × ১০৯ ÷ (৮০ × ১০৬) = ২,৫০০ সেকেন্ড ≈ ০.৬৯ ঘণ্টা। মোট ≈ ৬.৩৬ ঘণ্টা, অর্থাৎ প্রায় ৬ ঘণ্টা ২২ মিনিট — লক্ষ্য প্রায় ২২ মিনিটে ফসকায়।

    (খ) ৪ ঘণ্টা = ১৪,৪০০ সেকেন্ড। বাদ দিন ১৪০ মিনিট (৮,৪০০ সেকেন্ড) আর replay-এর ২,৫০০ সেকেন্ড — restore-এর জন্য থাকে ৩,৫০০ সেকেন্ড। গতি লাগবে ৩ × ১০১২ ÷ ৩,৫০০ ≈ ৮৫৭ MB/s — বর্তমানের প্রায় সাড়ে তিন গুণ। বিকল্প প্রায়ই সস্তা: লেখা মানদণ্ডে সিদ্ধান্ত ৩০ থেকে ৫ মিনিটে, IaC-তে পরিবেশ ৪৫ থেকে ১৫ মিনিটে, স্বয়ংক্রিয় যাচাই — অথবা pilot light.

    (গ) সবচেয়ে খারাপ ক্ষেত্রে পরের টুকরো নিরাপদ হওয়ার ঠিক আগে বিপর্যয়: ৫ + ১ = ৬ মিনিটের লেখা হারাতে পারে।

  2. একটি DR পরিকল্পনার সমালোচনা করুন: একটি কাল্পনিক অনলাইন দোকানের পরিকল্পনা: “Database একই region-এর দুটি zone-এ synchronous replica, তাই RPO শূন্য। প্রতি রাতে disk snapshot, একই account আর একই region-এ, ৩ দিন রাখা হয়। ছবি একটি bucket-এ, versioning বন্ধ। Backup-এর encryption key শুধু ওই region-এর key management-এ। DNS TTL ১ দিন। Failover script লেখা আছে, কখনো চালানো হয়নি।” সব দুর্বলতা খুঁজে অগ্রাধিকারসহ প্রতিকার লিখুন।
    1. “RPO শূন্য” শুধু zone হারালে সত্য — ভুল DELETE বা corruption সাথে সাথে replica-তে যায়, region গেলে দুটিই যায়। প্রতিকার: continuous WAL archive-সহ PITR.
    2. Snapshot একই account আর region-এ — region বিভ্রাট, চুরি যাওয়া credential বা ransomware-এ snapshot-ও যায়। প্রতিকার: আলাদা account ও অন্য region-এ কপি, object lock.
    3. Encryption key শুধু ওই region-এ — অন্য জায়গার backup খোলাই যাবে না। প্রতিকার: চাবির নিরাপদ কপি বা multi-region key.
    4. ৩ দিনের retention — চার দিন পরে ধরা পড়া corruption ফেরানো যাবে না। প্রতিকার: দৈনিক, সাপ্তাহিক আর মাসিক স্তর।
    5. ছবির bucket-এ versioning বন্ধ — ভুল overwrite বা মোছা ফেরানো যায় না। প্রতিকার: versioning আর অন্য account-এ কপি (পর্ব ২৬)।
    6. DNS TTL ১ দিন — failover হলেও বহু ব্যবহারকারী এক দিন পর্যন্ত পুরোনো ঠিকানায়। প্রতিকার: ৬০–৩০০ সেকেন্ড, বা anycast-ভিত্তিক global load balancer.
    7. কখনো না চালানো script — আসল দিনে সবচেয়ে সম্ভাব্য ব্যর্থ অংশ। প্রতিকার: runbook, staging-এ মহড়া, তারপর নিয়মিত game day.
  3. আউটপুট অনুমান করুন: অংশ ৭-এর downtime simulator-এ একটি লাইন বদলান: DEPLOY = [2, 0.5]-এর জায়গায় DEPLOY = [2, 0.05] — অর্থাৎ ধাপে ধাপে deploy আর দ্রুত rollback-এ খারাপ deploy গড়ে ৩০ মিনিটের বদলে ৩ মিনিটে সামলানো যায়। চালানোর আগে লিখুন: তিন নকশার mean h/yr মোটামুটি কত হবে? কোন নকশা সবচেয়ে বেশি লাভবান হবে, আর multi-AZ বনাম multi-region-এর ফাঁক কি বাড়বে না কমবে? তারপর চালিয়ে মিলিয়ে নিন।

    প্রত্যাশিত মানের সূত্রে deploy-এর অংশ ২ × ০.৫ = ১ ঘণ্টা থেকে নামে ২ × ০.০৫ = ০.১ ঘণ্টায় — সব নকশা থেকে প্রায় ০.৯ ঘণ্টা কমবে। চালালে আউটপুট:

    layout        mean h/yr  availability  worst 5% of years >=
    single-AZ         1.81       99.979%       8.6 h
    multi-AZ          0.30       99.997%       0.5 h
    multi-region      0.14       99.998%       0.4 h

    Single-AZ ২.৭২ থেকে ১.৮১ — তবু বড়, zone হারানোর ১.৫ ঘণ্টা থেকে যায়। Multi-AZ ১.২১ থেকে ০.৩০ — প্রায় চার ভাগের এক ভাগ। Multi-region ১.০৫ থেকে ০.১৪. এখন দ্বিতীয় region multi-AZ-এর downtime অর্ধেকের নিচে নামায় (০.৩০ → ০.১৪), আগে নামাত মাত্র ১৩% (১.২১ → ১.০৫) — ধাপে ধাপে deploy আগে ঠিক করলে তবেই দ্বিতীয় region-এর টাকা কাজে লাগে। একই seed থাকায় zone আর region-এর ঘটনা হুবহু এক; বদলেছে শুধু deploy-এর সময়।

  4. লিখুন — একটি region failover runbook-এর কঙ্কাল: অংশ ৫-এর ticket booking সেবার জন্য একটি runbook-এর শিরোনাম আর প্রতিটি ধাপের এক-দুই লাইন লিখুন: কখন শুরু, কে কী করবেন, প্রতিটি ধাপের পর কী যাচাই, আর কখন থামবেন বা ফিরবেন।
    1. শুরুর মানদণ্ড: অন্তত তিনটি এলাকার probe-এ region ক-এর error rate ১৫ মিনিট ধরে ৫০%-এর বেশি, অথবা প্রদানকারীর region-ব্যাপী বিভ্রাটের ঘোষণা। সিদ্ধান্ত: on-call incident commander, বিকল্প একজন নির্দিষ্ট দ্বিতীয় ব্যক্তি।
    2. ভূমিকা: incident commander, operations lead (কমান্ড), communications lead (status page ও গ্রাহক) — আলাদা মানুষ।
    3. আগে যাচাই: region খ-এর replica-র lag আর স্বাস্থ্য; lag সীমার (ধরুন ৩০ সেকেন্ড) বেশি হলে ঝুঁকি লিখে স্পষ্ট অনুমতি।
    4. Fence: region ক-এর database credential বাতিল, epoch বাড়ানো; যাচাই: ক থেকে পরীক্ষামূলক লেখা প্রত্যাখ্যাত।
    5. Promote ও বাড়ানো: replica promote, app পূর্ণ মাপে; যাচাই: health check সবুজ, পরীক্ষামূলক বুকিং সফল।
    6. Traffic: ওজন ধাপে ধাপে ১০% → ৫০% → ১০০%, প্রতি ধাপে error rate আর latency দেখা।
    7. পরে: নতুন DR কপি শুরু, না-কপি-হওয়া লেখার তালিকা রাখা, ঘটনার সময়রেখা লেখা — postmortem-এর কথা পর্ব ৫০-এ।
    8. থামা বা ফেরা: promote-এর আগে ক ফিরলে প্রক্রিয়া বাতিল; পরে আর “ফিরে যাওয়া” নয় — failback আলাদা পরিকল্পিত switchover.

    Runbook রাখুন বিকল region-এর বাইরে, ছাপানো কপিসহ, আর প্রতিটি game day-এর পরে হালনাগাদ করুন।

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

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

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

  1. 🔍 কয়েকটি ভিন্ন এলাকার probe আর error rate দেখে বিভ্রাট টের পাওয়া
  2. 🧭 Runbook-এর মানদণ্ড মিলিয়ে, standby-র lag দেখে failover-এর সিদ্ধান্ত
  3. 🔒 পুরোনো primary-র লেখার অধিকার কেটে fencing
  4. ⬆️ Standby region-এর replica promote আর app বাড়ানো
  5. 🔀 Global DNS বা load balancer দিয়ে traffic সরানো
  6. ↩️ পুরোনো region-কে follower হিসেবে মিলিয়ে পরে পরিকল্পিত failback

একটি database-এর দুটি synchronous replica আছে। একজন প্রকৌশলী ভুল করে একটি গুরুত্বপূর্ণ টেবিলের সব সারি মুছে ফেললেন। কোন ব্যবস্থা ডেটা ফেরাতে পারবে?

  • Synchronous replica-কে promote করা
  • অন্য zone-এ আরেকটি replica যোগ করা
  • Point-in-time recovery — backup আর log দিয়ে ভুলের ঠিক আগের অবস্থা
  • DNS failover দিয়ে অন্য region-এ যাওয়া

একটি সেবার full backup দিনে একবার শুরু হয়, আর শেষ হয়ে অন্য region-এ নিরাপদে পৌঁছাতে ২ ঘণ্টা লাগে। আর কোনো backup বা replication নেই। সবচেয়ে খারাপ ক্ষেত্রে কত ঘণ্টার লেখা হারাতে পারে?

  • ২৪ ঘণ্টা
  • ২৬ ঘণ্টা
  • ২ ঘণ্টা
  • ২২ ঘণ্টা

২ TB backup restore করতে হবে, কার্যকর গতি ২০০ MB/s (megabyte প্রতি সেকেন্ড)। শুধু ডেটা নামাতে মোটামুটি কত সময় লাগবে?

  • প্রায় ২.৮ ঘণ্টা
  • প্রায় ২২ ঘণ্টা
  • প্রায় ২৮ মিনিট
  • প্রায় ১০ ঘণ্টা

একটি DNS record-এর TTL ৩০০ সেকেন্ড। Region বিকল হওয়ার ৬০ সেকেন্ড পরে record বদলে নতুন region-এর ঠিকানা বসানো হলো। সব resolver TTL মানলে সবচেয়ে খারাপ ক্ষেত্রে বিকল হওয়ার কত সেকেন্ড পর পর্যন্ত কেউ কেউ পুরোনো ঠিকানায় যেতে পারেন?

  • ৩০০ সেকেন্ড
  • ৩৬০ সেকেন্ড
  • ৬০ সেকেন্ড
  • ২৪০ সেকেন্ড

রবিবার রাতে full backup, তারপর সোম থেকে শুক্র প্রতি রাতে incremental backup নেওয়া হয়। শনিবার দুপুরে database নষ্ট হলো। শুক্রবার রাতের অবস্থায় ফিরতে কয়টি backup ক্রমানুসারে restore করতে হবে?

  • ১টি — শুক্রবারের incremental
  • ২টি — full আর শুক্রবারের
  • ৫টি
  • ৬টি — full আর ৫টি incremental

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

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

শব্দকোষ

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

মনে রাখুন

  1. Replication আর backup দুটি আলাদা বিপদের উত্তর: replica কপি হারানো সামলায়, backup অতীতে ফেরায় — ভুল DELETE, corruption আর ransomware-এ শুধু দ্বিতীয়টি কাজ করে।
  2. RPO (কত সময়ের ডেটা হারানো চলে) আর RTO (কতক্ষণ বন্ধ থাকা চলে) আসে ব্যবসার ক্ষতি থেকে, অংশভেদে আলাদা; RTO = টের পাওয়া + সিদ্ধান্ত + পরিবেশ + restore + replay + যাচাই + traffic.
  3. Full, incremental আর differential-এর restore-চেইন আলাদা; snapshot স্বাধীন জায়গায় কপি না হলে backup নয়; PITR দেয় ঠিক ভুলের আগের মুহূর্ত; 3-2-1, আলাদা account, immutable কপি, encryption আর retention — আর মহড়ায় মাপা আসল RTO.
  4. Failover: বহু জায়গা থেকে টের পাওয়া → মানদণ্ড মেনে সিদ্ধান্ত → fencing → promote → traffic (DNS TTL-এর লেজ মনে রেখে) → নতুন DR কপি; failback আলাদা পরিকল্পিত switchover.
  5. Backup & restore → pilot light → warm standby → active-active: যে কৌশল RPO-RTO মেটায় তার সবচেয়ে সস্তাটি বাছুন; downtime-এর আসল উৎস দেখুন, blast radius ছোট রাখুন, আর game day-তে অনুশীলন করুন।

পরের পর্বে: বিপর্যয় সবসময় প্রকৃতি বা ভুল থেকে আসে না — কখনো আসে ভুল হাতে যাওয়া অধিকার থেকে। নকশায় নিরাপত্তা: authentication, OAuth 2.0-OIDC, encryption আর secrets.

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

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