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

Availability আর reliability — nines, redundancy, single point of failure আর MTTR

Availability & Reliability — Nines, MTBF/MTTR, Series–Parallel Math, Redundancy, Failover & Single Points of Failure

Taught in Bangla, this lesson distinguishes availability, reliability and durability, converts nines into allowed downtime, and builds availability from MTBF, MTTR and MTTD. It computes series, parallel and k-of-n systems with proofs, works a full DNS-to-database example, covers active-active and active-passive failover, health checks, single points of failure, failure domains and correlated failures, plus durability models, SLI, SLO, SLA and error budgets, with simulators.

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

  • Availability, reliability, durability, fault, failure আর fault tolerance-এর সঠিক সংজ্ঞা; সময়ভিত্তিক বনাম অনুরোধভিত্তিক মাপ
  • Nines থেকে বছর, মাস, সপ্তাহ আর দিনের অনুমোদিত downtime; MTBF, MTTR, MTTD আর availability-সূত্রের যুক্তি
  • Series, parallel আর k-of-n (N+1) গঠনের availability — প্রমাণসহ, একটি পূর্ণ architecture-এর হিসাব
  • Active-active, active-passive, failover-এর সময়, health check ও heartbeat, single point of failure আর failure domain
  • Durability-র সরল মডেল, SLI-SLO-SLA আর error budget-এর ধারণা, আর AI-এর দেওয়া নকশা যাচাইয়ের উপায়

১ · তিনটি আলাদা প্রশ্ন — availability, reliability আর durability

মাসের প্রথম দিন, রাত ৯টা। আপনি একটি মোবাইল ব্যাংকিং অ্যাপে (কাল্পনিক) বিদ্যুৎ বিল দিতে গেলেন — পর্দায় এলো “সেবাটি সাময়িকভাবে বন্ধ”। দশ মিনিট পর আবার চেষ্টা করলেন; এবার কাজ হলো, ব্যালান্সও ঠিক আছে। এখানে তিনটি আলাদা প্রশ্ন লুকিয়ে আছে: সেবাটি যখন দরকার তখন পাওয়া যায় কি? চালু হলে না থেমে কতক্ষণ চলে? আর বন্ধ থাকার সময় আপনার টাকার হিসাব নিরাপদ ছিল কি? এরা পর্ব ২-এর non-functional requirement; এই পর্বে এদের মাপা, হিসাব করা আর নকশায় বাড়ানো শিখবেন।

তিনটি দৃশ্য ভাবুন। Availability: মাসে যতবার পাড়ার ATM বুথে গেলেন, তার কতবার টাকা তুলতে পারলেন। Reliability: ঢাকা থেকে চট্টগ্রামের বাস ছয় ঘণ্টার যাত্রায় একবারও বিকল না হওয়ার সম্ভাবনা। Durability: ATM সারা রাত বন্ধ থাকলেও আপনার অ্যাকাউন্টের টাকা উধাও হয় না — ব্যাংকের খাতা নিরাপদ। তিনটি আলাদা গুণ; একটি ভালো হলেই অন্যটি ভালো হয় না।

Availability — সময় দিয়ে মাপবেন, না অনুরোধ দিয়ে?

Availability মানে সেবা যখন দরকার তখন ঠিকঠাক কাজ করার অনুপাত। দুইভাবে মাপা হয়:

সময়ভিত্তিক: A = চালু সময় ÷ (চালু সময় + বন্ধ সময়)
অনুরোধভিত্তিক: A = সফল অনুরোধ ÷ মোট বৈধ অনুরোধ

দুটির ফল আলাদা হতে পারে। রাত ৩টার ২০ মিনিটের বিভ্রাট আর ঈদের আগের সন্ধ্যার ২০ মিনিট সময়ের হিসাবে সমান, কিন্তু দ্বিতীয়টিতে বহু গুণ বেশি মানুষ খালি হাতে ফেরেন। আবার মাত্র ৫% অনুরোধ এক ঘণ্টা ধরে ব্যর্থ হলে সেটা “চালু” না “বন্ধ”? অনুরোধভিত্তিক মাপ এই আংশিক বিভ্রাটও ধরে। Google-এর Site Reliability Engineering বই (২০১৬) দুটি মাপই ব্যাখ্যা করে, আর জানায় যে বিশ্বজুড়ে ছড়ানো সেবায় তারা সাধারণত অনুরোধভিত্তিক মাপ নেয়। কোন উত্তর “সফল” (৫০০-গোত্রের error নয়? সময়মতো এসেছে? — latency-র মাপ পর্ব ৪-এ) আর কোন অনুরোধ গোনা হবে — এই সংজ্ঞা আগে লিখে নিতে হয়।

Reliability — সময় জুড়ে না থেমে চলা

Reliability-র কঠোর সংজ্ঞা: নির্দিষ্ট সময় t জুড়ে, নির্দিষ্ট পরিবেশে সিস্টেম একবারও ব্যর্থ না হয়ে কাজ করার সম্ভাবনা R(t). ব্যর্থতার হার স্থির ধরলে (গড়ে প্রতি MTBF ঘণ্টায় একটি, অংশ ৩) R(t) = e−t/MTBF. MTBF ৫০০ ঘণ্টা হলে এক দিনে কোনো ব্যর্থতা না হওয়ার সম্ভাবনা e−২৪/৫০০ ≈ ০.৯৫৩, এক সপ্তাহে মাত্র ≈ ০.৭১৫।

দুটি আলাদা কেন? একটি সার্ভিস এলোমেলো সময়ে গড়ে ঘণ্টায় একবার crash করে আর ১ সেকেন্ডে আবার চালু হয়। Availability = ৩৫৯৯ ÷ ৩৬০০ ≈ ৯৯.৯৭% — শুনতে দারুণ! কিন্তু এক ঘণ্টা না থেমে চলার সম্ভাবনা মাত্র e−১ ≈ ০.৩৭ — আধা ঘণ্টার ভিডিও কল প্রায়ই মাঝপথে ভাঙবে। উল্টো দিকে, যে সিস্টেম প্রতি রাতে দুই ঘণ্টা রক্ষণাবেক্ষণে বন্ধ থাকে কিন্তু চালু অবস্থায় কখনো ভাঙে না, তার availability প্রায় ৯১.৭%, অথচ reliability চমৎকার। সতর্কতা: Martin Kleppmann-এর Designing Data-Intensive Applications (২০১৭)-এর মতো বইয়ে আর দৈনন্দিন কথায় “reliability” ঢিলেঢালা অর্থে — “কিছু ভুল হলেও ঠিকভাবে চলা” — ব্যবহৃত হয়।

Durability — ডেটা না হারানো

Durability মানে একবার “সংরক্ষিত হয়েছে” বলে নিশ্চিত করা ডেটা পরে হারিয়ে না যাওয়া — সাধারণত বলা হয় বছরে কত nine; ACID-এর D-ও একই কথা বলে। Durability আর availability স্বাধীন: ATM বন্ধ থাকলেও টাকা নিরাপদ; আবার সেবা দিব্যি চলছে কিন্তু একটি ডিস্ক নষ্ট হয়ে কারও ছবি চিরতরে হারাল। দ্বিতীয়টি অনেক বেশি ভয়ংকর — বন্ধ সেবা ফিরে আসে, হারানো ডেটা আসে না।

Fault, failure আর fault tolerance

Fault হলো কোনো একটি অংশের ত্রুটি — নষ্ট ডিস্ক, কোডের bug, কাটা ফাইবার, ভুল config. Failure হলো পুরো সিস্টেম যখন ব্যবহারকারীকে প্রতিশ্রুত সেবা দিতে পারে না। Fault ঘটবেই — কয়েক হাজার ডিস্কের বহরে প্রায় প্রতি সপ্তাহে কোথাও একটি ডিস্ক নষ্ট হয়। তাই লক্ষ্য হলো fault যেন failure-এ না গড়ায় — এটিই fault tolerance. Avizienis, Laprie, Randell ও Landwehr-এর ২০০৪ সালের বহুল-উদ্ধৃত শ্রেণিবিন্যাস শিকলটিকে বলে fault → error → failure; আর একটি অংশের failure বড় সিস্টেমের চোখে আরেকটি fault মাত্র।

গুণযে প্রশ্নের উত্তরসাধারণ মাপযা দিয়ে বাড়ে
Availabilityএখন কাজ করছে কি?চালু সময় বা সফল অনুরোধের শতাংশredundancy, দ্রুত failover, কম MTTR
Reliabilityনা থেমে কতক্ষণ চলে?R(t), MTBFভালো কোড ও পরীক্ষা, ধীরে rollout
Durabilityডেটা হারায় কি?বছরে ডেটা হারানোর সম্ভাবনাএকাধিক কপি, erasure coding, backup

২ · “কয়টি nine” — অনুমোদিত downtime-এর হিসাব

Availability-কে মুখে বলা হয় nines দিয়ে: ৯৯% “দুটি nine”, ৯৯.৯% “তিনটি nine”, ৯৯.৯৯৯% “পাঁচটি nine”; ৯৯.৯৫%-কে কেউ বলেন “সাড়ে তিন nine”. হিসাব একটাই: অনুমোদিত downtime = (১ − A) × সময়কাল। এই পর্বে বছর = ৩৬৫ দিন (৮,৭৬০ ঘণ্টা = ৫,২৫,৬০০ মিনিট) আর মাস = ৩০ দিন (৪৩,২০০ মিনিট) ধরা হলো। কেউ ৩৬৫.২৫ দিনের বছর ধরেন — তখন ৯৯.৯৯%-এ ৫২.৫৬-এর বদলে প্রায় ৫২.৬০ মিনিট; চুক্তিতে কোনটি ধরা হলো তা লেখা থাকা উচিত।

Availabilityবছরে (৩৬৫ দিন)মাসে (৩০ দিন)সপ্তাহেদিনে
৯৯% (দুটি nine)৮৭.৬ ঘণ্টা (≈ ৩.৬৫ দিন)৭ ঘণ্টা ১২ মিনিট১ ঘণ্টা ৪০ মিনিট ৪৮ সেকেন্ড১৪ মিনিট ২৪ সেকেন্ড
৯৯.৯% (তিনটি)৮ ঘণ্টা ৪৫ মিনিট ৩৬ সেকেন্ড৪৩ মিনিট ১২ সেকেন্ড১০ মিনিট ৪.৮ সেকেন্ড১ মিনিট ২৬.৪ সেকেন্ড
৯৯.৯৫%৪ ঘণ্টা ২২ মিনিট ৪৮ সেকেন্ড২১ মিনিট ৩৬ সেকেন্ড৫ মিনিট ২.৪ সেকেন্ড৪৩.২ সেকেন্ড
৯৯.৯৯% (চারটি)৫২ মিনিট ৩৩.৬ সেকেন্ড৪ মিনিট ১৯.২ সেকেন্ড১ মিনিট ০.৪৮ সেকেন্ড৮.৬৪ সেকেন্ড
৯৯.৯৯৯% (পাঁচটি)৫ মিনিট ১৫.৩৬ সেকেন্ড২৫.৯২ সেকেন্ড৬.০৪৮ সেকেন্ড০.৮৬৪ সেকেন্ড

নিচের ক্যালকুলেটর একই টেবিল বানায়। তালিকায় নিজের লক্ষ্যের শতাংশ বসিয়ে চালিয়ে দেখুন।

// Allowed downtime for an availability target ("nines").
// Convention: year = 365 days, month = 30 days, week = 7 days, day = 24 h.
const periods = [["year", 365 * 86400], ["month", 30 * 86400],
                 ["week", 7 * 86400], ["day", 86400]];      // seconds

function human(sec) {                       // 31536 -> "8h 45m 36s"
  if (sec >= 86400) return (sec / 86400).toFixed(2) + " days";
  const h = Math.floor(sec / 3600), m = Math.floor((sec % 3600) / 60);
  const s = +(sec % 60).toFixed(3);         // + drops trailing zeros
  return (h ? h + "h " : "") + (h || m ? m + "m " : "") + s + "s";
}

console.log("target   " + periods.map(p => p[0].padEnd(14)).join(""));
for (const pct of [99, 99.9, 99.95, 99.99, 99.999]) {
  const down = 1 - pct / 100;               // fraction of time allowed down
  const row = periods.map(([, sec]) => human(down * sec).padEnd(14));
  console.log((pct + "%").padEnd(9) + row.join(""));
}

আউটপুট:

target   year          month         week          day
99%      3.65 days     7h 12m 0s     1h 40m 48s    14m 24s
99.9%    8h 45m 36s    43m 12s       10m 4.8s      1m 26.4s
99.95%   4h 22m 48s    21m 36s       5m 2.4s       43.2s
99.99%   52m 33.6s     4m 19.2s      1m 0.48s      8.64s
99.999%  5m 15.36s     25.92s        6.048s        0.864s

প্রতিটি সারি আগের সারির দশ ভাগের এক ভাগ (৯৯.৯৫% মাঝামাঝি)। ৯৯.৯৯৯%-এর দৈনিক বাজেট 0.864s — এক সেকেন্ডও নয়। ভাবুন: রাত ৩টায় alert এলো, on-call প্রকৌশলী ঘুম ভেঙে ল্যাপটপ খুলে VPN-এ ঢুকতেই পাঁচ মিনিট পার — পাঁচ nine-এর পুরো বছরের বাজেট (5m 15.36s) শেষ। তাই চার-পাঁচ nine মানুষের হাতে সারানো দিয়ে হয় না; লাগে স্বয়ংক্রিয় detection আর failover. তালিকায় ৯৮ বা ৯৯.৫ যোগ করে দেখুন।

একই শতাংশ, ভিন্ন প্রতিশ্রুতি। “৯৯.৯% মাসিক” মানে প্রতি মাসে সর্বোচ্চ ৪৩ মিনিট ১২ সেকেন্ড; “৯৯.৯% বার্ষিক” হলে একটিমাত্র ৮ ঘণ্টার বিপর্যয়ও চলে যায়। পরিকল্পিত রক্ষণাবেক্ষণ বাদ যায় কি না, কোন অঞ্চল বা API গোনা হবে — তাও চুক্তিভেদে আলাদা; তুলনার আগে সংজ্ঞা পড়ুন।

৩ · MTBF, MTTR আর MTTD — availability-র ভেতরের সূত্র

শতাংশ বলে কতটা বন্ধ ছিল; নকশা বদলাতে জানতে হয় কেন। প্রতিটি সেবার জীবন একটি পালাবদল: চালু → ব্যর্থ → সারানো → আবার চালু। এর তিনটি গড় মাপ:

  • MTBF (mean time between failures): এই পর্বে মানে — আবার চালু হওয়ার পর থেকে পরের ব্যর্থতা পর্যন্ত গড় চালু-সময়। কঠোর reliability-প্রকৌশলে এর নাম MTTF, আর সেখানে MTBF = MTTF + MTTR (OS কোর্সের RAID পর্বে সেই সংজ্ঞা)। MTTR খুব ছোট হলে পার্থক্য প্রায় শূন্য, তবু কোনটি বোঝাচ্ছেন স্পষ্ট লিখবেন।
  • MTTR (mean time to repair/recover): ব্যর্থতা শুরু থেকে সেবা আবার ঠিক হওয়া পর্যন্ত গড় সময়। “R” কোথাও repair, কোথাও recover বা restore — প্রতিষ্ঠানভেদে মাপার শুরু-শেষ আলাদা।
  • MTTD (mean time to detect): ব্যর্থতা শুরু থেকে টের পাওয়া পর্যন্ত গড় সময় — MTTR-এরই প্রথম অংশ। MTTR = টের পাওয়া + কারণ খোঁজা + সারানো বা rollback + যাচাই।
সূত্রের যুক্তি

ধরুন দীর্ঘ সময়ে সেবাটি n বার চালু-বন্ধের চক্র পার করল; i-তম চক্রে চালু ছিল Ui ঘণ্টা, বন্ধ Di ঘণ্টা। চালু সময়ের অংশ A = ΣUi ÷ (ΣUi + ΣDi). লব আর হরকে n দিয়ে ভাগ করলে A = (ΣUi/n) ÷ (ΣUi/n + ΣDi/n). n বড় হলে ΣUi/n যায় MTBF-এর দিকে আর ΣDi/n যায় MTTR-এর দিকে (বড় সংখ্যার নিয়ম)। তাই দীর্ঘমেয়াদে নিচের সূত্র। লক্ষ করুন, সময়গুলো কোন ধাঁচে ছড়ানো তা কোথাও লাগেনি — শুধু দুটি গড়।

A = MTBF ÷ (MTBF + MTTR)
U = 1 − A = MTTR ÷ (MTBF + MTTR) ≈ MTTR ÷ MTBF

শেষ আসন্ন রূপটি একটি গুরুত্বপূর্ণ সত্য দেখায়: MTTR অর্ধেক করা আর MTBF দ্বিগুণ করা হুবহু একই ফল দেয়। MTBF ৭২০ ঘণ্টা (মোটামুটি মাসে একবার), MTTR ১ ঘণ্টা হলে A = ৭২০ ÷ ৭২১ ≈ ৯৯.৮৬%, বছরে প্রায় ১২.১৫ ঘণ্টা বন্ধ। MTTR ৩০ মিনিটে নামালে ৭২০ ÷ ৭২০.৫ ≈ ৯৯.৯৩%; MTBF ১,৪৪০ ঘণ্টায় তুললেও ১,৪৪০ ÷ ১,৪৪১ ≈ ৯৯.৯৩% — একই সংখ্যা, বছরে প্রায় ৬.০৮ ঘণ্টা।

লোডশেডিং কতবার হবে, তা আপনার হাতে নেই — সেটি “MTBF বাড়ানো”, বিদ্যুৎ খাতের বিশাল বিনিয়োগ। কিন্তু বাসায় একটি IPS থাকলে প্রতিটি লোডশেডিং-এ ফ্যান-বাতি বন্ধ থাকে প্রায় শূন্য সেকেন্ড — আপনার “MTTR” প্রায় শূন্য, সামান্য খরচে। সিস্টেমেও তাই: ব্যর্থতার উৎস অগণিত — ডিস্ক, bug, ভুল deploy, ভুল config — সবগুলোকে বিরল করা কঠিন ও দামি; কিন্তু দ্রুত alert, স্বয়ংক্রিয় restart, failover আর এক ক্লিকে rollback সব ধরনের ব্যর্থতার সময় একসাথে কমায়।

সূত্রটি কি সত্যিই মেলে? নিচের Monte Carlo simulation একটি অংশকে বহু বছর চালায়: চালু-সময় আর মেরামত-সময় এলোমেলোভাবে বেছে নেয় (গড় ৫০০ আর ২ ঘণ্টা), তারপর মোট বন্ধ-সময় গুনে availability বের করে। এলোমেলো সংখ্যা আসে নির্দিষ্ট seed-এর PRNG থেকে, তাই প্রতিবার একই ফল।

// One component alternates UP (mean MTBF) and DOWN (mean MTTR) for many years.
// Seeded PRNG (mulberry32), so every run prints the same numbers.
function mulberry32(seed) {
  return function () {
    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 = mulberry32(2026);
const expo = (mean) => -mean * Math.log(1 - rand());   // random time, given mean
function simulate(mtbf, mttr, years, fixedRepair) {
  const horizon = years * 8760;                         // hours
  let t = 0, down = 0, failures = 0;
  while (true) {
    t += expo(mtbf);                                    // working period
    if (t >= horizon) break;
    failures++;
    const r = fixedRepair ? mttr : expo(mttr);          // repair period
    down += Math.min(r, horizon - t);
    t += r;
  }
  return { failures, A: 1 - down / horizon };
}
const MTBF = 500, MTTR = 2;                             // hours
console.log("formula A = MTBF/(MTBF+MTTR) = " + (MTBF / (MTBF + MTTR)).toFixed(6));
console.log("years  failures  simulated A  downtime h/yr");
for (const y of [1, 10, 100, 1000]) {
  const r = simulate(MTBF, MTTR, y, false);
  console.log(String(y).padEnd(7) + String(r.failures).padEnd(10) +
              r.A.toFixed(6).padEnd(13) + ((1 - r.A) * 8760).toFixed(2));
}
const f = simulate(MTBF, MTTR, 1000, true);
console.log("repair always exactly " + MTTR + " h, 1000 years: A = " + f.A.toFixed(6));

আউটপুট:

formula A = MTBF/(MTBF+MTTR) = 0.996016
years  failures  simulated A  downtime h/yr
1      20        0.995627     38.31
10     162       0.996216     33.15
100    1728      0.996028     34.80
1000   17485     0.995996     35.07
repair always exactly 2 h, 1000 years: A = 0.996012

সূত্র বলে 0.996016 — বছরে প্রায় ৩৪.৯ ঘণ্টা। মাত্র ১ বছর চালালে simulation দেখায় 0.995627 (৩৮.৩১ ঘণ্টা, ২০টি ব্যর্থতা) — ভাগ্যের ওপর অনেকটা নির্ভর; ১০০ আর ১,০০০ বছরে ফল সূত্রের খুব কাছে (0.996028, 0.995996). শিক্ষা দুটি। এক, এক মাস বা এক বছরের মাপা availability দিয়ে কোনো দলের দক্ষতা বিচার ঝুঁকিপূর্ণ — ছোট সময়ের মাপে এলোমেলোতা অনেক। দুই, শেষ লাইনে মেরামত সবসময় ঠিক ২ ঘণ্টা, তবু ফল 0.996012 — সূত্রে শুধু গড়ই লাগে। MTBF বা MTTR বদলে নিজে দেখুন (অনুশীলন ৩)।

৪ · Series আর parallel — অংশ জুড়লে availability কত

বাস্তবের সেবা একটি অংশ নয় — DNS, load balancer, app server, database, বাইরের payment gateway মিলে একটি পথ। পুরো পথের availability-র দুটি মৌলিক নিয়ম, আর দুটিই দাঁড়িয়ে একটি অনুমানে: অংশগুলোর ব্যর্থতা স্বাধীন — একটির নষ্ট হওয়া অন্যটির সম্ভাবনা বদলায় না।

Series — সবাইকে চালু থাকতে হবে

অনুরোধ সফল হতে যদি প্রতিটি অংশকেই কাজ করতে হয় (DNS এবং LB এবং app এবং DB), সেটি series. অংশ i চালু থাকার সম্ভাবনা Ai; স্বাধীন ঘটনাগুলো একসাথে ঘটার সম্ভাবনা তাদের গুণফল, তাই:

Series: A = A1 × A2 × … × An

প্রতিটি Ai ১-এর কম, তাই গুণফল প্রতিটির চেয়ে ছোট: শিকল তার দুর্বলতম কড়ির চেয়েও দুর্বল। দুটি ৯৯.৯% অংশ পরপর দিলে ৯৯.৮০ শতাংশ। মুখে মুখে হিসাবের কৌশল: unavailability Ui = ১ − Ai ছোট হলে মোট U ≈ U1 + U2 + … — series-এ downtime মোটামুটি যোগ হয়। তাই redundancy ছাড়া বসানো প্রতিটি নতুন অংশ — নতুন queue, নতুন microservice — পথের availability কমায়।

Parallel — যেকোনো একটি চালু থাকলেই চলে

দুটি একই রকম সার্ভারের যেকোনো একটি সেবা দিতে পারলে সেটি parallel. স্তরটি ব্যর্থ হয় কেবল সবগুলো একসাথে বন্ধ হলে। স্বাধীনতা ধরে তার সম্ভাবনা (১ − A1)(১ − A2)…, তাই:

Parallel: A = 1 − (1 − A1) × (1 − A2) × … × (1 − An)

দুটি ৯৯% সার্ভার: দুটিই বন্ধ থাকার সম্ভাবনা ০.০১ × ০.০১ = ০.০০০১, তাই A = ৯৯.৯৯ শতাংশ — দুটি nine থেকে চারটি! কিন্তু সূত্রে আরও দুটি অনুমান লুকানো: (১) একটি পড়লে অন্যটি সঙ্গে সঙ্গে, নির্ভুলভাবে দায়িত্ব নেয় — failover-এ সময় লাগে না; (২) টিকে থাকা একটি কপিই পুরো load সামলাতে পারে। দুটিই প্রায়ই মিথ্যা — অংশ ৫ আর ৬-এ দেখবেন।

k-of-n — capacity হিসাবে আনলে

ধরুন পিক সময়ে অন্তত ২টি সার্ভার লাগে (এমন সংখ্যা আসে পর্ব ৩-এর হিসাব থেকে), আর আছে ৩টি — এটি “৩-এর মধ্যে ২” বা N+1 গঠন (N = ২, ১টি বাড়তি)। প্রতিটির availability a হলে, n-এর মধ্যে অন্তত k টি চালু থাকার সম্ভাবনা (k-of-n):

A = Σi = k … n C(n, i) · ai · (1 − a)n − i

a = ০.৯৯, n = ৩, k = ২ হলে: তিনটিই চালু ০.৯৯৩ = ০.৯৭০২৯৯, ঠিক দুটি চালু ৩ × ০.৯৯২ × ০.০১ = ০.০২৯৪০৩; যোগফল ০.৯৯৯৭০২। “যেকোনো একটি যথেষ্ট” হলে হতো ০.৯৯৯৯৯৯ — capacity-র শর্তে unavailability প্রায় ৩০০ গুণ।

এবার redundancy ছাড়া একটি পথ ধরে ধরে গুণ করি। “পরে” চাপুন।

  1. DNSA = 0.9999নাম থেকে ঠিকানা
  2. Load balancerA = 0.999একটিমাত্র
  3. App serverA = 0.99একটিমাত্র
  4. DatabaseA = 0.999একটিমাত্র
চলতি গুণফল
এই ধাপে যোগ হলো
হিসাব
মোট A
বছরে downtime
  1. শুরু: শুধু DNS. ব্যবহারকারীর ফোন প্রথমে DNS-এর কাছে নাম থেকে ঠিকানা জানতে চায়। ধরা যাক DNS-এর availability ৯৯.৯৯% — একা থাকলে বছরে প্রায় ৫২.৬ মিনিট বন্ধ।
  2. Load balancer যোগ। এখন DNS এবং LB দুটিকেই চালু থাকতে হবে — তাই গুণ: ০.৯৯৯৯ × ০.৯৯৯ = ০.৯৯৮৯০০১। বছরে প্রায় ৯.৬৪ ঘণ্টা — LB একাই DNS-এর দশ গুণ downtime আনল।
  3. একটিমাত্র app server. ৯৯% মানে একার হিসাবে বছরে ৮৭.৬ ঘণ্টা বন্ধ — deploy, OS patch, crash মিলিয়ে। গুণফল ০.৯৮৮৯১১১, মোট downtime প্রায় ৯৭ ঘণ্টা।
  4. Database যোগ — শিকল সম্পূর্ণ। মোট ০.৯৮৭৯২২২, অর্থাৎ প্রায় ৯৮.৭৯ শতাংশ: বছরে ১০৫.৮ ঘণ্টা বা প্রায় ৪.৪ দিন বন্ধ — সবচেয়ে দুর্বল অংশটির (৯৯%) চেয়েও কম।
  5. মুখে মুখে হিসাব। প্রতিটির unavailability ছোট, তাই মোট U প্রায় যোগফল: ০.০০০১ + ০.০০১ + ০.০১ + ০.০০১ = ০.০১২১, আর A ≈ ০.৯৮৭৯ — সঠিক মানের প্রায় সমান। যোগফলেই ধরা পড়ে কে বেশি দায়ী: app server-এর ০.০১, মোটের প্রায় ৮৩ শতাংশ। Redundancy প্রথমে সেখানেই।

৫ · পূর্ণ উদাহরণ — DNS থেকে database পর্যন্ত একটি নকশা

একটি কাল্পনিক অনলাইন বাস-টিকিট সেবা ধরুন — ঈদের আগে রাত ৮টা থেকে ১০টায় সবচেয়ে বেশি ভিড়। নকশা (ছবি ৫.১): ফোন DNS থেকে ঠিকানা জেনে নেয়; অনুরোধ যায় একজোড়া load balancer-এর ভাগ করা virtual IP-তে; সেখান থেকে তিনটি stateless app server-এর যেকোনোটিতে; সব লেখা যায় database-এর primary-তে, যার প্রতিটি পরিবর্তন standby কপিতে চলে যায় (replication, পর্ব ২২)। Availability ধরা যাক (শেখার জন্য গোল সংখ্যা): DNS ৯৯.৯৯%, প্রতিটি LB ৯৯.৯%, প্রতিটি app server ৯৯%, প্রতিটি DB সার্ভার ৯৯.৯%; পিকে অন্তত ২টি app server লাগে।

উদাহরণের নকশা — কোন অংশ series, কোনটি parallel

Worked architecture: DNS → load balancer pair → 3 app servers → primary DB + standby

উদাহরণের architecture: DNS, LB জোড়া, তিনটি app server, DB primary ও standby ব্যবহারকারী ফোন · ব্রাউজার DNS A = 99.99% LB-1 (active) A = 99.9% LB-2 (standby) A = 99.9% App-1 A = 99% App-2 A = 99% App-3 A = 99% DB primary A = 99.9% DB standby A = 99.9% নাম → VIP ঠিকানা heartbeat ৩টির মধ্যে অন্তত ২টি লাগে replication → অনুরোধ → VIP series: DNS × LB জোড়া × App (২-of-৩) × DB জোড়া 0.9999 × 0.999999 × 0.999702 × 0.999999 ≈ 0.99960 → ৯৯.৯৬% · বছরে ≈ ৩.৫ ঘণ্টা
ছবি ৫.১ — ড্যাশ-দেওয়া বাক্স standby: স্বাভাবিক সময়ে অনুরোধ নেয় না, সক্রিয়টি পড়লে দায়িত্ব নেয়। চারটি স্তর series-এ; প্রতিটি স্তরের ভেতরে parallel বা k-of-n.

স্তর ধরে হিসাব: LB জোড়া ১ − ০.০০১২ = ০.৯৯৯৯৯৯; app স্তর (৩-এর মধ্যে ২) ০.৯৯৯৭০২; DB জোড়া ০.৯৯৯৯৯৯; DNS ০.৯৯৯৯। চার স্তর series-এ গুণ করলে ≈ ০.৯৯৯৬০০, অর্থাৎ ৯৯.৯৬% — বছরে প্রায় ৩.৫ ঘণ্টা; redundancy ছাড়া ছিল ৯৮.৭৯ শতাংশ। কোন বাড়তি অংশ কতটা দিল, ধাপে ধাপে দেখুন — চিহ্নিত বাক্সগুলো সেই ধাপে বদলেছে:

DNS
Load balancer
App server
Database
স্তরভিত্তিক availability আর মোট
পরিবর্তন
DNS স্তর
LB স্তর
App স্তর
DB স্তর
মোট A
বছরে downtime
সবচেয়ে বড় U
  1. শুরু: সব একটি করে। আগের stepper-এর হিসাব — ৯৮.৭৯%, বছরে প্রায় ১০৫.৮ ঘণ্টা বন্ধ। সবচেয়ে বড় U app server-এর ০.০১, তাই প্রথম হাত সেখানেই।
  2. App server তিনটি। পিকে অন্তত ২টি লাগে, তাই “৩-এর মধ্যে ২” (N+1): ০.৯৯৩ + ৩ × ০.৯৯২ × ০.০১ = ০.৯৯৯৭০২। মোট এক লাফে ৯৯.৭৬%, downtime প্রায় ২১ ঘণ্টা। এখন সবচেয়ে দুর্বল LB আর DB, দুটিরই U = ০.০০১।
  3. দ্বিতীয় LB. দুটি LB একটি virtual IP ভাগ করে; সক্রিয়টি মরলে standby ঠিকানাটি নিয়ে নেয় — একটি active-passive জোড়া। LB স্তর ০.৯৯৯৯৯৯; মোট ৯৯.৮৬%, বছরে প্রায় ১২.২৫ ঘণ্টা। আগে standby DB দিলেও একই ফল আসত — দুটির U সমান।
  4. Standby DB. Primary-র প্রতিটি পরিবর্তন standby-তে কপি হয়; primary মরলে standby দায়িত্ব নেয়। মোট ৯৯.৯৬% — বছরে প্রায় ৩.৫ ঘণ্টা। সবচেয়ে বড় U আবার app স্তরের ০.০০০২৯৮: “৩-এর মধ্যে ২” মানে মাত্র একটি ব্যর্থতা সহ্য করা।
  5. চতুর্থ app server (N+2). এখন ৪-এর মধ্যে ২টি লাগে — একটি deploy-এ বন্ধ থাকার সময় আরেকটি মরলেও সেবা চলে। মোট ৯৯.৯৮৯৪%, বছরে প্রায় ৫৬ মিনিট। এখন সবচেয়ে বড় U হলো DNS-এর ০.০০০১ — যাকে আমরা ছুঁইনি।
  6. দ্বিতীয় DNS প্রদানকারী — কাগজে পাঁচ nine-এর বেশি। মোট ৯৯.৯৯৯৪%, বছরে মাত্র ৩.১ মিনিট! কিন্তু হিসাবটি ধরে নিয়েছে failover মুহূর্তে হয় আর ব্যর্থতাগুলো স্বাধীন। অংশ ৬-এ দেখবেন, একটি DB failover-এই ৭৫ সেকেন্ড যেতে পারে; বছরে চারটি হলে ৫ মিনিট — কাগজের পুরো downtime-এর চেয়ে বেশি। এখন সংখ্যার চেয়ে অনুমানগুলো বেশি গুরুত্বপূর্ণ।

নিচের ক্যালকুলেটরে একই হিসাব; a বা designs বদলে নিজের architecture বসাতে পারেন।

// Worked design: DNS -> LB tier -> app tier -> DB tier, all in SERIES.
// Availability of ONE component (assumed, not measured); failures independent.
const a = { dns: 0.9999, lb: 0.999, app: 0.99, db: 0.999 };

const series = (...xs) => xs.reduce((p, x) => p * x, 1);  // all must work
const parallel = (x, n) => 1 - Math.pow(1 - x, n);          // any 1 of n works
function kOfN(k, n, x) {                     // at least k of n identical parts
  let sum = 0, c = 1;                        // c = C(n, i), the binomial number
  for (let i = 0; i <= n; i++) {
    if (i >= k) sum += c * Math.pow(x, i) * Math.pow(1 - x, n - i);
    c = c * (n - i) / (i + 1);
  }
  return sum;
}
const lb2 = parallel(a.lb, 2), db2 = parallel(a.db, 2);
const designs = [   // [name, dns, lb tier, app tier, db tier]
  ["1 LB, 1 app, 1 DB", a.dns, a.lb, a.app, a.db],
  ["+2 apps (need 2 of 3)", a.dns, a.lb, kOfN(2, 3, a.app), a.db],
  ["+second LB", a.dns, lb2, kOfN(2, 3, a.app), a.db],
  ["+standby DB", a.dns, lb2, kOfN(2, 3, a.app), db2],
  ["  (if 1 of 3 apps is enough)", a.dns, lb2, parallel(a.app, 3), db2],
  ["+4th app (need 2 of 4)", a.dns, lb2, kOfN(2, 4, a.app), db2],
  ["+second DNS provider", parallel(a.dns, 2), lb2, kOfN(2, 4, a.app), db2],
];
console.log("design".padEnd(30) + "total A".padEnd(11) + "downtime/year");
for (const [name, ...tiers] of designs) {
  const A = series(...tiers), h = (1 - A) * 8760;          // hours per year
  const down = h >= 1 ? h.toFixed(2) + " h" : (h * 60).toFixed(1) + " min";
  console.log(name.padEnd(30) + ((A * 100).toFixed(4) + "%").padEnd(11) + down);
}

আউটপুট:

design                        total A    downtime/year
1 LB, 1 app, 1 DB             98.7922%   105.80 h
+2 apps (need 2 of 3)         99.7604%   20.99 h
+second LB                    99.8601%   12.25 h
+standby DB                   99.9600%   3.50 h
  (if 1 of 3 apps is enough)  99.9897%   54.1 min
+4th app (need 2 of 4)        99.9894%   55.7 min
+second DNS provider          99.9994%   3.1 min

প্রথম চারটি আর শেষ দুটি সারি stepper-এর সাথে হুবহু মেলে। পঞ্চম সারিটি capacity-র দাম দেখায়: “৩-এর মধ্যে ১ হলেই চলে” ধরলে 99.9897%, কিন্তু সত্যিই ২টি লাগলে 99.9600% — বছরে প্রায় ৫৪ মিনিট বনাম সাড়ে ৩ ঘণ্টা। নিয়মটি সাধারণ: সবচেয়ে বড় U-তে আগে হাত দিন — তৃতীয় সারির পর আরও app server দিলে প্রায় কিছুই বদলাত না, কারণ তখন DB-র ০.০০১-ই সবচেয়ে বড়।

৬ · Redundancy, failover আর single point of failure

Redundancy মানে একই কাজের জন্য বাড়তি অংশ রাখা। বাড়তি অংশ কীভাবে কাজে নামবে, তার কয়েকটি ধরন — আর প্রতিটির দাম আলাদা।

⚡ Active-active

Active-active: সব কপি একসাথে অনুরোধ সামলায়। একটি পড়লে বাকিরা তার ভাগ নেয় — failover প্রায় তাৎক্ষণিক, শুধু health check-এর দেরি। শর্ত: বাকিদের হাতে বাড়তি capacity থাকতে হবে।

stateless app server, DNS server-এর বহর

⏸️ Active-passive

Active-passive: একটি কাজ করে, অন্যটি অপেক্ষায়। Hot standby চালু ও হালনাগাদ — সেকেন্ডে দায়িত্ব নেয়; warm standby — মিনিটে; cold standby বন্ধ বা backup থেকে বানাতে হয় — ঘণ্টায়।

database primary-standby, LB জোড়া

➕ N+1, N+2, 2N

N টি লাগলে N+1 টি রাখুন — যেকোনো একটি নষ্ট হলেও পূর্ণ capacity থাকে। N+2-তে একটি রক্ষণাবেক্ষণে থাকার সময় আরেকটি নষ্ট হলেও চলে। 2N মানে পুরো দ্বিগুণ — দামি, কিন্তু একটি পুরো দল হারালেও চলে।

সার্ভার, বিদ্যুৎ সরবরাহ, ডেটা সেন্টার

টের পাওয়া — health check আর heartbeat

কেউ ব্যর্থতা টের না পাওয়া পর্যন্ত failover শুরুই হয় না। Health check-এ load balancer বা monitor প্রতি কয়েক সেকেন্ডে সার্ভারকে জিজ্ঞেস করে (যেমন /health ঠিকানায় একটি অনুরোধ), পরপর কয়েকবার উত্তর না পেলে তাকে traffic থেকে সরায় (পর্ব ১৪)। Heartbeat-এ node নিজেই নিয়মিত “আমি বেঁচে আছি” পাঠায় (পর্ব ৪৪)। দুই ক্ষেত্রেই detection-এর সময় মোটামুটি বিরতি × কয়টি মিস হলে মৃত ঘোষণা: প্রতি ৫ সেকেন্ডে আর ৩টি মিসে প্রায় ১০–১৫ সেকেন্ড। বিরতি ছোট করলে দ্রুত ধরা পড়ে, কিন্তু নেটওয়ার্কের সামান্য ঝাঁকুনিতেই সুস্থ node-কে মৃত ভাবার ঝুঁকি বাড়ে — আর অকারণ failover নিজেই একটি বিভ্রাট। একটি ফাঁদও আছে: health check যদি database-ও যাচাই করে, DB-র এক মুহূর্তের ধীরতায় LB সব app server-কে একসাথে “অসুস্থ” ঘোষণা করতে পারে।

এবার সবচেয়ে কঠিন failover — database-এর active-passive জোড়া। ধাপগুলোর সময় যোগ করে দেখি, “স্বয়ংক্রিয়” failover-এও ব্যবহারকারী কতক্ষণ খালি হাতে থাকেন। সময়গুলো ধরা যাক; বাস্তবে সেটআপভেদে সেকেন্ড থেকে মিনিট।

  1. ব্যর্থতাt = 0 sprimary বন্ধ
  2. Detect+15 sheartbeat নেই
  3. Fence+5 sপুরোনোকে থামানো
  4. Promote+15 sstandby → primary
  5. Redirect+30 sনতুন ঠিকানা
  6. স্বাভাবিক+10 sreconnect
ঘড়ি আর downtime-এর খাতা
ঘড়ি
ব্যবহারকারী যা দেখছেন
এই ধাপের সময়
জমা downtime
  1. t = ০: primary-র power supply নষ্ট। রাত ৯টা, ঈদের টিকিট বিক্রি চলছে। Database-এর primary হঠাৎ বন্ধ; লেখার অনুরোধ ঝুলে আছে — ব্যবহারকারী দেখছেন ঘুরতে থাকা চাকা। Downtime-এর ঘড়ি চালু, কিন্তু সিস্টেম এখনো জানেই না।
  2. Detect: ১৫ সেকেন্ড। Monitor প্রতি ৫ সেকেন্ডে primary-র heartbeat আশা করে; পরপর ৩টি না এলে “মৃত” ঘোষণা। একটিতেই নয় কেন? একটি heartbeat নেটওয়ার্কে হারাতেই পারে — তাড়াহুড়ো করলে অকারণ failover হবে। এই ১৫ সেকেন্ডই এই ঘটনার MTTD.
  3. Fence: ৫ সেকেন্ড। Standby-কে primary বানানোর আগে পুরোনোটিকে নিশ্চিতভাবে থামাতে হয় — হয়তো সে মরেনি, শুধু বিচ্ছিন্ন। ফিরে এসে সেও লেখা নিলে দুটি primary — ডেটা দুই দিকে ভাগ। তাই management port দিয়ে তার বিদ্যুৎ বন্ধ বা storage-এ প্রবেশ কেটে দেওয়া হয়।
  4. Promote: ১৫ সেকেন্ড। Standby বাকি replication log চালিয়ে read-write primary হয়। Replication asynchronous হলে শেষ কয়েকটি commit হয়তো standby-তে পৌঁছায়নি — সেগুলো হারাতে পারে (পর্ব ২২)।
  5. Redirect: ৩০ সেকেন্ড। Client-রা এখনো পুরোনো ঠিকানায় যাচ্ছে। Virtual IP সরানো বা DNS রেকর্ড বদলানো হলো — কিন্তু DNS-এর TTL ৩০ সেকেন্ড হলে কিছু app server আরও কিছুক্ষণ পুরোনো ঠিকানা মনে রাখে।
  6. স্বাভাবিক: মোট ৭৫ সেকেন্ড। Connection pool নতুন সংযোগ খুলল, retry সফল। খাতা: ১৫ + ৫ + ১৫ + ৩০ + ১০ = ৭৫ সেকেন্ড। বছরে এমন ৪টি failover = ৫ মিনিট — পাঁচ nine-এর পুরো বার্ষিক বাজেটের (৫.২৬ মিনিট) প্রায় ৯৫ শতাংশ। আর নতুন standby না বানানো পর্যন্ত redundancy নেই। তাই প্রতিটি ধাপই ছোট করতে হয়: দ্রুত detect, স্বয়ংক্রিয় promote, কম TTL বা সরাসরি service discovery.

Failover-এর সবচেয়ে বড় বিপদ: split-brain. নেটওয়ার্ক ভাগ হলে পুরোনো primary হয়তো বেঁচেই আছে, শুধু monitor তাকে দেখছে না। Promote-এর পর দুজনেই লেখা নিলে একই সিট দুজনের কাছে বিক্রি হতে পারে। তাই promote-এর আগে fencing, আর কে primary তা ঠিক করতে প্রায়ই quorum বা consensus লাগে (পর্ব ৪২ আর ৪৩)। Asynchronous replication-এ কতটা সাম্প্রতিক লেখা হারানো চলে, সেই লক্ষ্যের নাম RPO (পর্ব ৫১)।

Single point of failure খোঁজা

Single point of failure (SPOF) এমন একটি অংশ, যার একার ব্যর্থতায় পুরো সেবা বন্ধ। পদ্ধতি সরল কিন্তু ধৈর্যের: অনুরোধের পুরো পথ আঁকুন — প্রতিটি বাক্স আর প্রতিটি তীর — তারপর প্রতিটিকে জিজ্ঞেস করুন, “এটি একা মারা গেলে কি সেবা বন্ধ?” সার্ভার আর database সবাই দেখেন; বিপদ লুকিয়ে থাকে কম চোখে পড়া জায়গায়:

লুকানো SPOFকেন বিপজ্জনকপ্রতিকার
DNS প্রদানকারীDNS না চললে সব সার্ভার সুস্থ থাকলেও কেউ ঠিকানা পায় না; ২০১৬ সালের অক্টোবরে একটি বড় DNS প্রদানকারীর (Dyn) ওপর DDoS আক্রমণে বহু পরিচিত ওয়েবসাইট কয়েক ঘণ্টা অনেকের কাছে অচল ছিলদুটি স্বাধীন DNS প্রদানকারী; যুক্তিসংগত TTL
TLS সার্টিফিকেটমেয়াদ ফুরালে ব্রাউজার সব সার্ভারের সংযোগ একসাথে প্রত্যাখ্যান করেস্বয়ংক্রিয় নবায়ন (ACME), আগাম alert
একটি নেটওয়ার্ক লিংক বা ISPএকটি ফাইবার কাটা পড়লে পুরো ডেটা সেন্টার বিচ্ছিন্নভিন্ন পথে দুটি লিংক, দুটি ISP
বাইরের সেবা (payment gateway, SMS)তাদের availability আপনার পথে series-এ বসেবিকল্প প্রদানকারী, queue-তে রেখে পরে চেষ্টা
একজন মানুষশুধু একজন জানেন deploy বা restore কীভাবে হয়লিখিত runbook, অন্তত দুজনের অনুশীলন

৭ · Failure domain আর correlated failure — যখন স্বাধীনতা ভেঙে পড়ে

Parallel-এর সূত্রে দুটি ৯৯.৯% সার্ভার দেয় ৯৯.৯৯৯৯ শতাংশ। কিন্তু দুটিই যদি একই rack-এ, একই বিদ্যুৎ-স্ট্রিপে থাকে? Rack-এর বিদ্যুৎ গেলে দুটিই একসাথে বন্ধ — “স্বাধীন” অনুমান মিথ্যা। এমন একসাথে ব্যর্থতাকে বলে correlated failure, আর যে সীমানার ভেতরের সবকিছু একটি ঘটনায় একসাথে পড়তে পারে, তাকে failure domain.

Failure domain-এর স্তর — ভেতর থেকে বাইরে

Process → server → rack → power and cooling → availability zone / data centre → region

Failure domain-এর ছয়টি স্তর Region — বড় দুর্যোগ, আঞ্চলিক বিভ্রাট Availability zone / ডেটা সেন্টার বিদ্যুৎ ও কুলিং — গ্রিড, জেনারেটর, UPS Rack — ToR switch, PDU Server — ডিস্ক, PSU, kernel Process — bug, memory শেষ restart করলে সেকেন্ডে ফেরে
ছবি ৫.২ — বাইরের স্তর যত বড়, তার ব্যর্থতা তত বিরল, কিন্তু একসাথে তত বেশি জিনিস হারায় — অর্থাৎ blast radius তত বড়। কপিগুলো যে স্তরে আলাদা, শুধু সেই স্তর পর্যন্ত ব্যর্থতা থেকে সুরক্ষা মেলে।

বেশিরভাগ বড় cloud প্রদানকারী একটি region-এর ভেতরে কয়েকটি availability zone রাখে — আলাদা বিদ্যুৎ, কুলিং আর নেটওয়ার্কসহ এক বা একাধিক ডেটা সেন্টার, যাতে একটির বিপর্যয় অন্যটিতে না ছড়ায়। নাম, দূরত্ব আর নিশ্চয়তা প্রদানকারীভেদে আলাদা; নিজের প্রদানকারীর ডকুমেন্টেশন দেখে নেবেন।

সাধারণ অংশকে আলাদা করে series-এ বসানোই correlated failure হিসাবে আনার সহজ কৌশল। ধরা যাক rack-এর বিদ্যুৎ আর switch মিলে availability ৯৯.৯৫%, প্রতিটি সার্ভার ৯৯.৯%:

  • একই rack-এ দুটি সার্ভার: A = ০.৯৯৯৫ × (১ − ০.০০১২) ≈ ০.৯৯৯৪৯৯ — প্রায় ৯৯.৯৫%, বছরে ৪.৩৯ ঘণ্টা। কাগজের ৯৯.৯৯৯৯% কোথায় গেল? Rack একাই series-এ বসে সব খেয়ে ফেলেছে।
  • আলাদা rack-এ, আলাদা বিদ্যুতে: প্রতিটি পথ ০.৯৯৯৫ × ০.৯৯৯ = ০.৯৯৮৫০০৫; দুটি parallel: ১ − (০.০০১৪৯৯৫)২ ≈ ০.৯৯৯৯৯৮ — বছরে প্রায় ১.২ মিনিট।

একই সার্ভার, একই খরচ — শুধু কোথায় বসালেন তাতে বছরে ৪ ঘণ্টার বেশি বনাম ১ মিনিট। কপিগুলোকে আলাদা failure domain-এ ছড়ানোর এই নিয়মকে বলে anti-affinity. Zone-স্তরে capacity-র হিসাবও আসে: ৩টি zone-এ সমানভাবে ছড়ানো সেবায় একটি zone হারালে বাকি দুটিকে পুরো load নিতে হয় — প্রতিটির ক্ষমতা লাগে পিকের ৫০%, মোট ১৫০%; দুটি zone হলে মোট ২০০%.

উৎসকীভাবে সব কপি একসাথে পড়েপ্রতিরক্ষা
একই বিদ্যুৎ বা নেটওয়ার্কrack-এর PDU, ডেটা সেন্টারের জেনারেটর, এলাকার গ্রিড — বাংলাদেশে গ্রিড বিপর্যয়ে দেশের বড় অংশ কয়েক ঘণ্টা বিদ্যুৎহীন থাকার ঘটনাও ঘটেছেকপি আলাদা rack, zone বা region-এ; জেনারেটরে যথেষ্ট জ্বালানি
একই config pushএকটি ভুল config একসাথে সব সার্ভারে পৌঁছালধাপে ধাপে ছড়ানো (canary), স্বয়ংক্রিয় rollback
সব কপিতে একই bugএকই কোড একই ইনপুটে বা একই মুহূর্তে সবখানে crash করে — যেমন ২০১২ সালের একটি leap second-এ Linux-এর একটি bug-এ বহু সাইটের সার্ভার একসাথে বিপদে পড়েছিল বলে খবর আসেধাপে ধাপে rollout, সংস্করণে বৈচিত্র্য
ভাগ করা নির্ভরতাসব কপি একই auth সার্ভিস বা একই DNS-এর ওপরনির্ভরতার নিজের redundancy, cache, timeout
Overload-এর ঢেউএকটি পড়ায় বাকিদের ঘাড়ে বাড়তি load, তারাও পড়ে (cascading failure)বাড়তি capacity, load shedding (পর্ব ১৮), circuit breaker (পর্ব ৪৮)

সব বাঁচাতে না পারলে মূল কাজটি বাঁচান। টিকিট সেবার “প্রস্তাবিত রুট” অংশের সার্ভিস বন্ধ হলে পুরো পাতা ভাঙার দরকার নেই — জনপ্রিয় রুটের একটি স্থির তালিকাই যথেষ্ট; ছবির সার্ভার ধীর হলে ছবি ছাড়াই পাতা। এই নীতির নাম graceful degradation: কম গুরুত্বের সুবিধা ছেড়ে মূল কাজ (সিট বেছে টাকা দেওয়া) চালু রাখা। কোনটা আগে ছাড়বেন আর overload-এ কীভাবে load shedding করবেন — পর্ব ১৮-এ।

৮ · Durability-র হিসাব আর SLO — কতটা যথেষ্ট

কপির সংখ্যা আর ডেটা হারানোর সম্ভাবনা

Durability-র সবচেয়ে সরল হাতিয়ার replication factor — একটি ডেটা-খণ্ডের কয়টি কপি আলাদা ডিস্কে রাখা হবে। একটি সরল শিক্ষণ-মডেল (বাস্তব কোনো সিস্টেম নয়) দিয়ে দেখি: ডিস্ক স্বাধীনভাবে, স্থির হারে নষ্ট হয়; ধরা যাক বছরে ২% ডিস্ক নষ্ট হয় (মাঠ-গবেষণায় বছরে কয়েক শতাংশ পর্যন্ত পাওয়া গেছে — OS কোর্সের RAID পর্ব দেখুন); একটি কপি হারালে সিস্টেম R ঘণ্টায় নতুন কপি বানায়। ডেটা হারায় কেবল তখন, যখন নতুন কপি তৈরির আগেই সব কপি মারা যায়। r টি কপির জন্য হারানোর হার ≈ r! · λr · Rr − 1, যেখানে λ প্রতি ডিস্ক-ঘণ্টায় নষ্ট হওয়ার হার। যুক্তি: প্রথম ব্যর্থতা আসে r·λ হারে; মেরামতের R ঘণ্টায় বাকি r − ১টির একটি মরার সম্ভাবনা প্রায় (r − ১)·λ·R; এভাবে শেষ কপি পর্যন্ত গুণ।

// Durability of ONE chunk of data kept as r copies on r different disks.
// SIMPLE TEXTBOOK MODEL, not a real system: disks fail independently at a
// constant rate; a lost copy is re-created within R hours; the chunk is lost
// only if every copy dies before re-replication. Loss rate = r! * lambda^r * R^(r-1)
const AFR = 0.02;                              // assumed: 2% of disks fail per year
const lambda = -Math.log(1 - AFR) / 8760;      // failures per disk-hour
const fact = (n) => (n <= 1 ? 1 : n * fact(n - 1));

function lossPerYear(r, R) {
  const perHour = fact(r) * Math.pow(lambda, r) * Math.pow(R, r - 1);
  return 1 - Math.exp(-perHour * 8760);        // P(chunk lost within a year)
}
console.log("copies  repair  P(loss)/year  nines");
for (const [r, R] of [[1, 24], [2, 24], [3, 24], [3, 1], [3, 168]]) {
  const p = lossPerYear(r, R);
  console.log(String(r).padEnd(8) + (R + " h").padEnd(8) +
              p.toExponential(2).padEnd(14) + (-Math.log10(p)).toFixed(1));
}

আউটপুট:

copies  repair  P(loss)/year  nines
1       24 h    2.00e-2       1.7
2       24 h    2.24e-6       5.7
3       24 h    3.71e-10      9.4
3       1 h     6.45e-13      12.2
3       168 h   1.82e-8       7.7

একটি কপি মানে বছরে 2.00e-2 — প্রতি ৫০টি খণ্ডে একটি হারায়। দুটি কপিতে 2.24e-6 (সাড়ে পাঁচ nine-এর একটু বেশি), তিনটিতে 3.71e-10 (৯.৪ nine) — প্রতিটি বাড়তি কপি সম্ভাবনাকে কয়েক হাজার গুণ কমায়। শেষ দুই সারি সূত্রের R২ দেখায়: নতুন কপি বানাতে ১ ঘণ্টা লাগলে ১২.২ nine, এক সপ্তাহ লাগলে ৭.৭ nine — durability-তেও MTTR-ই রাজা। তাই বড় storage সিস্টেম হারানো কপি অনেক সার্ভার থেকে সমান্তরালে দ্রুত পুনর্গঠন করে।

এই সংখ্যাগুলো আশাবাদী। মডেলটি ব্যর্থতা স্বাধীন ধরেছে — কিন্তু তিনটি কপি একই rack-এ থাকলে একটি বিদ্যুৎ-বিভ্রাট তিনটিকেই নেয়; তাই কপিগুলো আলাদা failure domain-এ রাখা বাধ্যতামূলক। কোটি কোটি খণ্ড থাকলে “কোনো একটি খণ্ড হারানো”-র সম্ভাবনাও অনেক বেশি। আর replication ভুলও কপি করে: ভুল করে মুছে ফেলা বা bug-এ নষ্ট ডেটা তিনটি কপিতেই পৌঁছে যায় — তার প্রতিকার সময়ে পিছিয়ে যাওয়ার মতো backup (পর্ব ৫১)।

পূর্ণ কপির বিকল্প erasure coding: ধরুন ডেটাকে ৬টি টুকরোয় ভাগ করে আরও ৩টি parity টুকরো বানানো হলো; ৯টির যেকোনো ৬টি থাকলেই পুরো ডেটা ফেরে। যেকোনো ৩টি হারানো সহ্য করে, অথচ জায়গা লাগে ৯ ÷ ৬ = ১.৫ গুণ — তিন কপির ৩ গুণের অর্ধেক। দাম: লেখা, পড়া আর পুনর্গঠনে বেশি হিসাব ও নেটওয়ার্ক। বিস্তারিত পর্ব ২৬-এ।

SLI, SLO, SLA আর error budget — একটি ঝলক

শব্দমানেউদাহরণ
SLIমাপা সংখ্যা — সেবা আসলে কেমন চলছেসফল অনুরোধের অনুপাত; ৩০০ ms-এর মধ্যে উত্তর পাওয়া অনুরোধের অনুপাত
SLOদলের নিজের লক্ষ্য, একটি সময়-জানালায়৩০ দিনে ৯৯.৯% অনুরোধ সফল
SLAগ্রাহকের সাথে চুক্তি; না মানলে ক্ষতিপূরণমাসে ৯৯.৫%-এর কম হলে বিলের একটি অংশ ফেরত (credit)

SLA সাধারণত SLO-র চেয়ে ঢিলা রাখা হয়, যাতে চুক্তি ভাঙার আগেই দল সতর্ক হয়। SLO থেকে আসে error budget: ১০০% − SLO. ৩০ দিনে ৯৯.৯% SLO মানে বাজেট ৪৩.২ মিনিট, বা সেই মাসে ১ কোটি অনুরোধ এলে ১০,০০০টি ব্যর্থ অনুরোধ। মাসের মাঝেই বাজেট প্রায় শেষ হলে ঝুঁকিপূর্ণ release থামিয়ে নির্ভরযোগ্যতার কাজে মন দেওয়া হয়; বাজেট বাকি থাকলে দল সাহস করে নতুন জিনিস ছাড়ে। এই চর্চা জনপ্রিয় করেছে Google-এর SRE বই (২০১৬)। SLI মাপা, alert বানানো আর বাজেটের নিয়ম চালানো — পর্ব ৫০-এ।

আরও গভীরে: Google-এর গবেষকদের “Availability in Globally Distributed Storage Systems” (OSDI ২০১০) দেখায়, তাদের storage-এ ডেটা অপ্রাপ্য হওয়ার পেছনে সবচেয়ে বড় ভূমিকা একসাথে অনেক node হারানোর (correlated) ঘটনার — তাই স্বাধীন ব্যর্থতা ধরে নেওয়া মডেল বাস্তবের চেয়ে অনেক ভালো ফল দেখায়। Cidon ও সহকর্মীদের “Copysets” (USENIX ATC ২০১৩) দেখায়, কপিগুলো কোন কোন সার্ভারের দলে রাখা হবে তা সাজিয়ে এমন গণ-ব্যর্থতায় ডেটা হারানোর ঘটনা বহুগুণ কমানো যায়। উপরের r! · λr · Rr − 1 সূত্রটি আসলে একটি Markov-chain মডেলের (কয়টি কপি বেঁচে আছে — সেই অবস্থাগুলোর মাঝে ব্যর্থতা ও মেরামতের হার) আসন্ন সমাধান; RAID-এর MTTDL-ও একই পথে আসে।

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

  • ৯৯.৯৯% availability-তে বছরে কত downtime? — (১ − ০.৯৯৯৯) × ৫,২৫,৬০০ মিনিট ≈ ৫২.৬ মিনিট।
  • MTBF ৯৯৯ ঘণ্টা, MTTR ১ ঘণ্টা হলে availability? — ৯৯৯ ÷ (৯৯৯ + ১) = ৯৯.৯%; MTTR অর্ধেক করা আর MTBF দ্বিগুণ করা একই উন্নতি।
  • দুটি ৯৯% সার্ভার series আর parallel-এ? — series-এ ৯৮.০১%, parallel-এ ১ − ০.০১২ = ৯৯.৯৯% — যদি ব্যর্থতা স্বাধীন আর একটি সার্ভারই যথেষ্ট হয়।
  • Single point of failure কীভাবে খুঁজবেন? — অনুরোধের পুরো পথ এঁকে প্রতিটি অংশ (DNS, সার্টিফিকেট, config, বাইরের সেবা, মানুষ) ধরে জিজ্ঞেস করুন: এটি একা মরলে কি সেবা বন্ধ? তারপর ভাগ করা failure domain খুঁজুন।

৯ · AI-এর যুগে availability-র নকশা যাচাই

“আমার অ্যাপকে ৯৯.৯৯% available বানাও” লিখলে AI এক নিমেষে বাক্স আর তীরে ভরা নকশা দেবে। কিন্তু availability-র প্রশ্নে কিছু ভুল AI প্রায় নিয়ম করে করে:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
“দুটি replica দিলেই ৯৯.৯৯৯৯%”স্বাধীন ব্যর্থতা, শূন্য failover-সময় আর পূর্ণ capacity চুপচাপ ধরে নেয়ভাগ করা rack, zone, config series-এ বসিয়ে আবার হিসাব; failover-এর সেকেন্ড যোগ
অঙ্কের ভুলavailability যোগ করে, series-parallel গুলিয়ে ফেলে, বা ৯৯.৯%-কে বছরে ৮৭ ঘণ্টা বলেক্যালকুলেটরে নিজে আবার হিসাব
“Kafka, Redis আর microservices যোগ করুন”redundancy ছাড়া প্রতিটি নতুন অংশ series-এ বসে availability কমায়; ছোট সেবায় অকারণ জটিলতাপ্রতিটি অংশ কেন লাগবে জিজ্ঞেস করুন
বানানো SLA বা সীমাcloud পণ্যের SLA আত্মবিশ্বাসের সাথে লিখে দেয়; আসল সংখ্যা স্তর, অঞ্চল আর সময়ভেদে আলাদাপ্রদানকারীর অফিসিয়াল ডকুমেন্টেশন
Failover-এর পর ডেটা “consistent” থাকবে বলাACID-এর consistency আর replica-গুলোর consistency (CAP অর্থে, পর্ব ৪০) আলাদা; asynchronous replication-এ লেখা হারাতে পারেreplication-এর ধরন আর RPO জিজ্ঞেস করুন
“Replication থাকলে backup লাগে না”ভুল করে মুছে ফেলা ডেটাও replication সব কপিতে পৌঁছে দেয়point-in-time backup আর restore-মহড়া দেখুন

AI-কে কাজে লাগান হিসাব যাচাই আর ঝুঁকির তালিকায় — সংখ্যা আর অনুমান নিজে দিন, উত্তরে অনুমানগুলো আলাদা করে চান:

আমি একটি কাল্পনিক অনলাইন বাস-টিকিট সেবার availability হিসাব করছি। নকশা: DNS (৯৯.৯৯%) → দুটি load balancer, active-passive (প্রতিটি ৯৯.৯%) → ৩টি app server, পিকে অন্তত ২টি লাগে (প্রতিটি ৯৯%) → database primary + standby (প্রতিটি ৯৯.৯ শতাংশ)। ১. প্রতিটি স্তরের আর মোট availability সূত্রসহ ধাপে ধাপে হিসাব করো; বছরে downtime ঘণ্টায় দাও। ২. কোন কোন অনুমান ধরলে (স্বাধীন ব্যর্থতা, failover-এর সময়, capacity) — আলাদা তালিকা দাও। ৩. প্রতিটি DB failover-এ ৭৫ সেকেন্ড আর বছরে ৪টি failover ধরলে ফল কতটা বদলায়? ৪. সবচেয়ে বড় ৩টি single point of failure আর correlated failure-এর ঝুঁকি বলো। ৫. কোনো cloud পণ্যের SLA, সীমা বা দাম নিজে থেকে লিখবে না; দরকার হলে লিখবে "অফিসিয়াল ডকুমেন্টেশনে যাচাই করতে হবে"।

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

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

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

প্র ০১আরেকটি nine যোগ করলেই তো ভালো — ১০০% availability কেন লক্ষ্য হতে পারে না?

প্রতিটি nine downtime-কে দশ ভাগের এক ভাগে নামায়, কিন্তু খরচ সাধারণত তার চেয়েও দ্রুত বাড়ে। ৯৯.৯% পাওয়া যায় একটি zone-এ redundancy আর মানুষের হাতে সারানো দিয়ে; ৯৯.৯৯%-এ লাগে স্বয়ংক্রিয় failover, একাধিক zone, দিনরাত on-call; ৯৯.৯৯৯%-এ লাগে একাধিক region, প্রতিটি deploy-এর সতর্ক rollout আর প্রতিটি নির্ভরতারও সমান মানের availability.

Google-এর Site Reliability Engineering বই (২০১৬) স্পষ্ট যুক্তি দেয়: প্রায় কোনো সেবার জন্যই ১০০% সঠিক লক্ষ্য নয়। ব্যবহারকারী আপনার সেবা পান তাঁর ফোন, Wi-Fi, মোবাইল নেটওয়ার্ক আর ISP-র ভেতর দিয়ে — সেগুলোর নিজের availability আপনার লক্ষ্যের চেয়ে অনেক কম। বইটির উদাহরণে, ৯৯% নির্ভরযোগ্য স্মার্টফোনের ব্যবহারকারী ৯৯.৯৯% আর ৯৯.৯৯৯% সেবার পার্থক্য টেরই পান না — শেষ nine-টির খরচ তাঁর অভিজ্ঞতায় প্রায় কিছুই যোগ করে না।

দ্বিতীয় যুক্তি error budget. লক্ষ্য ১০০% হলে কোনো ঝুঁকিই নেওয়া চলে না — নতুন feature, নতুন সংস্করণ, পরীক্ষা সব বন্ধ। ৯৯.৯% লক্ষ্য দলকে মাসে প্রায় ৪৩ মিনিটের “ভুল করার জায়গা” দেয়, যা দিয়ে তারা দ্রুত নতুন জিনিস ছাড়তে পারে।

তৃতীয়ত, series-এর নিয়ম: checkout পথে যদি ৯৯.৯% availability-র একটি বাইরের payment gateway থাকে, বিকল্প পথ না রেখে সেই পথে ৯৯.৯%-এর বেশি পাওয়াই যাবে না। তাই লক্ষ্য ঠিক করার প্রশ্ন: প্রতি মিনিট বন্ধ থাকার ক্ষতি কত (টাকা পাঠানো বনাম মাসিক রিপোর্ট)? ব্যবহারকারী আসলে কী টের পান? নির্ভরতাগুলো কতটা দিতে পারে?

মূল উপলব্ধি: availability-র লক্ষ্য আসে ব্যবহারকারী আর ব্যবসার প্রয়োজন থেকে; প্রতিটি nine কিনতে হয় টাকা, জটিলতা আর গতির বিনিময়ে — দরকারের চেয়ে বেশি কেনা অপচয়।

প্র ০২সবখানে redundancy থাকার পরও পুরো সেবা একসাথে বন্ধ হয় কেন? Cloudflare (২০১৯) আর CrowdStrike (২০২৪) থেকে কী শেখার আছে?

২০১৯ সালের ২ জুলাই Cloudflare-এর বিশ্বজুড়ে ছড়ানো নেটওয়ার্ক প্রায় ২৭ মিনিট বিপর্যস্ত ছিল। প্রতিষ্ঠানটির প্রকাশিত বিশ্লেষণ অনুযায়ী, web application firewall-এর একটি নতুন নিয়মে এমন একটি regular expression ছিল, যা কিছু ইনপুটে বিপুল backtracking করে। নিয়মটি একসাথে সব জায়গায় ছড়ানো হয়েছিল, তাই প্রায় সব edge সার্ভারের CPU একই সময়ে পুরো ব্যস্ত হয়ে পড়ে। শত শত ডেটা সেন্টারের redundancy কাজে আসেনি — কারণ ব্যর্থতার কারণ একটিই, আর সেটি সবখানে পৌঁছেছিল একই মুহূর্তে।

২০২৪ সালের ১৯ জুলাই CrowdStrike-এর Falcon নিরাপত্তা-সফটওয়্যারের একটি ত্রুটিপূর্ণ content update Windows কম্পিউটারগুলোকে চালু হওয়ার সময়ই crash করাতে থাকে। Microsoft-এর অনুমান অনুযায়ী প্রায় ৮৫ লাখ যন্ত্র আক্রান্ত হয়; বিমান সংস্থা, ব্যাংক, হাসপাতালের কাজ ব্যাহত হয়। অনেক যন্ত্রে মানুষকে হাতে হাতে ঠিক করতে হয়েছে — MTTR বিশাল।

দুই ঘটনার মিল: একটি পরিবর্তন একসাথে সব কপিতে পৌঁছানো একটি common-mode fault. Parallel-এর সূত্রে দুটি কপি একসাথে বন্ধ থাকার সম্ভাবনা U২ — কিন্তু “সবখানে একই ভুল push” হলে সেই সম্ভাবনা আসলে push-টি ভুল হওয়ার সম্ভাবনার সমান, যা U২-এর চেয়ে বহু গুণ বড়।

প্রতিরক্ষা তাই redundancy-র বাইরে: (১) ধাপে ধাপে rollout — প্রথমে ১%, তারপর একটি zone, তারপর বাকিরা — প্রতিটি ধাপের পর স্বাস্থ্য-সংকেত দেখে এগোনো; (২) config-কে কোডের মতোই পরীক্ষা ও review; (৩) স্বয়ংক্রিয় rollback; (৪) সেবাকে স্বাধীন “cell”-এ ভাগ করা, যাতে একটি ভুলের blast radius সীমিত থাকে।

মূল উপলব্ধি: availability-র বড় শত্রু প্রায়ই আমাদের নিজেদের পরিবর্তন; redundancy স্বাধীন ব্যর্থতা ঠেকায়, আর ধাপে ধাপে ছড়ানো ঠেকায় একসাথে সবখানে ব্যর্থতা।

প্র ০৩Jim Gray জিজ্ঞেস করেছিলেন, কম্পিউটার থামে কেন। তাঁর উত্তর থেকে MTTR কমানোর দর্শন কীভাবে এলো?

১৯৮৫ সালে Jim Gray (পরে Turing Award পান) Tandem কোম্পানির fault-tolerant কম্পিউটারের মাঠ-তথ্য বিশ্লেষণ করে একটি প্রতিবেদন লেখেন: “Why Do Computers Stop and What Can Be Done About It?” তাঁর পর্যবেক্ষণ — redundancy-র কারণে হার্ডওয়্যার তখনই খুব নির্ভরযোগ্য হয়ে উঠেছিল; বেশিরভাগ বিভ্রাট আসছিল পরিচালনার ভুল (মানুষ ভুল কমান্ড দিলেন, ভুল config বসালেন) আর সফটওয়্যারের bug থেকে।

তিনি আরও দেখান, production-এ টিকে থাকা অনেক সফটওয়্যার-bug ক্ষণস্থায়ী — নির্দিষ্ট সময়, নির্দিষ্ট ক্রম বা race condition-এ ঘটে, আবার চালালে প্রায়ই আর ঘটে না। এমন bug-এর জন্য তাঁর লেখায় জনপ্রিয় হয় “Heisenbug” শব্দটি। এর মানে, ব্যর্থ প্রসেসের জায়গায় একটি backup প্রসেস নতুন অবস্থা থেকে আবার চেষ্টা করলে কাজটি সাধারণত সফল হয়। Tandem-এর “process pair” এই বুদ্ধিতেই চলত।

এই ভাবনা পরে আরও স্পষ্ট হয়। ২০০০-এর দশকের শুরুতে Berkeley আর Stanford-এর Recovery-Oriented Computing প্রকল্প বলে: ব্যর্থতা ঠেকানো যাবে না, তাই দ্রুত পুনরুদ্ধারের জন্য নকশা করুন। Candea আর Fox-এর “Crash-Only Software” (২০০৩) প্রস্তাব করে, সফটওয়্যার এমনভাবে বানানো হোক যাতে হঠাৎ বন্ধ হয়ে আবার চালু হওয়াই তার স্বাভাবিক, নিরাপদ আর দ্রুত পুনরুদ্ধার-পথ হয়।

আজকের চর্চায় এর ছাপ সর্বত্র: container crash করলে orchestrator নিজেই আবার চালায়; health check অসুস্থ instance সরিয়ে দেয়; feature flag দিয়ে এক মুহূর্তে নতুন feature বন্ধ করা যায়; deploy খারাপ হলে এক ক্লিকে rollback. সবকটির লক্ষ্য একটাই — MTTR কমানো। সূত্রটি মনে করুন: U ≈ MTTR ÷ MTBF. সব ধরনের ব্যর্থতার MTBF বাড়ানো অসম্ভব রকম কঠিন, কিন্তু একটি ভালো পুনরুদ্ধার-ব্যবস্থা সব ধরনের ব্যর্থতার MTTR একসাথে কমায়।

মূল উপলব্ধি: “কখনো ব্যর্থ হবে না” এমন সিস্টেম বানানো যায় না; বানানো যায় এমন সিস্টেম, যা দ্রুত টের পায় আর দ্রুত নিজেকে সারায়।

প্র ০৪Replication থাকলে কি আলাদা backup লাগে? ২০১৭ সালের GitLab-এর ঘটনা কী বলে?

২০১৭ সালের ৩১ জানুয়ারি GitLab.com-এর database-এ একটি বড় বিপর্যয় ঘটে, যার বিস্তারিত বিবরণ প্রতিষ্ঠানটি নিজেই প্রকাশ করেছিল। Spam-এর চাপে secondary database-এর replication পিছিয়ে পড়ছিল। সেটি ঠিক করতে গিয়ে একজন প্রকৌশলী ভুল সার্ভারে — primary-তে — ডেটার ফোল্ডার মোছার কমান্ড চালান; থামানোর আগেই প্রায় ৩০০ GB ডেটা মুছে যায়।

এরপর দেখা গেল, কাগজে কয়েক রকম backup ব্যবস্থা থাকলেও সেগুলোর কয়েকটি আসলে কাজ করছিল না, আর কোনো সতর্কবার্তাও আসেনি। শেষ পর্যন্ত staging-এর জন্য প্রায় ৬ ঘণ্টা আগে নেওয়া একটি কপি থেকে ডেটা ফেরানো হয় — সেই সময়ের issue, মন্তব্য আর অন্যান্য database-তথ্য স্থায়ীভাবে হারায়, যদিও git repository-গুলো নিরাপদ ছিল।

শিক্ষাগুলো এই পর্বের ধারণার সাথে সরাসরি মেলে। প্রথম, replication availability বাড়ায় আর ডিস্ক বা সার্ভার হারানো থেকে বাঁচায়, কিন্তু যুক্তির ভুল থেকে নয় — ভুল DELETE, ভুল migration বা নষ্ট ডেটা সব কপিতেই মুহূর্তে পৌঁছে যায়। তার প্রতিকার সময়ে পিছিয়ে যাওয়ার ক্ষমতা: point-in-time recovery. দ্বিতীয়, যে backup থেকে কখনো restore করে দেখা হয়নি, তা আসলে backup কি না জানা নেই — নিয়মিত restore-মহড়া লাগে। তৃতীয়, backup রাখতে হয় আলাদা failure domain-এ — আলাদা সার্ভার, আলাদা অঞ্চল, সম্ভব হলে আলাদা অ্যাকাউন্টে।

আর durability-র “অনেকগুলো nine” সাধারণত ডিস্ক নষ্ট হওয়ার মতো হার্ডওয়্যার-ঝুঁকির মডেল থেকে আসে; মানুষ বা সফটওয়্যারের ভুল তার হিসাবের বাইরে। ঘটনাটির একটি ভালো দিকও শেখার মতো: প্রতিষ্ঠানটি খোলাখুলি পূর্ণ বিশ্লেষণ প্রকাশ করেছিল — দোষারোপ নয়, ব্যবস্থার দুর্বলতা খোঁজা।

মূল উপলব্ধি: replication চলমান কপি দেয়, backup দেয় অতীতে ফেরার পথ; দুটি আলাদা ঝুঁকির উত্তর, একটি অন্যটির বিকল্প নয়।

প্র ০৫স্বয়ংক্রিয় failover কি সবসময় ভালো? GitHub-এর ২০১৮ সালের “৪৩ সেকেন্ড” থেকে কী শিখি?

২০১৮ সালের ২১ অক্টোবর GitHub-এ রুটিন রক্ষণাবেক্ষণের সময় যুক্তরাষ্ট্রের পূর্ব উপকূলের একটি network hub আর সেখানকার প্রধান ডেটা সেন্টারের মধ্যে সংযোগ ৪৩ সেকেন্ডের জন্য বিচ্ছিন্ন হয়। প্রতিষ্ঠানটির প্রকাশিত বিশ্লেষণ অনুযায়ী, এই অল্প সময়েই তাদের database-এর topology সামলানোর স্বয়ংক্রিয় ব্যবস্থা (Orchestrator) পশ্চিম উপকূলের database-গুলোকে primary বানিয়ে দেয়।

সংযোগ ফেরার পর দেখা গেল, পূর্ব উপকূলে কিছু লেখা রয়ে গেছে যা পশ্চিমে পৌঁছায়নি, আর ততক্ষণে পশ্চিমের নতুন primary-তেও নতুন লেখা জমছে — দুই দিকে দুই রকম ইতিহাস। তার ওপর পূর্ব উপকূলের app server-গুলোকে এখন দেশের অন্য প্রান্তের database-এ যেতে হচ্ছিল, ফলে সব কিছু ধীর। GitHub ডেটার শুদ্ধতাকে প্রাধান্য দেয়: backup থেকে ফেরানো আর দুই দিকের লেখা মেলানোর কাজে সেবা প্রায় ২৪ ঘণ্টা ১১ মিনিট ধরে আংশিক বিঘ্নিত থাকে।

শিক্ষা: ৪৩ সেকেন্ডের বিচ্ছিন্নতা নিজে সামান্য ঘটনা; বিপর্যয় বানিয়েছিল তার প্রতিক্রিয়া। Failover নিজেই একটি ঝুঁকিপূর্ণ পরিবর্তন, তাই নকশায় কয়েকটি প্রশ্নের উত্তর লাগে। Detection কতটা সংবেদনশীল — ক্ষণিকের বিচ্ছিন্নতায়ও কি failover হবে? যে লেখাগুলো এখনো replicate হয়নি, তাদের কী হবে (RPO)? Failover-এর পর latency কেমন হবে? আর ফিরে আসার পথ কী?

অনেক প্রতিষ্ঠান তাই একই zone বা region-এর ভেতরে স্বয়ংক্রিয় failover রাখে, কিন্তু region পেরোনো failover-এ মানুষের অনুমোদন চায়। ৭৫ সেকেন্ডের stepper যেমন failover-এর খরচ দেখায়, তেমনি ভুল failover-এর খরচও হিসাবে আনতে হয় — কখনো কয়েক সেকেন্ড অপেক্ষা করাই বেশি নিরাপদ।

মূল উপলব্ধি: দ্রুত failover MTTR কমায়, কিন্তু ভুল failover নতুন বিপর্যয় তৈরি করে; detection-এর সংবেদনশীলতা, ডেটার সামঞ্জস্য আর ফেরার পথ — তিনটিই নকশার অংশ।

অনুশীলন

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

  1. Error budget-এর হিসাব: একটি সেবার SLO হলো ৩০ দিনে ৯৯.৯৫%. (ক) মাসে সর্বোচ্চ কতক্ষণ বন্ধ থাকা চলে? (খ) মাসের প্রথম তিন সপ্তাহে দুটি বিভ্রাটে ৯ আর ৭ মিনিট গেছে — বাকি বাজেট কত? (গ) একই হার ৩৬৫ দিনের বছরে কত দাঁড়ায়? (ঘ) মাসে ২ কোটি অনুরোধ এলে অনুরোধভিত্তিক বাজেট কত?

    (ক) (১ − ০.৯৯৯৫) × ৪৩,২০০ মিনিট = ০.০০০৫ × ৪৩,২০০ = ২১.৬ মিনিট, অর্থাৎ ২১ মিনিট ৩৬ সেকেন্ড।

    (খ) ২১.৬ − (৯ + ৭) = ৫.৬ মিনিট = ৫ মিনিট ৩৬ সেকেন্ড বাকি — আরেকটি ছোট বিভ্রাটেই শেষ; এখন ঝুঁকিপূর্ণ deploy থামিয়ে আগের দুই ঘটনার কারণ সারানোই যুক্তিসংগত।

    (গ) ০.০০০৫ × ৮,৭৬০ ঘণ্টা = ৪.৩৮ ঘণ্টা = ৪ ঘণ্টা ২২ মিনিট ৪৮ সেকেন্ড।

    (ঘ) ০.০০০৫ × ২,০০,০০,০০০ = ১০,০০০টি ব্যর্থ অনুরোধ। Traffic সমান না হলে দুই বাজেট সমান খরচ হয় না — পিকের ৫ মিনিটের বিভ্রাট রাত ৩টার ৫ মিনিটের চেয়ে অনুরোধের বাজেট অনেক বেশি খায়।

  2. মিশ্র নকশার availability: একটি কাল্পনিক অনলাইন ভর্তি-আবেদন সেবা: CDN (৯৯.৯৯%) → দুটি API gateway, যেকোনো একটি যথেষ্ট (প্রতিটি ৯৯.৫%) → একটি auth সার্ভিস (৯৯.৯%) → তিনটি app server, যেকোনো একটি যথেষ্ট (প্রতিটি ৯৮%) → একটি database (৯৯.৯৫ শতাংশ)। ব্যর্থতা স্বাধীন ধরে মোট availability আর বছরে downtime বের করুন। কোন অংশে আগে redundancy দেবেন, আর কোথায় দেওয়া অর্থহীন?

    Gateway জোড়া: ১ − ০.০০৫২ = ০.৯৯৯৯৭৫। App স্তর: ১ − ০.০২৩ = ০.৯৯৯৯৯২। মোট = ০.৯৯৯৯ × ০.৯৯৯৯৭৫ × ০.৯৯৯ × ০.৯৯৯৯৯২ × ০.৯৯৯৫ ≈ ০.৯৯৮৩৬৮, অর্থাৎ প্রায় ৯৯.৮৪% — বছরে প্রায় ১৪.৩ ঘণ্টা বন্ধ।

    U-এর যোগফলে দোষী খুঁজুন: ০.০০০১ + ০.০০০০২৫ + ০.০০১ + ০.০০০০০৮ + ০.০০০৫ = ০.০০১৬৩৩। সবচেয়ে বড় auth সার্ভিস (০.০০১, প্রায় ৬১%), তারপর database (০.০০০৫)। Auth জোড়া করলে মোট প্রায় ৯৯.৯৩৭% (বছরে ≈ ৫.৫৫ ঘণ্টা); সাথে database-এ standby দিলে প্রায় ৯৯.৯৮৭% (বছরে ≈ ৭০.৬ মিনিট)। চতুর্থ app server প্রায় অর্থহীন — ওই স্তরের U মাত্র ০.০০০০০৮; তবে ভর্তির শেষ দিনের ভিড়ে “একটিই যথেষ্ট” অনুমান ভাঙলে k-of-n দিয়ে আবার হিসাব লাগবে।

  3. আউটপুট অনুমান করুন, তারপর সিদ্ধান্ত নিন: (ক) অংশ ৩-এর Monte Carlo কোডে const MTBF = 500, MTTR = 2; একবার MTBF = 1000, MTTR = 2 আর একবার MTBF = 500, MTTR = 1 করলে প্রথম লাইনে কী ছাপা হবে? বছরে ব্যর্থতার সংখ্যা দুই ক্ষেত্রে কেমন? আগে লিখে রাখুন, তারপর চালিয়ে মিলিয়ে নিন। (খ) একটি কাল্পনিক payment সার্ভিস গড়ে ৪০০ ঘণ্টা পরপর ব্যর্থ হয়, প্রতিবার ঠিক হতে গড়ে ৩ ঘণ্টা লাগে (যার ১ ঘণ্টা শুধু টের পেতে)। বিকল্প A: ভালো হার্ডওয়্যার আর কঠোর code review — MTBF ৮০০ ঘণ্টা। বিকল্প B: ভালো alert আর স্বয়ংক্রিয় rollback — MTTR ৩০ মিনিট। কোনটি বেশি লাভের?

    (ক) দুই ক্ষেত্রেই প্রথম লাইন formula A = MTBF/(MTBF+MTTR) = 0.998004 — ১০০০/১০০২ আর ৫০০/৫০১ একই ভগ্নাংশ। ১,০০০ বছরের simulation দেয় 0.998006 (৮,৭৭০টি ব্যর্থতা) আর 0.997994 (১৭,৫২৭টি)। দুই ক্ষেত্রেই বছরে প্রায় ১৭.৫ ঘণ্টা বন্ধ, কিন্তু প্রথমটিতে বছরে প্রায় ৯টি দুই ঘণ্টার বিভ্রাট, দ্বিতীয়টিতে প্রায় ১৭–১৮টি এক ঘণ্টার — একই availability, ভিন্ন অভিজ্ঞতা।

    (খ) এখন: ৪০০ ÷ ৪০৩ ≈ ৯৯.২৬%, বছরে প্রায় ৬৫.২ ঘণ্টা। A: ৮০০ ÷ ৮০৩ ≈ ৯৯.৬৩%, প্রায় ৩২.৭ ঘণ্টা। B: ৪০০ ÷ ৪০০.৫ ≈ ৯৯.৮৮%, প্রায় ১০.৯ ঘণ্টা। দুটো একসাথে: ৮০০ ÷ ৮০০.৫ ≈ ৯৯.৯৪%, প্রায় ৫.৫ ঘণ্টা। B একাই A-র চেয়ে তিন গুণ কম downtime দেয় — MTTR ছয় ভাগের এক ভাগে নামল, MTBF মাত্র দ্বিগুণ হলো; তার ওপর B সব ধরনের ব্যর্থতায় কাজ করে।

  4. Single point of failure খুঁজুন: একটি কাল্পনিক অনলাইন ফলাফল-প্রকাশের সেবা: একটি DNS প্রদানকারী → একটি load balancer → দুটি app server (একই rack ও power strip-এ) → একটি database সার্ভার, যার রাতের backup থাকে সেই সার্ভারেরই আরেকটি ডিস্কে। আপলোড করা ছবি থাকে app server-1-এর ডিস্কে; TLS সার্টিফিকেট হাতে নবায়ন হয়; deploy আর restore জানেন শুধু একজন প্রকৌশলী। সব SPOF আর correlated ঝুঁকি খুঁজে অগ্রাধিকারসহ প্রতিকার লিখুন।
    1. Database একা, backup একই সার্ভারে — সবচেয়ে বড় ঝুঁকি: সার্ভার গেলে সেবা আর backup দুটিই যায়। প্রতিকার: আলাদা rack বা zone-এ standby, অন্য জায়গায় backup, point-in-time recovery আর restore-মহড়া।
    2. ছবি app server-1-এর ডিস্কে — server-1 একটি লুকানো SPOF; server-2 ছবি দেখাতেই পারে না। প্রতিকার: ছবি object storage-এ (পর্ব ২৬), app server stateless.
    3. একটি load balancer — জোড়া (active-passive, virtual IP) বা প্রদানকারীর managed load balancer.
    4. দুটি app server একই rack ও power strip-এ — correlated failure; আলাদা rack বা zone-এ সরানো।
    5. হাতে নবায়ন করা সার্টিফিকেট — মেয়াদ ফুরালে সব একসাথে বন্ধ; স্বয়ংক্রিয় নবায়ন (ACME) আর আগাম alert.
    6. একজন প্রকৌশলী — লিখিত runbook, দ্বিতীয় একজনের অনুশীলন, স্বয়ংক্রিয় deploy.
    7. DNS প্রদানকারী — ফলাফলের দিনের মতো উচ্চ-ঝুঁকির দিনে দ্বিতীয় প্রদানকারী বিবেচনা।

    আর ফলাফলের দিনের হঠাৎ ভিড়ও availability-র প্রশ্ন: স্থির ফলাফল-পাতা CDN-এ cache আর graceful degradation (পর্ব ১৮) না থাকলে সব সার্ভার সুস্থ থেকেও সেবা অচল হতে পারে।

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

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

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

  1. 💥 Primary-র heartbeat আসা বন্ধ হলো
  2. 🔍 পরপর কয়েকটি heartbeat না পেয়ে monitor primary-কে মৃত ঘোষণা করল
  3. 🔒 পুরোনো primary-কে fencing করে লেখা থেকে বিচ্ছিন্ন করা হলো
  4. ⬆️ Standby বাকি replication log চালিয়ে primary হলো
  5. 🔀 Virtual IP বা DNS বদলে client-দের নতুন primary-তে পাঠানো হলো
  6. 🛠️ নতুন একটি standby বানিয়ে redundancy ফেরানো হলো

একটি সেবার availability ৯৯.৯৯% (৩৬৫ দিনের বছর ধরে)। বছরে সর্বোচ্চ প্রায় কত সময় বন্ধ থাকতে পারে?

  • ৮.৭৬ ঘণ্টা
  • প্রায় ৫২.৬ মিনিট
  • প্রায় ৫.২৬ মিনিট
  • প্রায় ৪.৩২ মিনিট

দুটি load balancer parallel-এ (প্রতিটি ৯৯%, যেকোনো একটি যথেষ্ট, ব্যর্থতা স্বাধীন), তার পরে series-এ একটি database (৯৯.৯ শতাংশ)। মোট availability কত?

  • ৯৮.০১%
  • ৯৯.৯৯%
  • প্রায় ৯৯.৮৯%
  • ৯৯.৯%

একটি সার্ভিস গড়ে ৫০০ ঘণ্টা পরপর ব্যর্থ হয়, প্রতিবার সারাতে গড়ে ২ ঘণ্টা লাগে। নিচের কোন একক পরিবর্তনে availability সবচেয়ে বেশি বাড়বে?

  • MTBF বাড়িয়ে ৭৫০ ঘণ্টা
  • MTBF বাড়িয়ে ৯০০ ঘণ্টা
  • MTTR কমিয়ে ১.৫ ঘণ্টা
  • MTTR কমিয়ে ১ ঘণ্টা

দুটি database replica-র parallel হিসাব কাগজে ৯৯.৯৯৯৯% দেখাচ্ছে, কিন্তু দুটিই একই rack-এর একই power supply-তে চলে। কোন কথাটি সঠিক?

  • ভাগ করা power supply series-এ বসে; মোট availability তার availability-র বেশি হতে পারে না
  • Replica দুটি, তাই কাগজের হিসাবই ঠিক
  • একই rack-এ তৃতীয় replica যোগ করলেই সমস্যা মিটবে
  • Parallel হিসাবে replica-র availability-গুলো যোগ করতে হয়

একটি API-র SLO: ৩০ দিনে ৯৯.৯% অনুরোধ সফল হবে। ওই ৩০ দিনে ১ কোটি অনুরোধ এলে error budget কতটি ব্যর্থ অনুরোধ?

  • ১,০০০টি
  • ৪৩,২০০টি
  • ১০,০০০টি
  • ১,০০,০০০টি

একটি সার্ভারের ডিস্ক নষ্ট হলো, কিন্তু ডেটার অন্য কপি থাকায় সেবা চলতেই থাকল; ব্যবহারকারী কিছুই টের পেলেন না। এখানে কী ঘটেছে?

  • একটি failure ঘটেছে, কারণ ডিস্ক নষ্ট
  • একটি fault ঘটেছে, কিন্তু fault tolerance থাকায় failure হয়নি
  • Availability কমেছে, কারণ একটি ডিস্ক কম
  • Durability ভেঙেছে, কারণ একটি কপি হারিয়েছে

শব্দকোষ

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

মনে রাখুন

  1. Availability (এখন কাজ করছে কি), reliability (সময় জুড়ে না থেমে চলা), durability (ডেটা না হারানো) — তিনটি আলাদা মাপ; fault অংশের, failure পুরো সেবার।
  2. প্রতিটি nine downtime দশ ভাগের এক ভাগে নামায়: ৯৯.৯% ≈ বছরে ৮.৭৬ ঘণ্টা, ৯৯.৯৯% ≈ ৫২.৬ মিনিট, ৯৯.৯৯৯% ≈ ৫.২৬ মিনিট।
  3. A = MTBF ÷ (MTBF + MTTR), আর U ≈ MTTR ÷ MTBF — দ্রুত টের পাওয়া আর দ্রুত সারানো প্রায়ই সবচেয়ে সস্তা উন্নতি।
  4. Series-এ A = ∏Ai, parallel-এ A = 1 − ∏(1 − Ai); capacity লাগলে k-of-n — সবই স্বাধীন ব্যর্থতার অনুমানে, আর সবচেয়ে বড় U-তে আগে হাত।
  5. Redundancy-র সাথে লাগে failover-এর সময়ের হিসাব, fencing, আলাদা failure domain-এ কপি, ধাপে ধাপে rollout আর SPOF খোঁজা — নইলে কাগজের nine বাস্তবে আসে না।

পরের পর্বে: requirement, হিসাব, latency আর availability-র যন্ত্রপাতি জোগাড় হলো। এবার এগুলো জুড়ে একটি নকশা শুরু থেকে শেষ পর্যন্ত কীভাবে এগোয়: requirement থেকে API, data model আর deep dive.

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

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