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

Incident management — severity, ভূমিকা, runbook আর postmortem

Incident Management — Severity, Roles, Runbooks and Postmortems

Taught in Bangla, this lesson puts mitigation before root cause, builds a severity matrix, walks the five-step incident lifecycle, and assigns commander, ops, comms and scribe roles. It covers status pages and update rhythm, runbooks and when rollback is unsafe, calculates MTTD, MTTA, MTTR and MTBF with simulators, shows the limits of averages, and writes blameless postmortems through a fictional Eid sale outage.

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

  • Incident চেনা, severity ঠিক করা আর নমুনা matrix বানানো
  • Detect থেকে learn পর্যন্ত পাঁচ ধাপ, আর প্রতিটি ধাপে কে কী করেন
  • Commander, ops, comms আর scribe-এর কাজ ভাগ করা, পালা বদলানো
  • ভেতরের channel, status page, আপডেটের ছন্দ আর লেখার ছাঁচ
  • ভালো runbook লেখা, আর rollback কখন নিরাপদ নয়, তা চেনা
  • MTTD, MTTA, MTTR, MTBF হিসাব করা, আর গড়ের সীমা বোঝা
  • Blameless postmortem লেখা, 5 Whys-এর সীমা জানা, game day আর on-call-এর ভার সামলানো

এই পর্বের উদাহরণ সম্পর্কে: ঈদ সেলের অ্যাপ, দলের নাম, সময় আর সব সংখ্যা কাল্পনিক। চালানো যায় এমন কোড নমুনা ডেটায় চলে। বাস্তব প্রতিষ্ঠানের ঘটনা শুধু তাদের প্রকাশিত বিবরণ থেকে নেওয়া, আর সংখ্যাগুলো আনুমানিক।

১ · Incident কী, আর কতটা গুরুতর

রাত ৮টা। ঈদের সেল চলছে, হঠাৎ ক্রেতারা পেমেন্ট করতে পারছেন না। ফোন বাজছে, চ্যাটে দশজন একসাথে লিখছেন, কেউ জানেন না কে কী করছেন। সমস্যা শুধু সিস্টেমে নয়, মানুষের সমন্বয়েও। Incident management হলো এই বিশৃঙ্খলার জন্য আগে থেকে ঠিক করা নিয়ম।

Incident হলো এমন অপরিকল্পিত ঘটনা, যা সেবার ক্ষতি করছে বা করার ঝুঁকি তৈরি করেছে, আর যার জন্য এখনই সমন্বিত সাড়া দরকার। সংজ্ঞা প্রতিষ্ঠান-ভেদে একটু আলাদা। ITIL কাঠামো একে সেবার অপরিকল্পিত বিঘ্ন বা মান কমে যাওয়া বলে। সেখানে “problem” আলাদা জিনিস: incident-এর কাজ সেবা ফেরানো, problem-এর কাজ মূল কারণ দূর করা।

প্রতিটি bug incident নয়। প্রতিটি alert-ও নয়। Google-এর Site Reliability Engineering (২০১৬) বইয়ের ১৪তম অধ্যায় তিনটি প্রশ্ন দেয়: দ্বিতীয় কোনো দল লাগছে? গ্রাহক কি টের পাচ্ছেন? এক ঘণ্টা মন দিয়ে কাজ করেও কি সমাধান হয়নি? একটিরও উত্তর “হ্যাঁ” হলে ঘোষণা করা ভালো। দেরিতে ঘোষণার চেয়ে আগে ঘোষণা করে দ্রুত বন্ধ করা সস্তা। নিরাপত্তা-ঘটনায় একই ধরনের কাঠামোকে incident response বলা হয়, যা পর্ব ৩৪-এর সাথে মেলে।

হাসপাতালের জরুরি বিভাগ ভাবুন। রোগী এলেই ডাক্তার রোগের ইতিহাস পড়তে বসেন না। আগে দেখেন কে কতটা সংকটে, এটাই triage. তারপর রক্তপাত বন্ধ করেন, অর্থাৎ অবস্থা স্থির করেন। আসল রোগ খোঁজা হয় পরে। Severity হলো সেই সংকটের মাত্রা, mitigation হলো রক্তপাত বন্ধ করা।

নমুনা severity matrix

Severity-র কোনো সর্বজনীন মান নেই। কেউ চার স্তর রাখেন, কেউ পাঁচ, কেউ P1-P4 বলেন। নিচের matrix-টি একটি নমুনা। আপনার দল নিজের ব্যবসা অনুযায়ী এটি বদলাবে। তবে নিয়মটি লিখে রাখা জরুরি, যাতে রাত ৩টায় কেউ তর্ক না করেন।

স্তরপ্রভাবউদাহরণসাড়াআপডেট
Sev-1মূল কাজ বহু মানুষের জন্য বন্ধ, অথবা ডেটা হারানো বা ফাঁসের সন্দেহচেকআউট ব্যর্থ, login বন্ধএখনই page, দিন-রাত; commander বাধ্যতামূলক৩০ মিনিটে
Sev-2মূল কাজ আংশিক ক্ষতিগ্রস্ত, বিকল্প পথ থাকতে পারেএকটি পেমেন্ট পথ বন্ধএখনই page; commander প্রয়োজনমতো৬০ মিনিটে
Sev-3গৌণ feature ক্ষতিগ্রস্ত, বিকল্প আছেSearch ধীরকাজের সময়ে দল দেখবেদিনে একবার
Sev-4ব্যবহারকারীর ওপর আসল প্রভাব নেইAdmin পাতায় ভাঙা ছবিBacklog-এ ticketলাগে না

নিচের simulator একই নীতিকে কোডে লিখেছে। ইনপুট বদলে দেখুন স্তর কীভাবে বদলায়। শেষের নিয়মটি খেয়াল করুন: নিশ্চিত না হলে এক স্তর ওপরে। Severity পরে নামানো সহজ, কিন্তু দেরিতে ডাকা মানুষ দেরির ক্ষতি ফেরাতে পারেন না।

// Severity classifier. A sample policy, not a standard: edit it for your team.
const ORDER = ['SEV-1', 'SEV-2', 'SEV-3', 'SEV-4'];

function classify(c) {
  let level = 3, why = 'no real user impact';
  if (c.users >= 1) { level = 2; why = 'some users hit, flow not core'; }
  if (c.core && (c.users >= 5 || c.err >= 5)) { level = 1; why = 'core flow hurt'; }
  if (c.core && c.users >= 25 && c.err >= 50 && !c.workaround) {
    level = 0; why = 'core flow down for many, no workaround';
  }
  if (c.data) { level = 0; why = 'data loss or leak suspected'; }
  if (c.unsure && level > 0) { level -= 1; why += ', raised: unsure'; }
  return [ORDER[level], why];
}

// users = % of users hit, err = % of requests failing in that flow
const cases = [
  { name: 'Checkout in Eid sale', users: 80, err: 62, core: true },
  { name: 'One payment gateway', users: 15, err: 100, core: true, workaround: true },
  { name: 'Search is slow',       users: 40, err: 3 },
  { name: 'Admin logo broken',    users: 0,  err: 0 },
  { name: 'Possible data leak',   users: 0.1, err: 0, data: true },
  { name: 'Reviews empty',        users: 30, err: 20, unsure: true },
];

for (const c of cases) {
  const [sev, why] = classify(c);
  console.log(sev + '  ' + c.name.padEnd(21) + why);
}

আউটপুট:

SEV-1  Checkout in Eid sale core flow down for many, no workaround
SEV-2  One payment gateway  core flow hurt
SEV-3  Search is slow       some users hit, flow not core
SEV-4  Admin logo broken    no real user impact
SEV-1  Possible data leak   data loss or leak suspected
SEV-2  Reviews empty        some users hit, flow not core, raised: unsure

“Possible data leak”-এ আক্রান্ত মাত্র ০.১%, তবু Sev-1, কারণ ডেটার ঝুঁকি সংখ্যা দিয়ে মাপা যায় না। “Reviews empty” নীতিতে Sev-3 হতো, কিন্তু unsure তাকে Sev-2-তে তুলেছে। স্তর নির্ভর করে মানুষের ক্ষতির ওপর, কোন server কত গরম তার ওপর নয়।

২ · পাঁচ ধাপের জীবনচক্র: আগে ক্ষতি থামান

Incident-এর পথ মোটামুটি একই পাঁচ ধাপে চলে। নামগুলো বইভেদে বদলায়, ক্রম প্রায় বদলায় না।

  1. Detect (ধরা): alert, গ্রাহকের অভিযোগ বা dashboard থেকে জানা গেল কিছু ভুল। পর্ব ৬৬-এর SLO alert এখানে কাজে আসে।
  2. Triage (গুরুত্ব বিচার): প্রভাব কত, severity কত, কাকে ডাকতে হবে।
  3. Mitigate (ক্ষতি থামানো): কারণ পুরো না জেনেও গ্রাহকের কষ্ট বন্ধ করা। Rollback, traffic সরানো, feature বন্ধ করা, বাড়তি capacity.
  4. Resolve (মীমাংসা): সেবা স্থির, ঝুঁকি কেটে গেছে, incident বন্ধ ঘোষণা।
  5. Learn (শেখা): postmortem, কাজের তালিকা, আর সেই শিক্ষা আবার detection আর runbook-এ ফেরত।

Incident-এর জীবনচক্র আর কোন ধাপে কোন ভূমিকা

Left: five stages. Right: who holds which role during each stage

Detect, Triage, Mitigate, Resolve আর Learn ধাপ, পাশে প্রতিটি ভূমিকার সময়কাল ধাপকে আছেন ১. Detect২. Triage৩. Mitigate৪. Resolve৫. Learn alert বা অভিযোগপ্রভাব, severity, ডাকক্ষতি থামানো, rollbackস্থির, all-clearpostmortem, কাজ শিক্ষা ফিরে যায় alert আর runbook-এ On-call Commander Ops lead Comms lead Scribe Postmortemowner
ছবি ৬৭.১ — ধাপ এগোয়, ভূমিকা জোড়ে। শেষ ধাপের শিক্ষা আবার প্রথম ধাপকে শক্ত করে।

কেন কারণের আগে ক্ষতি থামানো

প্রকৌশলীর স্বভাব হলো কারণ খোঁজা। কিন্তু SRE বইয়ের Effective Troubleshooting অধ্যায় ঠিক উল্টো পরামর্শ দেয়: বড় outage-এ root cause খোঁজার তাড়না সামলে আগে সিস্টেমকে পরিস্থিতি অনুযায়ী যতটা সম্ভব সচল করুন। কারণ সহজ। প্রতিটি মিনিট গ্রাহক কষ্ট পাচ্ছেন, আর কারণ খুঁজতে অনেক সময় ঘণ্টা লেগে যায়। ট্রান্সফরমার পুড়লে আগে বিকল্প লাইনে বিদ্যুৎ দেওয়া হয়, তদন্ত পরে।

Mitigation মানে সমাধান নয়। সেটি একটি অস্থায়ী কৌশল, যার পরে আসল কাজ বাকি থাকে। সাধারণ হাতিয়ারগুলো হলো: আগের version-এ ফেরা, kill switch দিয়ে feature বন্ধ, অন্য zone বা region-এ traffic সরানো, capacity বাড়ানো, আর rate limit দিয়ে চাপ কমানো।

দুটি ব্যতিক্রম মনে রাখুন। নিরাপত্তা-ঘটনায় server মুছে ফেললে প্রমাণ হারায়, তাই আগে আলাদা করুন, log আর snapshot রাখুন। ডেটা নষ্ট হওয়ার ঘটনায় তাড়াহুড়োর লেখা ক্ষতি বাড়াতে পারে, তাই আগে লেখা থামানো দরকার হতে পারে।

৩ · ভূমিকা: কে নির্দেশ দেন, কে হাত দেন

সবচেয়ে সাধারণ ভুল হলো সবাই মিলে সবকিছু করা। দুজন একই server restart করছেন, কেউ গ্রাহককে জানাচ্ছেন না, ম্যানেজার প্রতি মিনিটে ops প্রকৌশলীকে প্রশ্ন করছেন। ভূমিকা ভাগ করলে এই গোলমাল কমে। চারটি মূল ভূমিকা:

ভূমিকাকাজযা করেন না
Incident commanderপুরো ঘটনার মালিক। দল গড়েন, অগ্রাধিকার ঠিক করেন, severity বদলান, মানুষ ডাকেননিজে command চালান না
Ops leadসিস্টেমে আসল পরিবর্তন করেন বা ছোট দলকে দিয়ে করানগ্রাহকের সাথে কথা বলেন না
Comms leadStatus page, ব্যবস্থাপনা, গ্রাহক সেবা দলকে নিয়মিত জানানকারণ নিয়ে অনুমান প্রকাশ করেন না
Scribeসময়সহ সিদ্ধান্ত, পদক্ষেপ, প্রশ্ন লিখে রাখেনসিদ্ধান্ত নেন না

এই ধারণা এসেছে আগুন নেভানোর জগৎ থেকে। Incident Command System (ICS) ১৯৭০-এর দশকে ক্যালিফোর্নিয়ার বড় দাবানলের অভিজ্ঞতা থেকে গড়ে ওঠে বলে সাধারণত বলা হয়, যখন একাধিক সংস্থা একসাথে কাজ করতে গিয়ে সমন্বয়ে আটকে যাচ্ছিল। পরে যুক্তরাষ্ট্রের FEMA তার জাতীয় incident ব্যবস্থাপনা কাঠামোয় (NIMS) একে জায়গা দেয়। তাই FEMA এর প্রচারক হিসেবে পরিচিত, মূল স্রষ্টা হিসেবে নয়। Google-এর SRE বই (২০১৬, অধ্যায় ১৪) জানায়, তাদের ব্যবস্থা ICS-এর ওপর দাঁড়ানো, আর সেখানে চতুর্থ ভূমিকা “planning lead”, যিনি নথি, bug আর পালা বদল সামলান। “Scribe” নামটি PagerDuty-র প্রকাশিত নির্দেশিকার মতো জায়গায় দেখা যায়। নাম আলাদা হলেও ভাগটি একই। SRE Workbook (২০১৮) লক্ষ্যগুলোকে তিন C-তে বলে: coordinate, communicate, control.

ছোট দলে একজনই দুই ভূমিকা নিতে পারেন। কিন্তু commander আর ops একই ব্যক্তি হলে মাথা কমান্ডে ডুবে যায়, পুরো ছবি কেউ দেখেন না। নিচে দেখুন একজন commander কীভাবে ধাপে ধাপে কাজ ভাগ করে দেন। ঘটনাটি অংশ ৮-এর ঈদ সেলের outage.

এই মুহূর্তে কে কোন ভূমিকায়
সময়
Commander
Ops lead
Comms lead
Scribe
  1. এক মাথায় চার টুপি। On-call রাফি Sev-1 ঘোষণা করেছেন। Commander না আসা পর্যন্ত চারটি ভূমিকাই তাঁর। এটি বৈধ, কিন্তু কয়েক মিনিটের বেশি টেকে না।
  2. স্পষ্ট হস্তান্তর। নাদিয়া channel-এ লিখলেন, “আমি এখন incident commander.” রাফি লিখলেন, “নিশ্চিত।” দুজনেই নিশ্চিত না করলে কেউ জানেন না নেতৃত্ব বদলেছে।
  3. Comms সরে গেল। নাদিয়া মিতুকে comms দিলেন। এখন থেকে ম্যানেজারের প্রশ্ন মিতু সামলাবেন, রাফির মন থাকবে সিস্টেমে।
  4. Scribe এলেন। তানভীর সময়সহ লিখতে শুরু করলেন। রাফি এখন শুধু ops. এক ব্যক্তি, এক কাজ।
  5. Commander চাপ দেখছেন। Rollback শেষ, তবু error ৯%. রাফি একা deployment আর database দুই দিকে দেখছেন। Commander-এর কাজ হলো এই ভার চোখে দেখা, নিজে command চালানো নয়।
  6. Ops ভাগ। নাদিয়া database on-call ইমরানকে ডাকলেন। রাফি checkout দেখবেন, ইমরান database. প্রতিটি কাজের একজন নাম-ধরা মালিক আছেন। ICS-এর পরামর্শ, একজন নেতার অধীনে সাধারণত ৩ থেকে ৭ জন।
  7. দীর্ঘ ঘটনায় পালা বদল। এই ধাপটি কল্পনা: ঘটনা চার ঘণ্টা গড়ালে নাদিয়া ক্লান্ত। তিনি সাদিয়াকে handoff দেন তিন লাইনে: এখনকার অবস্থা, কে কী করছেন, পরের আপডেট কখন। ক্লান্ত commander ভুল সিদ্ধান্ত নেন, তাই পালা বদল দুর্বলতা নয়।

৪ · যোগাযোগ: channel, status page আর আপডেটের ছন্দ

গ্রাহকের কাছে নীরবতা মানে কেউ কিছু করছে না। ঠিক যেমন লঞ্চ দেরি হলে ঘাটে ঘোষণা না থাকলে যাত্রীরা অস্থির হন। মাইকে “আরও ৪০ মিনিট লাগবে, পরের খবর ৯টায়” বললে ভিড় অনেক শান্ত থাকে, যদিও লঞ্চ একই দেরিতে আসে।

  • ভেতরের channel: প্রতিটি incident-এর একটি আলাদা chat channel, যেমন #inc-eid-checkout. কাজের সব কথা সেখানে, যাতে সময়সহ লেখা থাকে। প্রয়োজনে একটি voice call. সিদ্ধান্তগুলো আবার channel-এ লিখুন।
  • Status page: গ্রাহকদের জন্য সেবার অবস্থা জানানোর পাতা। প্রচলিত ধাপ: Investigating, Identified, Monitoring, Resolved.
  • আপডেটের ছন্দ: Sev-1-এ ধরা যাক প্রতি ৩০ মিনিটে, নতুন খবর না থাকলেও। “এখনো কাজ চলছে” নিজেই একটি খবর। প্রতিটি আপডেটে পরের আপডেটের সময় লিখুন।

Status page আপনার নিজের সিস্টেমের ওপর রাখবেন না। Amazon-এর প্রকাশিত ফেব্রুয়ারি ২০১৭-র S3 outage-এর সারাংশে আছে, Service Health Dashboard-এর administration console নিজেই S3-এর ওপর নির্ভরশীল ছিল, তাই প্রথম দিকে সেটি আপডেট করা যায়নি। আলাদা provider, আলাদা domain আর আলাদা DNS ভাবুন।

চাপের মধ্যে ভালো লেখা কঠিন, তাই ছাঁচ আগে থেকে লিখে রাখুন। নিচের দুটি নমুনায় খেয়াল করুন: গ্রাহকের বার্তায় কারণের অনুমান নেই, নিজের দলের দোষ নেই, ব্যক্তির নাম নেই, কিন্তু প্রভাব আর পরের সময়টি স্পষ্ট।

# ভেতরের আপডেট (ছাঁচ)
[SEV-1] checkout, 20:30 আপডেট
প্রভাব: চেকআউটে প্রায় 62% চেষ্টা ব্যর্থ
এখন: v4.17-এ rollback চলছে, ops: রাফি
সন্দেহ: 19:40-এর release, এখনো নিশ্চিত নয়
দরকার: database on-call কে আছেন?
পরের আপডেট: 21:00

# গ্রাহকের জন্য (ছাঁচ)
Investigating, 20:22
পেমেন্টের সময় অনেকে সমস্যায় পড়ছেন। আমরা কারণ খুঁজছি।
আপনার কার্ট অক্ষত আছে। পরের খবর 20:52-এ।

৫ · Runbook, playbook আর rollback আগে

রাত ৩টায় ঘুমভাঙা মাথা ভালো করে ভাবতে পারে না। তাই ভাবনার কাজটি দিনের আলোয় সেরে কাগজে রাখা হয়। পরিবারের জরুরি নম্বরের খাতা বা বিদ্যুৎ গেলে জেনারেটর চালুর ছাপা নিয়মের মতো।

Runbook একটি নির্দিষ্ট সমস্যা বা alert-এর ধাপে ধাপে নির্দেশ। Incident playbook এক ধরনের ঘটনার সামগ্রিক পরিকল্পনা: কে থাকবেন, কী সিদ্ধান্ত, কাকে জানানো হবে, যেমন “region নষ্ট” বা “ডেটা ফাঁস”। শব্দ দুটির সীমা দলভেদে আলাদা, অনেকে উল্টোও বলেন। Ansible-এর playbook (পর্ব ৫৬) আলাদা জিনিস। Google-এর SRE বইয়ের ভাষ্যে আগে থেকে playbook লিখে রাখলে উপস্থিত বুদ্ধির তুলনায় MTTR প্রায় তিন গুণ ভালো হয়। এটি তাদের অভিজ্ঞতার কথা, সর্বজনীন মাপ নয়।

ভালো runbook-এর গুণ: alert থেকে সরাসরি link, মালিকের নাম, শেষ পরীক্ষার তারিখ, প্রতিটি ধাপে “কী দেখার কথা”, আর “কখন থেমে কাকে ডাকবেন”। নিচের নমুনাটি পড়ুন। এতে command-গুলো শুধু উদাহরণ।

# Runbook: checkout 5xx is high
Alert: CheckoutBurnRateHigh     Owner: payments team
Last tested: 2026-09-14 (game day)

1. Confirm impact (1 min)
   Dashboard: checkout-overview. Is 5xx above 5%?
   If not: write that in the channel and stop.

2. What changed in the last 60 minutes?
   kubectl rollout history deployment/checkout -n shop
   Recent release: go to step 3. None: go to step 4.

3. Roll back (not safe if the release changed the schema)
   kubectl rollout undo deployment/checkout -n shop
   kubectl rollout status deployment/checkout -n shop --timeout=5m
   Expect: 5xx falls within 5 minutes.

4. Check the database pool
   Dashboard: checkout-db. Pool above 90%?
   Turn on flag checkout_waiting_room.

5. Still bad after 15 minutes?
   Page database on-call. Tell the commander.

ধাপ ১ ভুল alert ছেঁকে দেয়। ধাপ ২ সবচেয়ে কাজের প্রশ্নটি করে: কী বদলেছে? ধাপ ৩-এ বিপদের শর্ত লেখা আছে, আর প্রত্যাশিত ফলও। ধাপ ৫ থামার সীমা দেয়, যাতে কেউ একা ঘণ্টাখানেক না লড়েন। kubectl rollout undo পর্ব ৪৪-এ দেখেছেন।

Rollback আগে, কিন্তু অন্ধভাবে নয়

SRE বইয়ের ভূমিকায় বলা হয়েছে, Google-এর অভিজ্ঞতায় প্রায় ৭০% outage চলমান সিস্টেমে পরিবর্তনের ফল। হার প্রতিষ্ঠানভেদে আলাদা হবে, তবে প্রথম প্রশ্নটি একই থাকে। সম্প্রতি কিছু বদলে থাকলে আগে সেটি ফেরান। “ঠিক করে নতুন release দিই” পথটিকে roll forward বলে, আর চাপের মধ্যে লেখা নতুন কোডে নতুন ভুল ঢোকার ঝুঁকি থাকে।

Rollback কখন নিরাপদ নয়? Release ডেটাবেসের schema বদলে দিলে (পর্ব ৫৯-এর expand and contract মনে করুন), নতুন version ইতিমধ্যে নতুন format-এ ডেটা লিখে থাকলে, অথবা নিরাপত্তা-patch ফেরালে ঝুঁকি ফিরে এলে। তাই rollback-এর পথ আগেই অনুশীলন করা উচিত, যাতে সেদিন প্রথমবার না হয়।

৬ · মাপ: MTTD, MTTA, MTTR আর MTBF

উন্নতি হচ্ছে কি না বুঝতে চারটি সংক্ষিপ্ত নাম চলে। প্রতিটি শুরু আর শেষের দুটি মুহূর্ত দিয়ে সংজ্ঞায়িত। মুহূর্ত দুটি না বলে সংখ্যা বলা অর্থহীন, কারণ দলভেদে সংজ্ঞা আলাদা।

মাপশুরু → শেষ (এই পর্বের সংজ্ঞা)যা বোঝায়
MTTD (detect)প্রভাব শুরু → ধরা পড়াMonitoring কত ভালো
MTTA (acknowledge)ধরা পড়া বা alert → মানুষের স্বীকারOn-call ব্যবস্থা কত সচল
MTTR (restore)প্রভাব শুরু → সেবা ফেরামোট ক্ষতির সময়
MTBF (between failures)এক ঘটনার শেষ → পরের ঘটনার শুরুকত ঘন ঘন ভাঙে

সতর্কতা: MTTR-এর R কোথাও repair, কোথাও recover, restore, respond বা resolve. কেউ গণনা শুরু করেন ধরা পড়ার মুহূর্ত থেকে। MTBF-ও কেউ এক ব্যর্থতার শুরু থেকে পরের শুরু পর্যন্ত মাপেন। DORA-র মাপে একই ধারণা সময়ের সাথে নতুন নাম পেয়েছে। প্রতিবেদনে সংজ্ঞা লিখে দিন।

ঈদ সেলের incident-এ তিনটি সময়

Time scale: 8 units per minute. TTD and TTA sit inside TTR

TTD ৫, TTA ৩ আর TTR ৩৭ মিনিটের সময়রেখা 20:04 প্রভাব শুরু 20:09 ধরা পড়া 20:12 স্বীকার (ack) 20:41 সেবা ফেরা TTD ৫ মিনিট TTA ৩ মিনিট TTR ৩৭ মিনিট
ছবি ৬৭.২ — একটি ঘটনার সময়গুলোকে TTD, TTA, TTR বলি; বহু ঘটনার গড় নিলে সামনে M (mean) বসে।

এক মাসের ছয়টি কাল্পনিক incident-এর CSV নিচে আছে। Runnable Bash block awk দিয়ে MTTA আর MTTR বের করে। INC-3 মধ্যরাত পেরিয়েছে, তাই সময়ের বিয়োগ ঋণাত্মক হলে ১,৪৪০ মিনিট যোগ করতে হয়।

#!/usr/bin/env bash
set -euo pipefail

cat > incidents.csv <<'CSV'
id,sev,start,detect,ack,restored
INC-1,SEV-3,09:10,09:22,09:30,09:52
INC-2,SEV-2,14:05,14:08,14:10,14:33
INC-3,SEV-2,23:50,23:56,00:03,00:40
INC-4,SEV-3,11:20,11:31,11:34,11:49
INC-5,SEV-1,02:15,02:19,02:36,07:27
INC-6,SEV-1,20:04,20:09,20:12,20:41
CSV

awk -F, '
function mins(t, p) { split(t, p, ":"); return p[1] * 60 + p[2] }
function gap(a, b, d) { d = mins(b) - mins(a); return d < 0 ? d + 1440 : d }
NR > 1 {
  ta = gap($4, $5); tr = gap($3, $6)
  printf "%s %s  ack %2d min  restore %3d min\n", $1, $2, ta, tr
  sum_a += ta; sum_r += tr; n++
  print tr > "ttr.txt"
}
END { printf "incidents=%d MTTA=%.1f min MTTR=%.1f min\n", n, sum_a / n, sum_r / n }
' incidents.csv

sort -n ttr.txt | awk '{ v[NR] = $1 }
END { m = (NR % 2) ? v[(NR + 1) / 2] : (v[NR / 2] + v[NR / 2 + 1]) / 2
      printf "median restore=%.1f min, worst=%d min\n", m, v[NR] }'

আউটপুট:

INC-1 SEV-3  ack  8 min  restore  42 min
INC-2 SEV-2  ack  2 min  restore  28 min
INC-3 SEV-2  ack  7 min  restore  50 min
INC-4 SEV-3  ack  3 min  restore  29 min
INC-5 SEV-1  ack 17 min  restore 312 min
INC-6 SEV-1  ack  3 min  restore  37 min
incidents=6 MTTA=6.7 min MTTR=83.0 min
median restore=39.5 min, worst=312 min

হাতে মিলিয়ে দেখুন: ack-এর যোগফল ৪০, ৪০ ÷ ৬ ≈ ৬.৭। Restore-এর যোগফল ৪৯৮, ৪৯৮ ÷ ৬ = ৮৩। অথচ ছয়টির পাঁচটিই ৫০ মিনিট বা তার কম। INC-5 একাই গড়কে দ্বিগুণের বেশি করেছে। Median, অর্থাৎ সাজানো তালিকার মাঝের মান, ৩৯.৫ মিনিট।

নিচের simulator একই ডেটা থেকে MTTD, MTBF আর availability বের করে, আর দেখায় একটি ঘটনা বাদ দিলে MTTR কতটা বদলায়। সংখ্যা বদলে পরীক্ষা করুন।

// Incident metrics from one sample month (30 days). Times are HH:MM.
const set = [
  ['INC-1', '09:10', '09:22', '09:30', '09:52'],
  ['INC-2', '14:05', '14:08', '14:10', '14:33'],
  ['INC-3', '23:50', '23:56', '00:03', '00:40'],
  ['INC-4', '11:20', '11:31', '11:34', '11:49'],
  ['INC-5', '02:15', '02:19', '02:36', '07:27'],
  ['INC-6', '20:04', '20:09', '20:12', '20:41'],
];  // id, impact start, detected, acknowledged, service restored

const mins = t => +t.slice(0, 2) * 60 + +t.slice(3);
const gap = (a, b) => (mins(b) - mins(a) + 1440) % 1440;  // survives midnight
const mean = a => a.reduce((x, y) => x + y, 0) / a.length;
function median(a) {
  const s = [...a].sort((x, y) => x - y), m = s.length >> 1;
  return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
}

const ttd = set.map(r => gap(r[1], r[2]));
const tta = set.map(r => gap(r[2], r[3]));
const ttr = set.map(r => gap(r[1], r[4]));
console.log('TTR list:', ttr.join(' '));
console.log('MTTD', mean(ttd).toFixed(1), ' MTTA', mean(tta).toFixed(1),
            ' MTTR', mean(ttr).toFixed(1), 'min');
console.log('median TTR', median(ttr), 'min');

const noBig = ttr.filter(x => x < 300);
console.log('MTTR without the one long incident', mean(noBig).toFixed(1), 'min');

const month = 30 * 24 * 60, down = ttr.reduce((x, y) => x + y, 0);
const mtbf = (month - down) / set.length, mttr = mean(ttr);
console.log('downtime', down, 'min of', month);
console.log('MTBF', mtbf.toFixed(0), 'min =', (mtbf / 60).toFixed(1), 'h');
console.log('availability', (100 * mtbf / (mtbf + mttr)).toFixed(3) + '%');

আউটপুট:

TTR list: 42 28 50 29 312 37
MTTD 6.8  MTTA 6.7  MTTR 83.0 min
median TTR 39.5 min
MTTR without the one long incident 37.2 min
downtime 498 min of 43200
MTBF 7117 min = 118.6 h
availability 98.847%

পূর্ণ হিসাব: ৩০ দিন = ৪৩,২০০ মিনিট। MTBF = (৪৩,২০০ − ৪৯৮) ÷ ৬ = ৭,১১৭ মিনিট। Availability = MTBF ÷ (MTBF + MTTR) = ৭,১১৭ ÷ ৭,২০০ ≈ ৯৮.৮৪৭%. এটি ১ − ৪৯৮ ÷ ৪৩,২০০-র সমান। তবে এই হিসাব প্রতিটি incident-কে পুরো outage ধরেছে, যা বাস্তবে আংশিক হতে পারে। তাই SLO-র অনুরোধ-ভিত্তিক হিসাব (পর্ব ৬৬) সাধারণত বেশি সৎ।

গড় নিয়ে বিতর্ক

Incident-এর সময়কাল সাধারণত সমান ছড়ানো থাকে না: অনেক ছোট, অল্প কিছু খুব লম্বা। এমন ডেটায় গড় অস্থির। Štěpán Davidovič তাঁর Incident Metrics in SRE (২০২১) প্রতিবেদনে simulation দিয়ে দেখান, incident কম থাকলে MTTR-এর বদল অনেক সময় শুধু কাকতাল হতে পারে। Verica Open Incident Database (VOID)-এর প্রতিবেদনেও একই ধরনের সতর্কতা আছে।

এর মানে MTTR ফেলে দেওয়া নয়, পড়ার ধরন বদলানো। Median আর p90 পাশাপাশি রাখুন, severity আলাদা করুন, অল্প ঘটনায় সিদ্ধান্ত নেবেন না, আর সংখ্যাকে দলের লক্ষ্য বানাবেন না। লক্ষ্য বানালে মানুষ incident ছোট দেখাতে বা না ঘোষণা করতে শুরু করেন। Goodhart-এর সূত্র এই কথাই বলে: মাপ লক্ষ্য হলে মাপ হিসেবে দুর্বল হয়ে পড়ে।

৭ · Blameless postmortem: মানুষ নয়, ব্যবস্থা

Postmortem হলো ঘটনার পরের লিখিত পর্যালোচনা। Blameless মানে হলো ধরে নেওয়া: সেই সময়ের তথ্য নিয়ে মানুষটি তার বিবেচনায় ঠিক কাজই করছিলেন। John Allspaw-র Etsy ব্লগের লেখা “Blameless PostMortems and a Just Culture” (২০১২) এবং SRE বইয়ের ১৫তম অধ্যায় এই ধারণাকে প্রচলিত করে। শাস্তির ভয় থাকলে মানুষ তথ্য লুকান, আর লুকানো তথ্য থেকে কিছু শেখা যায় না।

অংশযা থাকে
সারাংশতিন-চার লাইনে কী হলো, কত সময়, কত প্রভাব
প্রভাবগ্রাহক, অনুরোধ, টাকা, error budget খরচ
Timelineসময়সহ ঘটনা, সিদ্ধান্ত আর প্রকাশিত তথ্য
Contributing factorsযেসব শর্ত মিলে ঘটনা সম্ভব হলো
কী ভালো গেল, কোথায় ভাগ্য সহায় ছিলযা ধরে রাখতে হবে, আর যা নিছক কপাল
Action itemsকাজ, ধরন, মালিক, তারিখ

একটি root cause, না একাধিক কারণ

কথায় বলি “root cause”, যেন এক শিকড় তুলে ফেললেই শেষ। জটিল সিস্টেমে ব্যর্থতা সাধারণত কয়েকটি শর্তের যোগফল। James Reason-এর Swiss cheese model (১৯৯০) বলে, প্রতিটি সুরক্ষা স্তরে ফুটো থাকে, ফুটোগুলো এক সারিতে পড়লে দুর্ঘটনা ঘটে। Richard Cook-এর “How Complex Systems Fail” (১৯৯৮) সোজাই বলে, ঘটনার পরে একটি root cause দাঁড় করানো মূলত ভুল। তাই অনেক দল এখন “contributing factors” বলে।

5 Whys Toyota-র উৎপাদন ব্যবস্থা থেকে এসেছে, Sakichi Toyoda আর Taiichi Ohno-র নামের সাথে জড়িয়ে। প্রতিটি উত্তরে আবার “কেন” জিজ্ঞেস করে গভীরে যাওয়া। শুরুর জন্য ভালো অভ্যাস। কিন্তু এর সীমা আছে: এটি একটিমাত্র সরল রেখায় হাঁটে, প্রশ্নকারী কোথায় থামবেন তাতে ফল বদলায়, দুজন আলাদা উত্তর পান, আর শেষে প্রায়ই “মানুষের ভুল”-এ পৌঁছায়। Allspaw তাঁর “The Infinite Hows” (২০১৪) লেখায় “কেন”-এর বদলে “কীভাবে” জিজ্ঞেস করতে বলেন। “কেন ভুল করলেন” কৈফিয়ত চায়, “কীভাবে কাজটি যুক্তিসঙ্গত মনে হলো” তথ্য খোঁজে। পেছন থেকে সব স্পষ্ট দেখায়, একে hindsight bias বলে।

নিচে একই ঘটনার একটি খসড়া দোষারোপ থেকে ব্যবস্থার ভাষায় বদলে যাচ্ছে। প্রতিটি ধাপে কী মুছে গেল, আর কী যোগ হলো, দেখুন।

খসড়া ১দোষ এক ব্যক্তিতে
রাফি খারাপ query deploy করেছে।
তার আরও সাবধান হওয়া উচিত ছিল।
action: রাফিকে সতর্ক করা
খসড়া ২নাম সরল, প্রশ্ন বদলাল
একজন developer v4.18 deploy করেন।
Review পাস, CI সবুজ, staging ঠিক।
প্রশ্ন: তখন কাজটি নিরাপদ মনে হলো কীভাবে?
খসড়া ৩তথ্য যোগ হলো
Staging-এ coupon সারি ২ হাজার,
production-এ ২ কোটি।
Load test চলেছে ×২ চাপে, সেল ছিল ×৬.
সেলের ২০ মিনিট আগে release, আটকানোর নিয়ম নেই।
খসড়া ৪এক কারণ নয়, কয়েকটি শর্ত
ক. ধীর query ধরার কোনো পরীক্ষা নেই
খ. Staging-এর ডেটা production-এর মতো নয়
গ. Sale-এর চাপে load test হয়নি
ঘ. Client retry-তে backoff নেই
যেকোনো একটি থাকলে ক্ষতি কমত
খসড়া ৫“উচিত ছিল” বাদ
মুছল: “... করা উচিত ছিল”
যোগ হলো: সেই সময়ে দলের কাছে
query-র সময় দেখানোর কোনো dashboard
ছিল না। তাই ধীর হওয়া চোখে পড়েনি।
চূড়ান্তকাজ, ধরন, মালিক, তারিখ
Detect: query সময়ের alert
  মালিক: payments · ১৫ দিন
Prevent: CI-তে ধীর query পরীক্ষা
  মালিক: platform · ৩০ দিন
Mitigate: runbook-এ waiting room
  মালিক: on-call lead · ৭ দিন
  1. প্রথম প্রতিক্রিয়া। এই বাক্যটি শুনতে সহজ। কিন্তু এর একমাত্র action হলো একজনকে সতর্ক করা। পরের মাসে অন্য কেউ একই ভুল করতে পারবেন, কারণ ব্যবস্থায় কিছুই বদলায়নি।
  2. ব্যক্তি থেকে ভূমিকা। নাম সরিয়ে ভূমিকা বসল। প্রশ্নও বদলাল: “কে করল” নয়, “কীভাবে কাজটি সেই মুহূর্তে যুক্তিসঙ্গত মনে হলো”। Review আর CI পাস করেছিল, অর্থাৎ developer ব্যবস্থার ওপর আস্থা রেখেছিলেন।
  3. পরিপ্রেক্ষিত। এবার সংখ্যা এলো। Staging-এ ২ হাজার সারিতে যে query দ্রুত, production-এর ২ কোটি সারিতে তা ধীর। সেল-চাপের ×৬ কখনো পরীক্ষা হয়নি।
  4. শর্তের তালিকা। এখন চারটি contributing factor. লক্ষ করুন, কোনো একটি একা outage ঘটাত না। Swiss cheese-এর ফুটোগুলো সেদিন এক সারিতে পড়েছিল।
  5. পেছন-দৃষ্টি সরানো। “উচিত ছিল” বাক্যগুলো লেখকের hindsight bias দেখায়। তার বদলে লেখা হলো সেই মুহূর্তে কী দেখা যাচ্ছিল, আর কী দেখা যাচ্ছিল না।
  6. মালিকসহ কাজ। প্রতিটি কাজ নির্দিষ্ট, পরীক্ষাযোগ্য, মালিক আর তারিখসহ। “আরও সাবধান হওয়া” কোনো কাজ নয়। SRE বইও জোর দেয়, follow-up ছাড়া postmortem ব্যর্থ। Blameless মানে দায়হীন নয়: দায় এখানে ভবিষ্যৎ বদলানোর।

Timeline লেখাই postmortem-এর সবচেয়ে সময়খেকো কাজ। Scribe-এর নোট, alert আর chat মিলিয়ে সাজাতে হয়। নিচের timeline builder এলোমেলো chat লাইন পড়ে, অপ্রাসঙ্গিক কথা বাদ দেয়, সময় অনুযায়ী সাজায়, প্রভাব শুরু থেকে কত মিনিট তা লেখে, আর প্রতিটি লাইনের ধরন বসায়।

// Turn raw chat lines into a postmortem table. Lines arrive out of order.
const raw = `
20:12 rafi: ack, looking at checkout
20:09 pager: ALERT checkout burn rate high
20:13 mitu: who has the tea money? lol
20:15 rafi: declare SEV-1, channel inc-eid
19:40 ci: deploy checkout v4.18 done
20:18 nadia: commander: nadia, ops: rafi
20:22 mitu: status page: investigating
20:04 graph: checkout 5xx crossed 5 percent
20:26 rafi: rollback to v4.17 started
20:34 rafi: rollback done, errors 9 percent
20:38 nadia: waiting room on, retries cut
20:41 graph: checkout 5xx under 1 percent
20:52 mitu: status page: mitigated, monitoring
21:22 mitu: status page: still monitoring
21:40 nadia: all clear, closing incident`;
const RULES = [[/deploy/, 'change'], [/crossed/, 'impact'], [/ALERT/, 'detect'],
  [/\back\b/, 'ack'], [/declare/, 'declare'], [/commander/, 'roles'],
  [/status page/, 'comms'], [/rollback|waiting room/, 'action'],
  [/under 1 percent/, 'restored'], [/all clear/, 'resolved']];
const mins = t => +t.slice(0, 2) * 60 + +t.slice(3);
const events = [];
for (const line of raw.trim().split('\n')) {
  const m = line.match(/^(\d\d:\d\d) (\w+): (.*)$/);
  const rule = RULES.find(r => r[0].test(m[3]));
  if (rule) events.push({ t: m[1], who: m[2], kind: rule[1], text: m[3] });
  else console.log('dropped:', line);
}
events.sort((a, b) => mins(a.t) - mins(b.t));
const start = mins(events.find(e => e.kind === 'impact').t);
for (const e of events) {
  const d = mins(e.t) - start;
  console.log(e.t, String(d).padStart(4), e.kind.padEnd(9), e.text);
}

আউটপুট (সময়, প্রভাব শুরু থেকে মিনিট, ধরন, ঘটনা):

dropped: 20:13 mitu: who has the tea money? lol
19:40  -24 change    deploy checkout v4.18 done
20:04    0 impact    checkout 5xx crossed 5 percent
20:09    5 detect    ALERT checkout burn rate high
20:12    8 ack       ack, looking at checkout
20:15   11 declare   declare SEV-1, channel inc-eid
20:18   14 roles     commander: nadia, ops: rafi
20:22   18 comms     status page: investigating
20:26   22 action    rollback to v4.17 started
20:34   30 action    rollback done, errors 9 percent
20:38   34 action    waiting room on, retries cut
20:41   37 restored  checkout 5xx under 1 percent
20:52   48 comms     status page: mitigated, monitoring
21:22   78 comms     status page: still monitoring
21:40   96 resolved  all clear, closing incident

−২৪ লাইনটি গুরুত্বপূর্ণ: release হয়েছে প্রভাবের ২৪ মিনিট আগে, অর্থাৎ ভুলটি সেলের চাপ আসা পর্যন্ত ঘুমিয়ে ছিল। TTD ৫, ack ৮, সেবা ফেরা ৩৭ মিনিট, আর বন্ধ ঘোষণা ৯৬ মিনিটে। এই keyword-নিয়মগুলো শুধু উদাহরণ। আসল দলে chat-এ /incident note-এর মতো চিহ্ন দিলে কাজ আরও সহজ হয়। শেষে মানুষকে পড়ে যাচাই করতেই হবে।

৮ · ঈদ সেলের outage: শুরু থেকে শেষ

এবার একটি কাল্পনিক অনলাইন বাজার অ্যাপের পুরো ঘটনা। ঈদের আগের সন্ধ্যায় ২০:০০-এ সেল শুরু, traffic স্বাভাবিকের ×৬। ১৯:৪০-এ checkout-এর v4.18 release হয়েছে, যাতে coupon যাচাইয়ের নতুন query আছে, কিন্তু index নেই। প্রতিটি অনুরোধ database connection pool-এর সংযোগ বেশি সময় ধরে রাখে। ঈদের আগে বাসের টিকিট কাউন্টারের মতো: একজন যাত্রী বেশি সময় নিলে পেছনের লাইন দ্রুত লম্বা হয়।

  1. Detect20:09
  2. Triage20:15
  3. Mitigate20:26
  4. Resolve21:40
Incident-এর অবস্থা
সময়
Checkout error
Severity
Commander
Status page
  1. ২০:০৪, প্রভাব শুরু। Pool ভরে গেছে, error ৫% পেরোল। কেউ এখনো জানেন না। এই নীরব সময়টিই TTD-তে মাপা হবে।
  2. ২০:০৯, page এলো। Burn rate alert (পর্ব ৬৬) বাজল, error ৬২%. TTD ৫ মিনিট।
  3. ২০:১২, রাফি স্বীকার করলেন। তিন মিনিটে ack, ল্যাপটপ খুলে dashboard দেখছেন। প্রভাব শুরু থেকে ৮ মিনিট।
  4. ২০:১৫, Sev-1 ঘোষণা। মূল কাজ বন্ধ, বহু মানুষ আক্রান্ত, বিকল্প নেই। Matrix-এ তর্কের কিছু নেই। Channel খোলা হলো, রাফি অস্থায়ী commander.
  5. ২০:১৮, নাদিয়া commander. ভূমিকা ভাগ হলো, অংশ ৩-এর মতো। Commander-এর প্রথম প্রশ্ন: “গত এক ঘণ্টায় কী বদলেছে?” উত্তর: ১৯:৪০-এর v4.18.
  6. ২০:২২, প্রথম খবর। মিতু status page-এ Investigating দিলেন, পরের আপডেট ২০:৫২। কারণ জানা নেই, তবু গ্রাহককে জানানো হলো।
  7. ২০:৩৪, rollback শেষ। ২০:২৬-এ শুরু, ৮ মিনিটে v4.17-এ ফিরল। Error ৯%-এ নামল, শূন্যে নয়। Client-এর বারবার চেষ্টা, অর্থাৎ retry storm, আর জমে থাকা চাপ এখনো আছে।
  8. ২০:৩৮, চাপ কমানো। ইমরানের পরামর্শে waiting room চালু হলো, আর client retry কমানো হলো। Error তখনো ৯%, সিদ্ধান্তের ফল আসতে সময় লাগে।
  9. ২০:৫২, Monitoring. ২০:৪১-এ error ১%-এর নিচে নেমেছে, মোট TTR ৩৭ মিনিট। এখন ০.৭%. মিতু Monitoring দিলেন। সেবা ফিরলেও ঘটনা বন্ধ নয়, সেল আরও দেড় ঘণ্টা চলবে। ২১:২২-এ আরেকটি আপডেট যায়।
  10. ২১:৪০, all-clear. Error ০.৪%, চাপ নেমেছে, waiting room বন্ধ হলো। নাদিয়া incident বন্ধ করলেন, status Resolved. মোট ৯৬ মিনিট। পরের সপ্তাহে postmortem.

ক্ষতির হিসাব আর পরের কাজ

ধরে নিই সেলে মিনিটে ৩০০ চেকআউট চেষ্টা হয়। সবচেয়ে খারাপ হার ৬২% পুরো ৩৭ মিনিট ধরলে ৩০০ × ৩৭ × ০.৬২ = ৬,৮৮২টি ব্যর্থ চেষ্টা। এটি ওপরের সীমা, কারণ শেষ দিকে হার ৯%-এ নেমেছিল। অনেকে পরে আবার চেষ্টাও করেছেন, তাই এটি হারানো অর্ডারের সংখ্যা নয়।

Contributing factorAction itemধরনমালিক · সময়
Index ছাড়া queryCI-তে production-আকারের ডেটায় ধীর query পরীক্ষাPreventPlatform · ৩০ দিন
Load test ×২ পর্যন্তপ্রতি সেলের আগে প্রত্যাশিত চাপের ওপরে load test (পর্ব ৬৮)PreventPayments · পরের সেলের আগে
সেলের ২০ মিনিট আগে releaseসেলের আগে-পরে release আটকানোর নিয়ম, CI-তে প্রয়োগPreventRelease lead · ১৪ দিন
Retry-তে backoff নেইExponential backoff আর jitterMitigateApp দল · ৩০ দিন
Waiting room runbook-এ ছিল নাRunbook-এ যোগ, game day-তে অনুশীলনMitigateOn-call lead · ৭ দিন
কী ভালো গেল, কোথায় কপাল

ভালো: matrix থাকায় ঘোষণায় দেরি হয়নি, প্রথম প্রশ্নেই সন্দেহের release ধরা পড়ল, schema না বদলানোয় rollback নিরাপদ ছিল। কপাল: waiting room flag অন্য কাজে আগেই বানানো ছিল, আর ইমরান সেদিন অনলাইনে ছিলেন। “কপাল” লেখা জরুরি, কারণ পরের বার কপাল সাথে না-ও থাকতে পারে।

৯ · অন্যের postmortem, game day আর on-call-এর ভার

নিজের ভুলের চেয়ে অন্যের প্রকাশিত ভুল থেকে শেখা সস্তা। নিচের সারাংশ প্রতিষ্ঠানগুলোর নিজের প্রকাশিত বিবরণের ওপর ভিত্তি করে, বিস্তারিত ও সংখ্যা মূল লেখায় মিলিয়ে নেবেন।

ঘটনাপ্রকাশিত বিবরণ অনুযায়ীশিক্ষা
GitLab.com, ৩১ জানুয়ারি ২০১৭Replication সারাতে গিয়ে একজন প্রকৌশলী ভুল server-এ ডেটা মুছে ফেলেন। কয়েকটি backup ব্যবস্থা কাজ করছিল না। প্রায় ৬ ঘণ্টার production ডেটা হারায়, পুনরুদ্ধার চলে দীর্ঘ সময় ধরে, প্রকাশ্য নথিতে আর সরাসরি সম্প্রচারেBackup নয়, restore test আসল। ক্লান্ত অবস্থায় destructive কাজে সুরক্ষা লাগে। স্বচ্ছতা আস্থা বাঁচাতে পারে
Cloudflare, ২ জুলাই ২০১৯একটি নতুন WAF নিয়মের regular expression অতিরিক্ত backtracking করে CPU ভরে ফেলে। নিয়মটি একসাথে সব জায়গায় পৌঁছেছিল। প্রায় ২৭ মিনিট traffic অনেক কমে যায়। নিরাপত্তা-ব্যবস্থার কারণে ভেতরের কিছু tool-এ ঢুকতেও দেরি হয়নিয়ম আর config-ও code, এগুলোরও ধাপে ধাপে rollout লাগে। Global kill-এর পথ আগে থেকে তৈরি রাখুন
Meta, ৪ অক্টোবর ২০২১Backbone-এর capacity যাচাইয়ের একটি রুটিন command ভুলবশত সংযোগ কেটে দেয়, আর audit tool-এর bug সেটি আটকাতে পারেনি। DNS server-গুলো নিজেদের BGP ঘোষণা তুলে নেয়। প্রায় ছয় ঘণ্টা সেবা বন্ধ, প্রকৌশলীদের সশরীরে data center-এ যেতে হয়পুনরুদ্ধারের tool আর সিস্টেম একই network-এ থাকলে একসাথে হারায়। আলাদা out-of-band পথ, আর break-glass ব্যবস্থা অনুশীলন জরুরি

Game day: বিপদের আগে মহড়া

Game day হলো নির্ধারিত দিনে ইচ্ছা করে সমস্যা সাজিয়ে দলকে পরীক্ষা করা, যেমন ফায়ার সার্ভিসের মহড়া। Jesse Robbins Amazon-এ ২০০০-এর দশকের শুরুতে এমন অনুশীলন চালু করেন বলে জানা যায়, আর Google তাদের DiRT অনুশীলন নিয়ে লিখেছে (ACM Queue, ২০১২)। শুরু করতে কিছু ভাঙতেই হবে এমন নয়। Tabletop অনুশীলনে শুধু টেবিলে বসে বলা হয়: “ধরা যাক database চলে গেছে, এখন কী করবেন?” পরে staging-এ, তারপর সাবধানে production-এ। লক্ষ্য তিনটি: runbook কাজ করে কি না, নতুন মানুষ পারেন কি না, আর ভূমিকাগুলো জানা আছে কি না। ইচ্ছাকৃত ব্যর্থতার পদ্ধতি নিয়ে বিস্তারিত দেখবেন পর্ব ৬৮-তে।

On-call-এর ভার আর burnout

ঘুম ভাঙা মানুষ সিস্টেমের অংশ। SRE বইয়ের ১১তম অধ্যায় ভাগের একটি হিসাব দেয়: একটি incident সামলাতে, মূল কারণ খুঁজতে, ঠিক করতে আর postmortem লিখতে গড়ে প্রায় ৬ ঘণ্টা লাগে, তাই ৮-১২ ঘণ্টার পালায় সর্বোচ্চ প্রায় ২টি incident. একই বই on-call-কে SRE-র সময়ের ২৫%-এর মধ্যে রাখার কথা বলে। এগুলো Google-এর লক্ষ্য, আপনার দলের জন্য শুরুর একটি রেফারেন্স।

  • ভার মাপুন: প্রতি পালায় page-এর সংখ্যা, রাতের page, আর কতগুলোর পেছনে আসল কাজ ছিল। অকাজের page-ই alert fatigue তৈরি করে।
  • ঘুমের দাম দিন: রাতে জাগলে পরদিন ছুটি বা সময়-ক্ষতিপূরণের নিয়ম লিখে রাখুন। শ্রম আইন আর চুক্তি দেশভেদে আলাদা, প্রতিষ্ঠানের নিয়ম যাচাই করুন।
  • পালা ন্যায্য রাখুন: অন্তত দুজনের সারি (primary, secondary), নতুনদের জন্য ছায়া-পালা, আর পালা বদলে ছোট handoff.
  • বিশ্বজুড়ে দল থাকলে: Follow the sun ব্যবস্থায় দিনের আলোয় থাকা দল পালা নেয়, রাতের ডাক কমে। ছোট দলে সেটি সম্ভব নয়, তাই কম page-ই প্রধান পথ।
  • বড় ঘটনার পরে: মানুষকে বিশ্রাম দিন। ক্লান্ত দলে পরের ভুলের ঝুঁকি বেশি, আর একই সমস্যায় বারবার page হওয়া toil, যা action item-এ নামা উচিত।

আরও গভীরে: Incident বিশ্লেষণের একটি ধারা বলে, শুধু ব্যর্থতা না দেখে সিস্টেম প্রতিদিন কীভাবে ঠিক থাকে, তাও দেখতে হবে। Erik Hollnagel-এর Safety-II ধারণা এটিই বলে। Woods ও সহকর্মীদের STELLA প্রতিবেদন (২০১৭) দেখায়, জটিল সিস্টেম চালু রাখে মানুষের সদা-হালনাগাদ মানসিক মডেল। এই দৃষ্টিতে postmortem-এর ফল শুধু কাজের তালিকা নয়, দলের বোঝাপড়ার বদলও।

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

  • Mitigation আর resolution-এর পার্থক্য? Mitigation ক্ষতি থামায়, resolution সেবা স্থির করে ঘটনা বন্ধ করে। স্থায়ী সমাধান পরের কাজ।
  • Commander কেন command চালান না? তাঁর কাজ পুরো ছবি দেখা, কাজ ভাগ করা, সিদ্ধান্ত নেওয়া। Terminal-এ ডুবলে সেটি হারান।
  • MTTA আর MTTR-এর পার্থক্য? MTTA মানুষের স্বীকার পর্যন্ত, MTTR সেবা ফেরা পর্যন্ত। সংজ্ঞা উল্লেখ করে উত্তর দিন।
  • MTBF ১০০ ঘণ্টা, MTTR ১ ঘণ্টা হলে availability? ১০০ ÷ ১০১ ≈ ৯৯.০১%.
  • Blameless postmortem কেন? ভয় থাকলে তথ্য লুকায়, আর ব্যবস্থা না বদলালে একই ভুল ফেরে।

১০ · AI-এর যুগে incident সামলানো

AI incident-এ সত্যিই কাজে লাগে: লম্বা log সংক্ষেপ করা, chat থেকে timeline-এর খসড়া, status আপডেটের ভাষা, postmortem-এর প্রথম খসড়া। কিন্তু সে আপনার সিস্টেম দেখতে পায় না, আর ভুলও খুব আত্মবিশ্বাসে বলে। চাপের মুহূর্তে এটিই বড় বিপদ। সাধারণ ভুলগুলো হলো:

AI যা করেবিপদআপনি যা করবেন
terraform destroy, kubectl delete, rm -rf সতর্কতা ছাড়া দেয়ছোট outage বড় হয়, ডেটা যায়আগে --dry-run, terraform plan, আর দ্বিতীয় জনের চোখ
Log দেখে একটিমাত্র root cause দাবি করেভুল পথে সময় যায়অনুমান ধরে নিন, metric-এ প্রমাণ খুঁজুন
Flag বা resource argument বানিয়ে দেয়, সরানো API version দেয়Command ব্যর্থ, সময় নষ্টসরকারি নথিতে মিলিয়ে নিন
দ্রুত সমাধানে * permission, 0.0.0.0/0 বা public storageOutage নিরাপত্তা-ঘটনায় বদলায়Least privilege রাখুন, জরুরি অধিকার সময়-সীমিত করুন
latest tag-এ ফিরতে বলে, hardcoded secret রাখে, খরচ ভুলে যায়Rollback অনির্দিষ্ট, secret ফাঁস, বাড়তি বিলDigest বা নির্দিষ্ট tag, secret manager, budget alert
Postmortem-এ না-জানা তথ্য জুড়ে দেয়, ব্যক্তিকে দোষ দেয়নথি মিথ্যা হয়, ভয় বাড়েপ্রতিটি সময় আর সংখ্যা মূল উৎসে মেলান

Log বা chat AI-কে দেওয়ার আগে secret, গ্রাহকের তথ্য আর আসল account id মুছে দিন। প্রতিষ্ঠানের নীতিও দেখে নিন। নিচের prompt-টি AI-কে অনুমান আলাদা করতে বাধ্য করে:

তুমি একজন অভিজ্ঞ SRE সহকারী। নিচে একটি incident-এর পরিষ্কার করা chat আর alert আছে (secret নেই)। [এখানে timeline পেস্ট করুন] ১. সময় অনুযায়ী একটি timeline টেবিল বানাও। শুধু দেওয়া তথ্য ব্যবহার করো, কিছু বানিও না। ২. কোন তথ্য নেই বা অস্পষ্ট, আলাদা করে লেখো। ৩. Contributing factor-এর সম্ভাব্য তালিকা দাও, প্রতিটির পাশে "প্রমাণ" বা "অনুমান" লেখো। ৪. কোনো ব্যক্তির নাম বা দোষ ব্যবহার করো না, ভূমিকা লেখো। ৫. কোনো destructive command প্রস্তাব করলে আগে dry-run আর ঝুঁকি বলো।

AI-এর incident পরামর্শ হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১“আগে mitigate, পরে root cause” — এই নিয়ম সব সময় ঠিক? কখন এটি বিপজ্জনক?

নিয়মটির পেছনের যুক্তি অর্থনৈতিক। Outage-এর প্রতিটি মিনিটের একটি দাম আছে, আর কারণ খোঁজার সময় অনিশ্চিত। Rollback যদি ৮ মিনিটে কাজ করে, আর কারণ খুঁজতে তিন ঘণ্টা লাগে, তাহলে আগে rollback করা সহজ হিসাব। Google-এর SRE বইয়ের troubleshooting অধ্যায় এই কারণেই বড় outage-এ root cause-এর তাড়না সামলাতে বলে।

কিন্তু তিনটি ক্ষেত্রে নিয়মটি সরাসরি খাটে না।

  • নিরাপত্তা-ঘটনা: আক্রান্ত server মুছে নতুন বসালে সেবা ফেরে, কিন্তু প্রমাণ হারায়, আর আক্রমণকারী কোন পথে ঢুকেছিল, তা জানা যায় না। তখন একই দরজা খোলা থাকে। সঠিক পথ হলো আলাদা করা, snapshot আর log রাখা, তারপর সরানো। Containment-ও mitigation, শুধু ধরন আলাদা।
  • ডেটা নষ্ট হওয়া: যদি কোনো bug ভুল ডেটা লিখছে, সেবা চালু রাখা মানে ক্ষতি বাড়ানো। এখানে আংশিক বন্ধ রাখাই ভালো mitigation. GitLab ২০১৭-র ঘটনা দেখায়, ডেটার সামনে তাড়াহুড়ো কতটা দামী হতে পারে।
  • কারণ না জানলে mitigation বাছাই অসম্ভব: Rollback সব সময় সাহায্য করে না, যেমন সমস্যা যদি বাইরের নির্ভরতা বা traffic-এ হয়। ঈদ সেলের ঘটনাতেও rollback-এর পরে error ৯% ছিল।

তাই নিয়মের আসল রূপ হলো “পুরো কারণ জানার জন্য অপেক্ষা করবেন না”, “ভাবা বন্ধ করুন” নয়। Mitigation-এর আগে সামান্য প্রমাণ রাখাও অভ্যাস করুন: heap dump, log-এর কপি, process-এর অবস্থা। এক মিনিটের এই কাজ পরের postmortem-কে বাঁচায়।

মূল উপলব্ধি: লক্ষ্য হলো মোট ক্ষতি কমানো। কোন মুহূর্তে কোন ক্ষতি বেশি, সেই বিচারই commander-এর আসল কাজ, মুখস্থ নিয়ম নয়।

প্র ০২MTTR কমানোকে দলের লক্ষ্য বানালে কী ভুল হতে পারে? তাহলে কী মাপবেন?

MTBF আর MTTR এসেছে হার্ডওয়্যার reliability প্রকৌশল থেকে। সেখানে একই ধরনের যন্ত্র বহুবার নষ্ট হয়, তাই গড়ের অর্থ থাকে। Software incident তেমন নয়। প্রতিটি ঘটনা আলাদা, সংখ্যায় কম, আর সময়কাল খুব অসমান।

Štěpán Davidovič ২০২১ সালের Incident Metrics in SRE প্রতিবেদনে simulation করে দেখান, ছোট দলের incident-সংখ্যায় MTTR-এর ওঠানামা অনেক সময় নিছক এলোমেলো হতে পারে। অর্থাৎ নতুন tool চালুর পরে MTTR কমলেও, সেটি tool-এর ফল কি না বলা কঠিন। VOID প্রকল্পের প্রতিবেদনও দেখায়, সময়কালের বণ্টনের লম্বা লেজের কারণে গড় ভরসাযোগ্য সার সংখ্যা নয়। এসব বিশ্লেষণের সিদ্ধান্ত নিয়ে আলোচনা চলছে, তাই এটিকে চূড়ান্ত রায় ভাববেন না।

আরও বড় সমস্যা মানুষের আচরণে। MTTR লক্ষ্য হলে দল ছোট incident ঘোষণা করবে যাতে গড় কমে, লম্বা ঘটনা ভাগ করে দেখাবে, বা সেবা পুরো স্থির হওয়ার আগেই বন্ধ ঘোষণা করবে। এটাই Goodhart-এর সূত্র। সেই সাথে “পরিসংখ্যানে উন্নতি” দেখালেও গ্রাহকের কষ্ট একই থাকতে পারে।

বিকল্পগুলো:

  • Error budget-এর খরচ, যা মাপে গ্রাহক কতটা কষ্ট পেলেন।
  • Median, p90 আর severity-ভিত্তিক গণনা।
  • কত শতাংশ incident গ্রাহকের আগে নিজের alert-এ ধরা পড়ল।
  • Action item কত শতাংশ সময়মতো শেষ হলো।
  • একই ধরনের ঘটনা ফিরল কি না, আর on-call-এর ভার।

মূল উপলব্ধি: মাপ আলো ফেলে, রায় দেয় না। সংখ্যা দিয়ে প্রশ্ন শুরু করুন, সিদ্ধান্ত শেষ করবেন না, আর যে সংখ্যা দিয়ে মানুষকে বিচার করবেন, সেটি দ্রুত নষ্ট হবে।

প্র ০৩“Root cause” বলে কি সত্যিই কিছু আছে? 5 Whys কেন যথেষ্ট নয়?

“Root cause analysis” শব্দটি এত প্রচলিত যে প্রশ্নটি অদ্ভুত শোনায়। সরল যন্ত্রে ধারণাটি ভালো কাজ করে: কারখানার মেশিন থেমেছে, কারণ fuse পুড়েছে, কারণ বিয়ারিং-এ তেল নেই। Toyota-র কারখানায় 5 Whys এই জগতে জন্মেছিল, আর সেখানে এটি কাজেরই ছিল।

জটিল software সিস্টেম আলাদা। সেখানে ব্যর্থতার পেছনে থাকে কয়েকটি স্বাভাবিক শর্তের মিলন। ঈদ সেলের ঘটনায় index ছাড়া query একা outage ঘটায়নি। ×৬ চাপ, ছোট pool, backoff ছাড়া retry আর সেলের ঠিক আগের release মিলে সেটি হয়েছে। প্রশ্নকারী কোন শাখায় হাঁটছেন, 5 Whys তার ওপর নির্ভর করে, তাই দুজন দুই “root cause” পান।

Richard Cook তাঁর ১৯৯৮ সালের ছোট লেখা “How Complex Systems Fail”-এ বলেন, জটিল সিস্টেমে ব্যর্থতার জন্য একাধিক সমস্যা লাগে, আর ঘটনার পরে একটি মূল কারণ ঠিক করা মূলত ভুল। James Reason-এর Swiss cheese মডেল একই কথা ছবিতে বলে। Sidney Dekker দেখান, “মানুষের ভুল” তদন্তের শেষ নয়, বরং শুরু।

আবার পুরোপুরি বাদ দেওয়াও ঠিক নয়। কিছু ঘটনায় একটি স্পষ্ট ত্রুটি থাকে, আর সেটি ঠিক করা দরকার। অনেক প্রতিষ্ঠান, এমনকি নিয়ন্ত্রক সংস্থাও, “root cause” চায়। Trigger, মানে যা ঘটনা শুরু করল, আর contributing factors, মানে যা ঘটতে দিল, আলাদা করে লেখা একটি বাস্তবসম্মত মাঝামাঝি পথ। 5 Whys-ও ব্যবহার করা যায়, শুধু এক শাখায় না থেমে কয়েকটি শাখায়, আর উত্তর “মানুষ”-এ এলে থেমে না গিয়ে।

মূল উপলব্ধি: “এক কারণ” খোঁজা মনকে শান্তি দেয়, সিস্টেমকে নয়। ভালো তদন্ত জিজ্ঞেস করে কোন শর্তগুলো মিলে এটি সম্ভব হলো, আর কোনটি বদলালে ক্ষতি সবচেয়ে কমে।

প্র ০৪Blameless culture কি দায়িত্বহীনতার আরেক নাম? বারবার অবহেলা করলেও কি কিছু বলা যাবে না?

Blameless কথাটি প্রায়ই ভুল বোঝা হয়। এর মানে “কিছুই হবে না” নয়। এর মানে হলো, একটি সৎ ভুলকে শেখার তথ্য হিসেবে দেখা, শাস্তির কারণ হিসেবে নয়।

ধারণাটির শিকড় বিমান চলাচলে। নাসা পরিচালিত Aviation Safety Reporting System ১৯৭৬ সাল থেকে পাইলট আর কর্মীদের গোপনে ঝুঁকির ঘটনা জানানোর সুযোগ দেয়, নির্দিষ্ট শর্তে শাস্তি থেকে কিছু সুরক্ষাসহ। কেন? কারণ শাস্তির ভয়ে মানুষ চুপ থাকলে পরের দুর্ঘটনার সতর্কসংকেত হারিয়ে যায়। Sidney Dekker-এর Just Culture বইটি এই ভারসাম্যই আলোচনা করে, আর John Allspaw ২০১২ সালে Etsy-র লেখায় ধারণাটি software জগতে ছড়িয়ে দেন।

“Just culture” দুটি জিনিস আলাদা করে। সৎ ভুল, যেখানে মানুষ ভালো বিশ্বাসে কাজ করেছেন। আর ইচ্ছাকৃত ক্ষতি বা জেনেশুনে বেপরোয়া আচরণ, যেমন ইচ্ছা করে নিরাপত্তা ব্যবস্থা ভেঙে ক্ষতি করা। দ্বিতীয়টি ব্যবস্থাপনার ও আইনের বিষয়, postmortem-এর নয়। তবে সীমা টানা সহজ নয়। “অবহেলা” বলে মনে হওয়া অনেক কাজ আসলে চাপ, অস্পষ্ট নিয়ম বা খারাপ tool-এর ফল। পরিচিত অভিজ্ঞতা হলো, কেউ বারবার একই ভুল করলে আগে প্রশ্ন করা দরকার ব্যবস্থা তাঁকে কেন এটি করতে দিচ্ছে।

দায়বদ্ধতা এখানে অন্য রূপে থাকে। যিনি ঘটনায় যুক্ত ছিলেন, তিনি পুরো বিবরণ দেন, আর উন্নতির কাজে অংশ নেন। প্রতিটি action item-এর মালিক থাকেন। ব্যবস্থাপনা সেগুলোর সময় দেন, এটিও দায়। তাই blameless মানে হিসাব না নেওয়া নয়, বরং হিসাবের প্রশ্ন বদলানো।

মূল উপলব্ধি: আপনি হয় মানুষকে শাস্তি দিতে পারেন, নয়তো সত্য জানতে পারেন। দুটি একসাথে পাওয়া কঠিন। সিস্টেম নিরাপদ করতে সত্য বেশি কাজের।

প্র ০৫বড় outage-এ সারানোর tool-ই কেন প্রায়ই অকেজো হয়? এটি আগে থেকে ধরবেন কীভাবে?

বড় প্রতিষ্ঠানের প্রকাশিত postmortem-গুলো পাশাপাশি রাখলে একটি ধাঁচ চোখে পড়ে। ফেব্রুয়ারি ২০১৭-তে Amazon-এর S3 outage-এর সময় তাদের status dashboard-এর console নিজেই S3-এর ওপর নির্ভর করায় আপডেট করা যাচ্ছিল না। জুলাই ২০১৯-এ Cloudflare-এর ঘটনায় প্রকৌশলীদের ভেতরের tool-এ ঢুকতে সমস্যা হয়, কারণ access-এর ব্যবস্থা নিজের network-এর ওপর নির্ভর করত। অক্টোবর ২০২১-এ Meta-র বিবরণ অনুযায়ী backbone নষ্ট হওয়ায় দূর থেকে ঢোকার tool অকেজো হয়, আর মানুষকে সশরীরে যেতে হয়, যেখানে কঠোর নিরাপত্তা ব্যবস্থা স্বাভাবিকভাবেই সময় নেয়।

কারণটি গঠনগত। স্বাভাবিক সময়ে একই platform-এ সব রাখা সস্তা ও সুবিধাজনক: login, chat, monitoring, deployment. ফলে একটি লুকানো চক্র তৈরি হয়। A ঠিক করতে লাগে B, আর B চলে A-র ওপর। এই নির্ভরতা শুধু ব্যর্থতার দিনেই ধরা পড়ে। প্রতিদিন সফল হওয়া সিস্টেম এই ফাঁক লুকিয়ে রাখে।

আগে থেকে ধরার উপায়গুলো:

  • নির্ভরতার তালিকা: কাগজে লিখুন, “এই সিস্টেম নষ্ট হলে সারাতে কী কী লাগবে?” তারপর দেখুন সেগুলো কিসের ওপর চলে।
  • Out-of-band পথ: আলাদা network, আলাদা chat, আলাদা provider-এ status page, ফোন নম্বরের ছাপা তালিকা।
  • Break-glass ব্যবস্থা: SSO ভাঙলেও ঢোকার সুরক্ষিত জরুরি পথ, যার ব্যবহার audit হয়।
  • Game day: মহড়ায় সত্যিই chat বা SSO বন্ধ ধরে কাজ করে দেখুন।
  • ধীরে ফেরানো: Meta তাদের লেখায় জানায়, হঠাৎ সব চালু করলে নতুন চাপে আবার ভাঙার ঝুঁকি থাকে, আর আগের “storm” মহড়া তাদের কাজে এসেছিল।

মূল উপলব্ধি: নির্ভরযোগ্য সিস্টেম যথেষ্ট নয়, তাকে সারানোর পথটিও স্বাধীন হতে হবে। পরীক্ষা না করা জরুরি পথ, পরীক্ষা না করা backup-এর মতোই শুধু একটি আশা।

অনুশীলন

হিসাব, সমালোচনা, ফল আন্দাজ আর নকশা। কোনো cloud account লাগবে না।

  1. হিসাব: ৩০ দিনে চারটি incident: (TTD, TTA, TTR মিনিটে) (৪, ২, ২০), (১০, ৫, ৩৫), (৬, ১, ২৫), (৮, ৪, ২৪০). MTTD, MTTA, MTTR, TTR-এর median, MTBF আর availability বের করুন। প্রতিটি incident-কে পুরো outage ধরুন।

    MTTD = (৪ + ১০ + ৬ + ৮) ÷ ৪ = ৭ মিনিট। MTTA = ১২ ÷ ৪ = ৩ মিনিট। MTTR = ৩২০ ÷ ৪ = ৮০ মিনিট।

    সাজালে TTR: ২০, ২৫, ৩৫, ২৪০। Median = (২৫ + ৩৫) ÷ ২ = ৩০ মিনিট। গড়ের চেয়ে অনেক কম, কারণ ২৪০ মিনিটের একটি ঘটনা।

    ৩০ দিন = ৪৩,২০০ মিনিট। MTBF = (৪৩,২০০ − ৩২০) ÷ ৪ = ১০,৭২০ মিনিট ≈ ১৭৮.৭ ঘণ্টা। Availability = ১০,৭২০ ÷ ১০,৮০০ ≈ ৯৯.২৫৯%.

  2. সমালোচনা: একটি postmortem-এর অংশ: “Root cause: জুনিয়র developer ভুল config দিয়েছেন। Action: সবাইকে আরও সতর্ক হতে বলা হয়েছে। Timeline: রাতে সমস্যা হয়, পরে ঠিক হয়।” কমপক্ষে চারটি দুর্বলতা ধরুন, আর আবার লিখুন।

    দুর্বলতা: (১) ব্যক্তিকে দোষ, পদবিও জুড়ে দেওয়া। (২) একটি মাত্র কারণ, অথচ config-এর review বা validation কেন ধরল না, প্রশ্নই নেই। (৩) “সতর্ক হওয়া” পরীক্ষাযোগ্য কাজ নয়, মালিক ও তারিখ নেই। (৪) Timeline-এ সময় নেই, প্রভাবের মাপ নেই। (৫) Detect কীভাবে হলো, তা নেই।

    আবার লেখা: “২৩:১০-এ একটি config বদল production-এ পৌঁছায়। CI-তে schema পরীক্ষা ছিল না, আর বদলটি একসাথে সব server-এ যায়। ২৩:১৪-এ error ৩০%, ২৩:২০-এ alert, ২৩:৪০-এ rollback. Action: CI-তে config schema পরীক্ষা (platform, ১৪ দিন), ধাপে ধাপে config rollout (SRE, ৩০ দিন)।” সময়গুলো উদাহরণ।

  3. ফল আন্দাজ: t1=23:50, t2=00:10. নিচের shell লাইন দুটি কী ছাপবে? কেন প্রথমটি ভুল?
    echo "23:50 00:10" | awk '{split($1,a,":"); split($2,b,":");
      d=(b[1]*60+b[2])-(a[1]*60+a[2]); print d; print (d<0 ? d+1440 : d)}'

    প্রথম লাইনে -1420, দ্বিতীয় লাইনে 20. ০০:১০ = ১০ মিনিট, ২৩:৫০ = ১,৪৩০ মিনিট, বিয়োগ −১,৪২০। মধ্যরাত পেরিয়েছে, তাই ১,৪৪০ যোগ করে ২০ মিনিট। তবে এই কৌশল ধরে নেয় দুটি সময়ের ব্যবধান ২৪ ঘণ্টার কম। বাস্তবে তারিখসহ UTC timestamp রাখাই নিরাপদ।

  4. নকশা: “Disk ৯০% ভরে গেছে” alert-এর জন্য একটি ছোট runbook লিখুন: alert, মালিক, শেষ পরীক্ষা, পাঁচটি ধাপ, প্রতিটিতে প্রত্যাশিত ফল, ঝুঁকি আর থামার শর্ত। তারপর দলের সাথে ৩০ মিনিটের tabletop game day করে দেখুন। আসল cloud-এ পরীক্ষা করলে খরচ হতে পারে, তাই এটি কাগজে করাই যথেষ্ট।

    একটি ভালো উত্তরের কাঠামো:

    1. কোন partition ভরেছে, দেখুন (df -h), কত দ্রুত বাড়ছে, তা-ও।
    2. কী জায়গা নিচ্ছে, দেখুন (du -xh --max-depth=1 /var | sort -h). প্রত্যাশা: বড় log বা পুরোনো artifact.
    3. নিরাপদ অংশ পরিষ্কার করুন: rotate হওয়া log. সক্রিয় log বা ডেটা ফাইল মুছবেন না, database ফাইল তো নয়ই। মুছলেও process খোলা রাখলে জায়গা ফেরে না।
    4. Log rotation ঠিক আছে কি না, যাচাই করুন, খুব দ্রুত ভরলে কারণ খুঁজুন।
    5. ৯৫% পেরোলে বা ১৫ মিনিটে না কমলে on-call lead-কে ডাকুন, disk বাড়ানোর কথা ভাবুন, আর খরচ জানান।

    Tabletop-এ দেখুন: নতুন একজন শুধু এই পাতা পড়ে কাজ করতে পারেন কি না। আটকে গেলে সেটিই runbook-এর ফাঁক।

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

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

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

  1. Detect — alert বা অভিযোগে সমস্যা ধরা
  2. Triage — প্রভাব, severity, কাকে ডাকা হবে
  3. Mitigate — rollback বা অন্য উপায়ে ক্ষতি থামানো
  4. Resolve — সেবা স্থির, all-clear ঘোষণা
  5. Learn — postmortem আর action item

Sev-1 outage চলছে। ১০ মিনিট আগে একটি release হয়েছে, কারণ এখনো অজানা, release-এ schema বদল নেই। প্রথম ভালো পদক্ষেপ কোনটি?

  • Root cause নিশ্চিত হওয়া পর্যন্ত কিছু না বদলানো
  • আগের version-এ rollback করে ক্ষতি থামানো
  • দ্রুত নতুন কোড লিখে সরাসরি production-এ পাঠানো
  • সঙ্গে সঙ্গে postmortem লিখতে বসা

Incident commander-এর প্রধান কাজ কোনটি?

  • নিজে সব command চালানো
  • সময়সহ শুধু নোট লেখা
  • কাজ ভাগ করা, অগ্রাধিকার ঠিক করা আর সমন্বয় রাখা
  • কার ভুলে ঘটনা ঘটল, তা খুঁজে বের করা

পাঁচটি incident-এর TTR (মিনিট): ১০, ২০, ৩০, ৪০, ৪০০. MTTR আর median কত?

  • MTTR ১০০, median ৩০
  • MTTR ৩০, median ১০০
  • MTTR ২৫, median ৩০
  • MTTR ১০০, median ৪০

কোন action item সবচেয়ে ভালোভাবে লেখা?

  • সবাই আরও সতর্ক থাকবেন
  • Monitoring উন্নত করতে হবে
  • যিনি deploy করেছেন, তাঁকে production access থেকে সরানো
  • CI-তে ধীর query পরীক্ষা যোগ করা, মালিক platform দল, ৩০ দিনের মধ্যে

Status page কোথায় চালানো সবচেয়ে নিরাপদ?

  • মূল অ্যাপের একই server আর database-এ
  • আলাদা provider ও domain-এ, মূল সিস্টেমের ওপর নির্ভরতা ছাড়া
  • শুধু অফিসের ভেতরের network-এ
  • মূল সেবার একই CDN আর DNS-এ, একটি আলাদা URL path-এ

5 Whys পদ্ধতির একটি প্রধান সীমা কোনটি?

  • এটি শুধু দামি software দিয়ে করা যায়
  • এটি অপ্রয়োজনীয়ভাবে অনেকগুলো কারণ বের করে
  • এক সরল কারণ-শিকল ধরে হাঁটে, জটিল সিস্টেমের একাধিক শর্ত হারিয়ে ফেলতে পারে
  • এটি শুধু গাড়ি কারখানায় ব্যবহার করা বৈধ

শব্দকোষ

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

মনে রাখুন

  1. পথটি পাঁচ ধাপের: detect, triage, mitigate, resolve, learn. Severity আগে থেকে লিখে রাখুন, সন্দেহ হলে উঁচু ধরুন।
  2. আগে ক্ষতি থামান: “কী বদলেছে?” জিজ্ঞেস করুন, সম্ভব হলে rollback. ব্যতিক্রম নিরাপত্তা আর ডেটা নষ্টের ঘটনা।
  3. ভূমিকা স্পষ্ট: commander, ops, comms, scribe. হস্তান্তর মুখে বলে নিশ্চিত করুন।
  4. MTTD, MTTA, MTTR, MTBF-এর শুরু ও শেষের মুহূর্ত লিখুন। গড়ের সাথে median দেখুন, সংখ্যাকে লক্ষ্য বানাবেন না।
  5. Postmortem blameless, কিন্তু প্রতিটি কাজের মালিক ও তারিখ আছে। Game day অনুশীলন করুন, on-call-এর ভার মাপুন।

পরের পর্বে: Incident-এর অপেক্ষায় না থেকে ইচ্ছা করে সিস্টেমকে পরীক্ষা করা: chaos engineering, load test আর capacity planning.

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

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