০০ যে প্রশ্নগুলোর উত্তর খুঁজবো
সেশন ১৯ এ আমরা system এর ভেতরটা দেখার উপায় শিখেছি: log, metric আর trace। কিন্তু শুধু দেখার ব্যবস্থা থাকলেই হয় না। রাত তিনটায় কেউ dashboard এর সামনে বসে থাকে না। তাই system কে নিজে থেকেই মানুষকে ডাকতে হয়, আর ডাকতে হয় ঠিক সময়ে, ঠিক কারণে।
এই সেশনে আমরা শিখবো, কোন সংখ্যা দেখে বুঝবো system ভালো আছে, কখন একজন মানুষের ঘুম ভাঙানো উচিত, আর কখন একদম উচিত নয়। শেষে আপনি জানবেন, সমস্যা এলে একটা team কীভাবে শান্ত মাথায় সেটা সামলায়, আর পরে কীভাবে তা থেকে শেখে।
- ১ এক রাতে ৩৭টা alert, অথচ একজন user ও সমস্যায় পড়েনি। এটা কেন বিপজ্জনক? (alert fatigue)
- ২ "System ভালো চলছে" কথাটা কীভাবে মাপবো? (SLI, SLO, SLA)
- ৩ SLO কেন ১০০% নয়, আর বাকি ০.১% দিয়ে কী করবো? (error budget)
- ৪ যেকোনো service এর কোন চারটা সংখ্যা সবসময় দেখতে হয়? (golden signals)
- ৫ Alert দেবো CPU এর উপর, নাকি user এর কষ্টের উপর? (symptom-based বনাম cause-based alert)
- ৬ Alert ঠিক কখন বাজবে? (threshold, burn rate)
- ৭ একটা ভালো dashboard দেখতে কেমন?
- ৮ রাত তিনটায় phone বাজলে কী করবো? (on-call, runbook)
- ৯ সমস্যা মিটে গেলে কী করবো? (blameless postmortem)
০১ এক রাতে ৩৭টা alert, অথচ একজন user ও সমস্যায় পড়েনি। এটা কেন বিপজ্জনক?
বৃহস্পতিবার রাত এগারোটা চল্লিশ। মাহিন সবে ঘুমিয়েছে। ছয় মাস হলো সে একটা বাসের টিকিট কাটার অ্যাপে backend engineer হিসেবে কাজ করছে, আর এই সপ্তাহে প্রথমবার তার on-call duty। হঠাৎ phone বেজে উঠলো: “CPU above 80% on web-07”। বুক ধড়ফড় করতে করতে সে laptop খুললো। Login করতে করতে CPU নেমে এলো ৬২% এ। সে আবার শুয়ে পড়লো। দশ মিনিট পর আবার বাজলো। তারপর আবার। ভোর পাঁচটা পর্যন্ত phone বাজলো মোট ৩৭ বার।
সকালে চোখ লাল করে অফিসে এসে মাহিন checkout এর graph খুললো। সারা রাত টিকিট কেনা স্বাভাবিক ছিলো। একজন user ও কোনো সমস্যায় পড়েনি।
আগে কয়েকটা শব্দ পরিষ্কার করে নিই। Monitoring মানে system এর সংখ্যাগুলো (CPU, request, error) সারাক্ষণ মাপা আর graph এ দেখা। Alert মানে কোনো সংখ্যা বিপদের সীমা পার হলে system নিজেই একজন মানুষকে খবর দেয়। যে alert রাতেও phone বাজিয়ে মানুষকে জাগায়, তাকে বলে page।
মাহিনের ৩৭টা page এর কারণ খুঁজে পাওয়া গেলো সহজেই। প্রতি রাতে একটা batch job (নির্দিষ্ট সময়ে নিজে থেকে চলা একটা বড় কাজ) বাস কোম্পানিগুলোর server থেকে seat এর তথ্য sync করে। Job চলার সময় CPU কয়েক মিনিটের জন্য ৮৫% এ ওঠে, তারপর নেমে যায়। আর alert এর নিয়ম ছিলো: CPU টানা ১ মিনিট ৮০% এর উপরে থাকলেই page যাবে। CPU যতবার সীমার উপরে-নিচে দুলেছে, ততবার phone বেজেছে।
রাখাল বালক আর বাঘের গল্প
ছোটবেলার সেই গল্পটা মনে আছে? রাখাল বালক মজা করে বারবার “বাঘ এসেছে” বলে চিৎকার করতো। গ্রামের মানুষ প্রতিবার দৌড়ে এসে দেখতো, কিছুই নেই। যেদিন সত্যিই বাঘ এলো, সেদিন কেউ আর আসেনি।
Alert এর ক্ষেত্রেও ঠিক একই জিনিস ঘটে। যে alert বারবার বাজে অথচ কিছু করার থাকে না, মানুষ ধীরে ধীরে সেটাকে উপেক্ষা করতে শেখে। Phone silent এ চলে যায়, notification না পড়েই সরিয়ে দেওয়া হয়। এই অবস্থার নাম alert fatigue। এর তিনটা খারাপ ফল আছে:
- আসল alert হারিয়ে যায়: ৩৭টা মিথ্যা alert এর ভিড়ে সত্যিকারের একটা alert আলাদা করে চোখে পড়ে না।
- Engineer ক্লান্ত হয়: ঘুম ভাঙা রাতের পর পরদিন কাজে ভুল বেশি হয়। এভাবে কয়েক মাস চললে ভালো engineer চাকরি ছেড়ে চলে যায়।
- Alert এর উপর বিশ্বাস নষ্ট হয়: একবার team ধরে নিলে যে “এগুলো তো সবসময়ই বাজে”, তখন সত্যিকারের বিপদেও কেউ তাড়াহুড়ো করে না।
Alert এর সংখ্যা বেশি হলে system বেশি নিরাপদ হয় না, বরং কম নিরাপদ হয়। প্রতিটা page এর পেছনে এমন একটা সমস্যা থাকা উচিত, যেটা user এর ক্ষতি করছে আর যেটা ঠিক করতে এখনই একজন মানুষের হাত লাগবে।
তাহলে প্রশ্ন দাঁড়ালো, “user এর ক্ষতি” জিনিসটা মাপবো কীভাবে? পরের দিন সকালে team lead নাদিয়া আপা মাহিনকে ঠিক এই প্রশ্নটাই করলেন।
০২ “System ভালো চলছে” কথাটা কীভাবে মাপবো?
সেশন ০১ এ আপনি দুটো শব্দ দেখেছেন। SLA হলো customer কে দেওয়া লিখিত চুক্তি (“৯৯% request 500ms এর মধ্যে শেষ হবে, না হলে টাকা ফেরত”)। SLO হলো team এর নিজের লক্ষ্য, যেটা SLA এর চেয়ে কড়া রাখা হয় (“৯৯% request 200ms এর মধ্যে”)। কিন্তু একটা প্রশ্ন তখন বাকি ছিলো: লক্ষ্য তো ঠিক হলো, এখন আসলে কতটা ভালো চলছে, সেই সংখ্যাটা আসে কোথা থেকে?
সেই সংখ্যাটার নাম SLI (Service Level Indicator)। SLI হলো একটা মাপা সংখ্যা, যেটা বলে user এর দিক থেকে service টা কতটা ভালো চলছে। সাধারণত এটা একটা ভগ্নাংশ:
ভালো ঘটনার সংখ্যাকে মোট ঘটনার সংখ্যা দিয়ে ভাগ করলেই SLI পাওয়া যায়।
টিকিট অ্যাপের জন্য নাদিয়া আপা আর মাহিন মিলে দুটো SLI বেছে নিলো:
- Checkout এর সফলতা: যতগুলো checkout শুরু হয়েছে, তার মধ্যে কতগুলো টিকিট দিয়ে শেষ হয়েছে। গত ৩০ দিনে এটা ছিলো ৯৯.৯৩%।
- Search এর গতি: কতগুলো search 300ms এর মধ্যে উত্তর পেয়েছে। এখানে p99 এর ধারণা কাজে লাগে, যেটা সেশন ১৯ এ দেখেছেন: সবচেয়ে ধীর ১% request বাদ দিলে বাকি সবাই কত সময়ের মধ্যে উত্তর পায়।
খেয়াল করুন, দুটো SLI এর কোনোটাই CPU বা memory নিয়ে নয়। দুটোই এমন জিনিস মাপে, যেটা একজন যাত্রী নিজের চোখে টের পায়: টিকিট কাটা গেলো কিনা, আর বাসের তালিকা তাড়াতাড়ি এলো কিনা।
তিনটা শব্দকে একটা মাপকাঠিতে বসালে সম্পর্কটা পরিষ্কার হয়:
| কী | কে দেখে | না মিললে কী হয় | |
|---|---|---|---|
| SLI | আসলে যা মাপা হলো (৯৯.৯৩%) | Engineering team | কিছু হয় না, এটা শুধু একটা সংখ্যা |
| SLO | Team এর লক্ষ্য (৯৯.৯%) | Engineering আর product team | Team নিজেই কাজের অগ্রাধিকার বদলায় |
| SLA | Customer এর সাথে চুক্তি (৯৯.৫%) | Customer আর আইনি বিভাগ | টাকা ফেরত বা জরিমানা দিতে হয় |
SLI হলো thermometer এর পারদ। SLO হলো ডাক্তারের বলে দেওয়া স্বাভাবিক তাপমাত্রা। SLA হলো এমন একটা প্রতিশ্রুতি, যেটা ভাঙলে জরিমানা দিতে হয়। পারদ স্বাভাবিকের ঘরে থাকলে চিন্তার কিছু নেই।
০৩ SLO কেন ১০০% নয়, আর বাকি ০.১% দিয়ে কী করবো?
মাহিনের প্রথম প্রশ্ন ছিলো, “আপা, লক্ষ্য ১০০% রাখলেই তো হয়। ০.১% fail কেন মেনে নেবো?”
নাদিয়া আপা তিনটা কারণ বললেন। প্রথমত, ১০০% পাওয়া প্রায় অসম্ভব। Disk নষ্ট হয়, network কাটে, আবার payment gateway (যে বাইরের service টাকা কাটার কাজটা করে) নিজেই মাঝে মাঝে down থাকে। দ্বিতীয়ত, প্রতিটা বাড়তি “৯” এর খরচ অনেক বেশি। ৯৯.৯% থেকে ৯৯.৯৯% এ যেতে প্রায়ই দ্বিগুণ server, আরেকটা data center আর অনেক বেশি engineer এর সময় লাগে। তৃতীয়ত, user নিজেই পার্থক্যটা টের পায় না। তার মোবাইলের ইন্টারনেট সংযোগ এমনিতেই এর চেয়ে বেশি বার কেটে যায়।
তাহলে বাকি ০.১% কী? এটা হলো error budget: SLO এর ভেতরে থেকেও যতটুকু fail করার অনুমতি আছে। টিকিট অ্যাপে হিসাবটা দাঁড়ায় এমন:
SLO: 30 দিনে 99.9% checkout সফল হতে হবে
মাসে মোট checkout: 10,000,000 (এক কোটি)
Error budget: 100% - 99.9% = 0.1%
request এর হিসাবে: 10,000,000 × 0.001 = 10,000 টা checkout fail করতে পারে
সময়ের হিসাবে: 30 দিন = 43,200 মিনিট
43,200 × 0.001 = 43.2 মিনিট পুরো down থাকা চলে
অর্থাৎ এই মাসে ১০,০০০টা checkout fail করলেও SLO ঠিক থাকে। Budget শব্দটা ইচ্ছা করেই বেছে নেওয়া হয়েছে। মাসের হাতখরচের মতো এটা খরচ করা যায়। প্রতিটা ঝুঁকির deploy, প্রতিটা নতুন feature, প্রতিটা ছোট outage (service পুরো বা আংশিক বন্ধ থাকা) এই budget থেকে কিছুটা করে খরচ করে।
শনিবার সকালে budget এর অর্ধেক শেষ
মাসের ১৮তম দিন পর্যন্ত টিকিট অ্যাপ budget এর ৩০% খরচ করেছিলো। তারপর এলো মাহিনের সেই রাতের দুই দিন পরের শনিবার। ৯টা ২ মিনিটে একটা নতুন version deploy হলো। ৯টা ৫ মিনিট থেকে প্রতি পাঁচটা checkout এর একটা fail করতে লাগলো। পুরো ঘটনাটা পরে বিস্তারিত দেখবো। এখানে শুধু হিসাবটা দেখুন: ৫০ মিনিটে প্রায় ২৪,০০০টা checkout হয়েছে, তার মধ্যে ৪,৮০০টা fail করেছে। এক সকালেই budget এর ৪৮% শেষ হয়ে গেলো। (শনিবার সকালে traffic মাসের গড়ের প্রায় দ্বিগুণ থাকে। তাই সময়ের হিসাবের চেয়ে request এর হিসাবে ক্ষতি বেশি দাঁড়ায়।)
Feature নাকি reliability: budget ই সিদ্ধান্ত নেয়
Error budget এর সবচেয়ে বড় কাজ হলো একটা পুরোনো ঝগড়া মিটিয়ে দেওয়া। Product team চায় দ্রুত নতুন feature ship করতে। Engineering team চায় system স্থির রাখতে। কার কথা চলবে? আগে থেকে লিখে রাখা একটা নিয়ম, যার নাম error budget policy, এই প্রশ্নের উত্তর দেয়:
নিয়মটা কারো মতামতের উপর নির্ভর করে না, একটা সংখ্যার উপর নির্ভর করে। Budget বাকি থাকলে product team যত খুশি feature ship করতে পারে। Budget শেষ হলে নতুন feature বন্ধ থাকে (একে বলে feature freeze)। তখন পুরো team reliability এর কাজ করে, যতক্ষণ না SLI আবার নিরাপদ জায়গায় ফেরে।
Error budget fail করার অজুহাত নয়। এটা একটা মাপা ঝুঁকির সীমা। Budget বাকি থাকা মানে আপনি দরকারের চেয়ে বেশি সাবধান, তাই আরেকটু দ্রুত চলা যায়। Budget শেষ মানে আপনি বেশি দ্রুত চলেছেন, এখন থামার সময়।
০৪ যেকোনো service এর কোন চারটা সংখ্যা সবসময় দেখতে হয়?
SLI বলে দেয় user খুশি কিনা। কিন্তু একটা service এর স্বাস্থ্য বুঝতে আরো কয়েকটা সংখ্যা লাগে। Google এর engineer রা বছরের পর বছর অভিজ্ঞতা থেকে চারটা সংখ্যা বেছে নিয়েছেন, যেগুলো প্রায় যেকোনো service এর জন্য কাজ করে। এদের বলে golden signals:
- Latency: একটা request এর উত্তর আসতে কত সময় লাগে। এখানে একটা ফাঁদ আছে। Fail হওয়া request প্রায়ই খুব দ্রুত ফেরত আসে, কারণ server কাজটা না করেই error দিয়ে দেয়। তাই সফল আর fail হওয়া request এর latency আলাদা করে মাপতে হয়। না হলে error বাড়লে latency এর graph উল্টো ভালো দেখায়।
- Traffic: Service এর উপর কতটা চাপ আসছে, যেমন প্রতি সেকেন্ডে কতগুলো request। টিকিট অ্যাপে সাধারণ দিনে এটা 800 req/s, কিন্তু ঈদের আগের সপ্তাহে 4,000 req/s পর্যন্ত ওঠে।
- Errors: কতগুলো request fail করছে। শুধু 500 এর মতো error code নয়, ভুল উত্তরও এর মধ্যে পড়ে। যেমন, payment সফল হলো অথচ টিকিট তৈরি হলো না।
- Saturation: Service এর সবচেয়ে সীমিত resource টা কতটা ভরে গেছে। এটা CPU হতে পারে, memory হতে পারে, আবার database এর connection pool ও হতে পারে (আগে থেকে খুলে রাখা database connection এর একটা সীমিত সেট)। টিকিট অ্যাপে সবার আগে এই pool টাই ভরে যায়।
এই চারটা সংখ্যা একসাথে একটা গল্প বলে। Traffic বাড়লো, saturation ১০০% এ পৌঁছালো, তারপর latency বাড়লো, শেষে error শুরু হলো। প্রায় প্রতিটা overload এই ক্রমেই ঘটে।
০৫ Alert দেবো CPU এর উপর, নাকি user এর কষ্টের উপর?
এবার শনিবার সকালের সেই ঘটনায় ফিরি। ৯টা ২ মিনিটে রাতুল একটা deploy করলো। তার ভেতরে একটা ছোট্ট পরিবর্তন ছিলো: payment gateway এর timeout ১০ সেকেন্ড থেকে কমিয়ে ১ সেকেন্ড করা হয়েছিলো। (Timeout মানে কতক্ষণ উত্তরের জন্য অপেক্ষা করে request বাতিল করা হবে, সেশন ০১ এ দেখেছেন।) শনিবার সকালে ভিড়ের সময় gateway এর প্রতি পাঁচটা উত্তরের একটা আসতে ১.২ সেকেন্ডের মতো লাগছিলো। ফলে সেই checkout গুলো fail করতে লাগলো।
মাহিনের phone এ একটাও alert আসেনি। কেন? কারণ সব alert ছিলো CPU, memory আর disk এর উপর। আর fail হওয়া request এ server এর কাজ কম হয়, তাই CPU উল্টো নেমে গিয়েছিলো ৩৫% এ। ৯টা ৪০ মিনিটে Facebook এ যাত্রীদের অভিযোগ আসতে শুরু করলো। ৯টা ৪৪ মিনিটে support team মাহিনকে call করলো।
এখানে দুই রকম alert এর পার্থক্য পরিষ্কার হয়:
- Cause-based alert: সমস্যার সম্ভাব্য কারণের উপর alert। যেমন CPU ৮০% ছাড়ালো, memory ভরে আসছে, একটা server down হলো। সমস্যা হলো, কারণ থাকলেও অনেক সময় user এর কোনো ক্ষতি হয় না (মাহিনের সেই ৩৭টা alert), আবার কারণের তালিকার বাইরের কোনো সমস্যায় alert বাজেই না (শনিবার সকাল)।
- Symptom-based alert: User যা টের পায়, তার উপর alert। যেমন checkout এর সফলতা SLO এর নিচে নামলো, বা search ধীর হয়ে গেলো। কারণ যেটাই হোক, ১ সেকেন্ডের timeout হোক বা অচেনা কোনো bug, user কষ্ট পেলেই এই alert বাজবে।
তাহলে CPU এর মতো সংখ্যাগুলো কি ফেলে দেবো? না। এগুলো dashboard এ থাকে, সমস্যার কারণ খুঁজতে কাজে লাগে। শুধু এগুলোর জন্য কারো ঘুম ভাঙানো হয় না। কোন signal এর জায়গা কোথায়, সেটা দুটো প্রশ্ন দিয়ে ঠিক করা যায়:
এখানে একটা নতুন শব্দ এলো: ticket। এটা বাসের টিকিট নয়, কাজের ticket। Ticket মানে team এর কাজের তালিকায় একটা কাজ যোগ হয়, যেটা কেউ পরের কর্মদিবসে দেখবে। যেমন, disk সাত দিনে ভরে যাবে। এটা জরুরি, কিন্তু রাত তিনটায় কাউকে ডাকার মতো জরুরি নয়।
Page দিন symptom এর উপর, কারণ user এর কষ্টই আসল বিপদ। Cause এর সংখ্যাগুলো dashboard এ রাখুন, যাতে page আসার পর কারণ খুঁজতে পারেন। মাহিনের ৩৭টা CPU alert dashboard এ গেলো। তার জায়গায় এলো একটা মাত্র নতুন alert: checkout এর সফলতা।
০৬ Alert ঠিক কখন বাজবে?
Checkout এর সফলতার উপর alert দেবো, ঠিক আছে। কিন্তু কোন সংখ্যায় বাজবে?
সহজ পথ: threshold
সবচেয়ে সহজ নিয়ম হলো একটা নির্দিষ্ট সীমা, যার নাম threshold। যেমন, শেষ ৫ মিনিটে error ১% ছাড়ালেই page যাবে। নিয়মটা বোঝা সহজ, কিন্তু এর দুটো দুর্বলতা আছে। দুই মিনিটের একটা ছোট ঝাঁকুনিতেও phone বাজে, অথচ তাতে budget এর সামান্যই খরচ হয়। আবার সারাদিন ধরে ০.৫% error চলতে থাকলে alert কখনো বাজে না, অথচ চুপচাপ budget শেষ হয়ে যায়।
ভালো পথ: burn rate
এর চেয়ে ভালো প্রশ্ন হলো: “এই গতিতে চললে budget কত তাড়াতাড়ি শেষ হবে?” এই গতিটার নাম burn rate। এখনকার error rate কে SLO এর অনুমতি দেওয়া error rate (০.১%) দিয়ে ভাগ করলে burn rate পাওয়া যায়।
- Burn rate ১: Error ঠিক ০.১% হারে হচ্ছে। এভাবে চললে budget ঠিক ৩০ দিনে শেষ হবে, তাই চিন্তার কিছু নেই।
- Burn rate ১০: Error ১% হারে হচ্ছে। Budget ৩ দিনে শেষ হবে।
- Burn rate ২০০: শনিবার সকালে error ছিলো ২০%। এভাবে চললে পুরো মাসের budget মাত্র সাড়ে তিন ঘণ্টায় শেষ হতো।
বাস্তবে team গুলো সাধারণত দুই-তিনটা burn rate নিয়ম একসাথে রাখে। একটা দ্রুত বিপদ ধরে, আরেকটা ধীরে চলা ক্ষতি ধরে:
| নিয়ম | কতটা সময় ধরে দেখা হয় | Burn rate এর সীমা | তখন budget এর কতটা খরচ হয় | কী হয় |
|---|---|---|---|---|
| দ্রুত ক্ষতি | শেষ ১ ঘণ্টা | ১৪.৪ এর বেশি | ১ ঘণ্টায় ২% | Page |
| মাঝারি ক্ষতি | শেষ ৬ ঘণ্টা | ৬ এর বেশি | ৬ ঘণ্টায় ৫% | Page |
| ধীর ক্ষতি | শেষ ৩ দিন | ১ এর বেশি | ৩ দিনে ১০% | Ticket |
শনিবার সকালে প্রথম নিয়মটা থাকলে কী হতো? ২০% error চললে শেষ এক ঘণ্টার গড় ১.৪৪% ছাড়াতে মাত্র সাড়ে চার মিনিট লাগে। অর্থাৎ ৯টা ৯ মিনিটেই মাহিনের phone বাজতো, Facebook এর অভিযোগের ৩১ মিনিট আগে। আর মাহিনের সেই রাতের CPU ঝাঁকুনি গুলো? তাতে checkout এর একটাও fail হয়নি, তাই burn rate ০ ছিলো। কোনো phone বাজতো না।
Burn rate alert শুধু জিজ্ঞেস করে, user এর ক্ষতি কত দ্রুত হচ্ছে। বড় ক্ষতি হলে কয়েক মিনিটে বাজে। ছোট ঝাঁকুনিতে বাজে না। আর চুপচাপ চলতে থাকা ধীর ক্ষতিও শেষ পর্যন্ত একটা ticket হয়ে ধরা পড়ে।
০৭ একটা ভালো dashboard দেখতে কেমন?
শনিবার ৯টা ৪৪ মিনিটে মাহিন যখন laptop খুললো, তখন তার সামনে ছিলো একটা dashboard এ ৬০টা graph। প্রতিটা server এর CPU, memory, disk, network। কোন graph টা দেখবে, সেটা বুঝতেই তার আট মিনিট চলে গেলো।
Dashboard হলো graph এর একটা সাজানো পাতা, যেটা একনজরে system এর অবস্থা দেখায়। ভালো dashboard এর নিয়ম একটাই: প্রতিটা dashboard একটা প্রশ্নের উত্তর দেবে। প্রশ্নটা dashboard এর নামেই লেখা থাকবে।
- Overview (প্রথম পাতা): “User রা কি টিকিট কিনতে পারছে?” এখানে থাকে SLO এর অবস্থা, বাকি error budget আর চারটা golden signal। সব সবুজ থাকলে এক নজরেই কাজ শেষ।
- Service: প্রতিটা service এর নিজের dashboard, যেমন search, checkout আর payment। প্রথম পাতায় লাল দেখলে এখানে এসে বোঝা যায় কোন service এ সমস্যা।
- Detail: একটা service এর ভেতরের সংখ্যা, যেমন gateway এর latency, timeout এর সংখ্যা, CPU। কারণ খোঁজার সময় এই পাতায় আসতে হয়।
নতুন dashboard এ শনিবারের ঘটনাটা খুঁজতে তিনটা click লাগতো। Overview এ checkout লাল, payment service এর পাতায় error বাড়ছে, আর detail পাতায় gateway timeout এর সংখ্যা হঠাৎ লাফিয়ে উঠেছে ঠিক ৯টা ৫ মিনিটে।
০৮ রাত তিনটায় phone বাজলে কী করবো?
On-call: পালা করে পাহারা
একটা system দিনরাত চলে, কিন্তু একজন মানুষ দিনরাত জেগে থাকতে পারে না। তাই team গুলো পালা করে দায়িত্ব নেয়। এর নাম on-call। প্রতি সপ্তাহে একজন primary থাকে, যার phone এ page আসে। তার পেছনে থাকে একজন secondary। Primary নির্দিষ্ট সময়ের মধ্যে সাড়া না দিলে page নিজে থেকেই secondary এর কাছে চলে যায়। একে বলে escalation।
কয়েকটা নিয়ম on-call কে মানুষের পক্ষে সহনীয় রাখে:
- Acknowledge এর সময় বাঁধা: Page আসার ৫ মিনিটের মধ্যে “আমি দেখছি” জানাতে হয়। একে বলে acknowledge করা। এতে সবাই জানে, কেউ একজন দায়িত্ব নিয়েছে।
- Page এর সংখ্যার সীমা: অনেক team লক্ষ্য রাখে, এক shift এ যেন দুইটার বেশি incident (user এর ক্ষতি হচ্ছে এমন ঘটনা) না আসে। এর বেশি এলে সেটাকে alert এর নিয়মের সমস্যা হিসেবে ধরা হয়, মানুষের সমস্যা হিসেবে নয়।
- Handoff: সপ্তাহ শেষে আগের on-call পরের জনকে বুঝিয়ে দেয়, কোন সমস্যা এখনো চলছে।
Runbook: রাত তিনটার জন্য লেখা নির্দেশিকা
রাত তিনটায় ঘুম ভাঙা মাথায় কেউ ভালো করে চিন্তা করতে পারে না। তাই প্রতিটা alert এর সাথে একটা লেখা নির্দেশিকা থাকে, যার নাম runbook। Runbook দিনের আলোয়, ঠান্ডা মাথায় লেখা হয়। এতে থাকে alert টার মানে কী, কোন dashboard দেখতে হবে, সম্ভাব্য কারণগুলো কী, আর প্রতিটা কারণে কী করতে হবে। মাহিন search এর latency alert এর জন্য এই runbook টা লিখলো:
RUNBOOK: SearchLatencyFastBurn
এই alert এর মানে: search এর p99 latency অনেকক্ষণ ধরে 300ms এর উপরে।
এভাবে চললে মাসের পুরো budget 2 দিনেই শেষ হবে।
Dashboard: "Search: user রা কি দ্রুত বাস খুঁজে পাচ্ছে?"
1. Traffic দেখুন: req/s কি স্বাভাবিকের (800) চেয়ে অনেক বেশি?
2. Deploy দেখুন: গত 1 ঘণ্টায় deploy হয়েছে? হলে আগে rollback করুন।
3. DB pool দেখুন: connection 100/100 ভরা? তাহলে search এর server বাড়ান।
kubectl scale deploy/search --replicas=12
4. 15 মিনিটে ঠিক না হলে: secondary on-call কে ডাকুন।
5. সবশেষে: #incidents channel এ তিন লাইনে update দিন।
Runbook এর kubectl লাইনটা Kubernetes নামের একটা tool এর command। এটা দিয়ে ঠিক করা যায় একটা service এর কতগুলো copy চলবে। এর বিস্তারিত এই সেশনের বিষয় নয়। শুধু খেয়াল করুন, রাত তিনটায় মাহিনকে command টা মনে করতে হবে না, কারণ সেটা লেখাই আছে।
ঈদের আগের রাত
ছয় সপ্তাহ পর, ঈদের আগের সপ্তাহে মাহিনের আবার on-call পড়লো। রাত ৯টা ১৪ মিনিটে phone বাজলো। এবার একটা মাত্র page, আর সেটা সত্যিকারের: search ধীর হয়ে গেছে, p99 latency 1.8s। মাহিন runbook খুললো, ধাপে ধাপে এগোলো:
চতুর্থ ধাপটা লক্ষ্য করুন। মাহিন DB pool কেন ভরে গেলো, সেটা খুঁজতে বসেনি। আগে search এর server ৬টা থেকে ১২টা করে user দের কষ্ট থামিয়েছে। এই কাজটার নাম mitigation: সমস্যার মূল কারণ ঠিক না করেই ক্ষতি থামানো। Rollback (আগের ভালো version এ ফিরে যাওয়া), server বাড়ানো, একটা feature বন্ধ করা, এগুলো সবই mitigation। মূল কারণ খোঁজা হয় পরে, দিনের আলোয়।
আগে user এর ক্ষতি থামান, তারপর কারণ খুঁজুন। User কষ্ট পাচ্ছে এমন অবস্থায় কারণ খোঁজার চেয়ে আগের অবস্থায় ফিরে যাওয়া প্রায় সবসময় ভালো। মূল কারণ খোঁজার জন্য পরের দিন পুরোটাই পড়ে আছে।
০৯ সমস্যা মিটে গেলে কী করবো?
শনিবারের outage এর পরের সোমবার। মিটিং রুমে রাতুল চুপচাপ বসে আছে। সে ধরে নিয়েছে আজ তাকে সবার সামনে বকা শুনতে হবে। কিন্তু নাদিয়া আপা মিটিং শুরু করলেন একটা কথা দিয়ে: “আজ আমরা খুঁজবো না কে ভুল করেছে। আমরা খুঁজবো, আমাদের system কেন একটা ভুলকে ৫০ মিনিট ধরে user এর কাছে পৌঁছাতে দিলো।”
এই মিটিং আর তার লিখিত রিপোর্টের নাম postmortem। আর যে postmortem এ কোনো মানুষকে দোষ দেওয়া হয় না, তাকে বলে blameless postmortem।
দোষ না দেওয়া কেন জরুরি
রাতুলকে দোষ দিলে কী হতো? পরের বার কেউ ভুল করলে সেটা লুকানোর চেষ্টা করতো। কেউ নিজে থেকে বলতো না, “আমার deploy এর পর থেকেই সমস্যা শুরু।” অথচ incident এর সময় ঠিক এই কথাটাই সবচেয়ে দ্রুত সমাধানে পৌঁছে দেয়।
তাছাড়া প্রশ্নটাও ভুল। ১ সেকেন্ডের timeout লেখা একটা মানুষের ভুল। কিন্তু সেই ভুল কোনো test এ ধরা পড়েনি, কোনো review এ চোখে পড়েনি, আর কোনো alert ও বাজেনি। প্রতিটা ফাঁক system এর, মানুষের নয়। মানুষ বদলালেও এই ফাঁকগুলো থেকে যায়। ফাঁক বন্ধ করলে পরের মানুষটাও একই ভুল করতে পারবে না।
Postmortem এ কী থাকে
একটা postmortem এ সাধারণত পাঁচটা অংশ থাকে: কী হয়েছিলো তার ছোট সারাংশ, user এর উপর প্রভাব (৪,৮০০টা fail হওয়া checkout, budget এর ৪৮%), মিনিট ধরে ধরে timeline, মূল কারণ, আর ভবিষ্যতের জন্য কাজের তালিকা। Timeline লিখতে গিয়েই সবচেয়ে বড় শিক্ষাটা চোখে পড়লো:
তালিকার প্রতিটা কাজের একজন মালিক আর একটা শেষ তারিখ থাকে। না হলে কাজগুলো রিপোর্টের পাতাতেই পড়ে থাকে। শনিবারের postmortem থেকে এই কাজগুলো এলো:
| কাজ | কেন | মালিক |
|---|---|---|
| Checkout এর SLO এর উপর burn rate alert বানানো | সমস্যা ৪ মিনিটে ধরা পড়বে, ৩৯ মিনিটে নয় | মাহিন |
| CPU এর সব page বন্ধ করে dashboard এ সরানো | মিথ্যা alert এর ভিড় কমবে | নাদিয়া আপা |
| Payment gateway এর timeout বদলালে test বাধ্যতামূলক করা | একই ভুল আর production এ যাবে না | রাতুল |
| Deploy এর পর ১০ মিনিট checkout এর সফলতা দেখা, নামলে নিজে থেকে rollback | খারাপ deploy নিজেই ফিরে যাবে | রাতুল |
খেয়াল করুন, শেষ দুটো কাজের মালিক রাতুল নিজেই। Blameless postmortem এ যে ভুল করেছে, সে প্রায়ই সমাধানের সবচেয়ে ভালো মানুষ হয়, কারণ সে ঘটনাটা সবচেয়ে ভালো জানে।
ঈদের সপ্তাহটা শেষ হলো। Traffic স্বাভাবিকের পাঁচ গুণ হয়েছিলো, অথচ মাহিনের phone পুরো সপ্তাহে বেজেছে মাত্র দুইবার। দুইবারই সত্যিকারের সমস্যা ছিলো, আর দুইবারই ১৫ মিনিটের মধ্যে মিটে গেছে।
Monitoring এর লক্ষ্য machine কে পাহারা দেওয়া নয়, user এর অভিজ্ঞতাকে পাহারা দেওয়া। SLI দিয়ে সেই অভিজ্ঞতা মাপুন, SLO দিয়ে লক্ষ্য ঠিক করুন, আর error budget দিয়ে ঠিক করুন কতটা ঝুঁকি নেওয়া যায়। Phone বাজান শুধু তখন, যখন user কষ্ট পাচ্ছে আর কাউকে এখনই কিছু করতে হবে। আর প্রতিটা incident কে শেখার সুযোগ হিসেবে দেখুন, দোষ দেওয়ার সুযোগ হিসেবে নয়।
১০ মগজে প্রেশার দিন
আগে নিজে ভাবুন। তারপর উত্তর খুলে দেখুন: বেশিরভাগ মানুষ কীভাবে ভাবে, সেই চিন্তায় কী বাদ পড়ে, আর আসল কথাটা কোথায়।
উত্তর দেখুন আগে নিজে ভাবুন
সবাই যেভাবে ভাবে
“অবশ্যই। CPU ৯৫% মানে server প্রায় ভরে গেছে। এখনই কেউ না দেখলে একটু পরেই database crash করবে।”
ভয়টা যুক্তিসঙ্গত, কিন্তু এখানে একটা প্রশ্ন বাদ পড়েছে।
যে জায়গাটা যোগ করা দরকার
প্রশ্নটা হলো, user এর কি এখন ক্ষতি হচ্ছে? CPU ৯৫% থাকলেও query গুলো সময়মতো শেষ হতে পারে। তাহলে কাউকে জাগানোর কোনো কারণ নেই। আর CPU সত্যিই সমস্যা করলে সেটা latency বা error হয়ে user এর কাছে পৌঁছাবে। তখন symptom-based alert নিজেই বাজবে।
তবে একটা ব্যতিক্রম আছে। কিছু cause ভবিষ্যতের নিশ্চিত বিপদের খবর দেয়। যেমন, disk যে হারে ভরছে তাতে ৪ ঘণ্টায় পুরো ভরে যাবে। ভরে গেলে database write নেওয়া বন্ধ করে দেবে। এমন ক্ষেত্রে cause এর উপর page দেওয়া ঠিক, কারণ ক্ষতিটা নিশ্চিত আর কাছাকাছি।
Page দিন user এর কষ্টের উপর, অথবা এমন cause এর উপর যেটা কয়েক ঘণ্টার মধ্যে নিশ্চিতভাবে user এর কষ্ট হয়ে দাঁড়াবে। বাকি সব cause dashboard বা ticket এ রাখুন।
উত্তর দেখুন আগে নিজে ভাবুন
সবাই যেভাবে ভাবে
“১০০% সম্ভব না, কারণ hardware নষ্ট হয় আর network কাটে। তাই ৯৯.৯% এর মতো একটা সংখ্যা রাখা উচিত।”
কথাটা ঠিক, কিন্তু এতে মনে হয় ৯৯.৯% শুধু একটা বাধ্য হয়ে মেনে নেওয়া সংখ্যা।
যে জায়গাটা যোগ করা দরকার
১০০% সম্ভব হলেও সেটা ভালো লক্ষ্য হতো না। প্রথমত, প্রতিটা বাড়তি “৯” এর খরচ আগেরটার চেয়ে অনেক বেশি, অথচ user এর মোবাইল network এর কারণে সে পার্থক্যটা টেরই পায় না। দ্বিতীয়ত, ১০০% লক্ষ্য মানে error budget শূন্য। তাহলে কোনো deploy এর ঝুঁকিও নেওয়া যায় না, আর নতুন feature আসা বন্ধ হয়ে যায়।
সঠিক উত্তর হলো, user এর জন্য যতটা দরকার ঠিক ততটা reliability বেছে নিন। বাকিটুকু error budget, আর সেটা feature ship করার জন্য খরচ করুন।
SLO শুধু একটা লক্ষ্য নয়, এটা একটা সিদ্ধান্ত: এর চেয়ে বেশি reliability কেনার জন্য আমরা টাকা আর সময় খরচ করবো না। সেই বাঁচানো সময় যায় নতুন feature এ।
উত্তর দেখুন আগে নিজে ভাবুন
সবাই যেভাবে ভাবে
“হ্যাঁ। Threshold উঁচু করলে phone কম বাজবে। চাইলে ‘১০ মিনিট ধরে ৯৫% থাকলে’ শর্তটাও যোগ করা যায়।”
এতে phone কম বাজবে ঠিকই, কিন্তু আসল সমস্যাটা থেকে যাবে।
যে জায়গাটা যোগ করা দরকার
সমস্যাটা সংখ্যায় নয়, signal এ। CPU user এর কষ্ট মাপে না, তাই threshold যেখানেই রাখুন, alert হয় অকারণে বাজবে, নয়তো আসল বিপদে চুপ থাকবে। শনিবার সকালে CPU ছিলো ৩৫%। কোনো threshold সেদিন কাজে আসতো না।
সমাধান হলো signal বদলানো: SLO এর burn rate এর উপর alert দেওয়া। সাথে একটা অভ্যাস যোগ করুন। প্রতি সপ্তাহে আগের সপ্তাহের সব page একবার দেখুন। যে page এর পর কেউ কিছু করেনি, সেই alert মুছে ফেলুন বা ticket এ নামিয়ে দিন।
Noisy alert এর সমাধান threshold বাড়ানো নয়, ঠিক signal বেছে নেওয়া। প্রতিটা page এর পর একটা প্রশ্ন করুন: এর পর কি কাউকে সত্যিই কিছু করতে হয়েছিলো?
১১ যে টার্মগুলো শিখলাম
| টার্ম | মানে |
|---|---|
| Monitoring | System এর সংখ্যাগুলো সারাক্ষণ মাপা আর graph এ দেখা। |
| Alert | কোনো সংখ্যা বিপদের সীমা পার হলে system নিজেই মানুষকে খবর দেয়। |
| Page | এমন alert, যেটা রাতেও phone বাজিয়ে on-call মানুষকে জাগায়। |
| Ticket | কাজের তালিকায় যোগ হওয়া একটা কাজ, যেটা পরের কর্মদিবসে দেখা হয়। |
| Alert fatigue | অকারণ alert এর ভিড়ে মানুষ alert উপেক্ষা করতে শেখে, আর আসল alert ও হারিয়ে যায়। |
| SLI (Service Level Indicator) | User এর দিক থেকে service কতটা ভালো চলছে, তার মাপা সংখ্যা। সাধারণত ভালো ঘটনা ÷ মোট ঘটনা। |
| SLO / SLA | Team এর নিজের লক্ষ্য / customer এর সাথে চুক্তি। সেশন ০১ এ প্রথম দেখেছেন। |
| Error budget | SLO এর ভেতরে থেকেও যতটুকু fail করার অনুমতি আছে। ৯৯.৯% SLO তে এটা ০.১%। |
| Error budget policy | Budget শেষ হলে কী হবে, তার আগে থেকে লেখা নিয়ম। যেমন feature freeze। |
| Feature freeze | Budget শেষ হলে নতুন feature ship বন্ধ রেখে শুধু reliability এর কাজ করা। |
| Golden signals | যেকোনো service এর চারটা মূল সংখ্যা: latency, traffic, errors আর saturation। |
| Saturation | সবচেয়ে সীমিত resource টা কতটা ভরে গেছে। |
| Cause-based alert | সমস্যার সম্ভাব্য কারণের উপর alert, যেমন CPU বা memory। |
| Symptom-based alert | User যা টের পায় তার উপর alert, যেমন checkout fail বা ধীর search। |
| Threshold | একটা নির্দিষ্ট সীমা, যেটা পার হলে alert বাজে। |
| Burn rate | Error budget কত দ্রুত খরচ হচ্ছে। Burn rate ১ মানে budget ঠিক মাস শেষে ফুরাবে। |
| Dashboard | Graph এর সাজানো পাতা। ভালো dashboard একটা প্রশ্নের উত্তর দেয়। |
| On-call | পালা করে system এর দায়িত্ব নেওয়া। যার পালা, page তার phone এ আসে। |
| Escalation | Primary সাড়া না দিলে page নিজে থেকে পরের মানুষের কাছে যাওয়া। |
| Runbook | প্রতিটা alert এর জন্য আগে থেকে লেখা নির্দেশিকা: মানে কী, কী দেখবেন, কী করবেন। |
| Mitigation | মূল কারণ ঠিক না করেই user এর ক্ষতি থামানো, যেমন rollback। |
| Postmortem | Incident এর পর লেখা রিপোর্ট: কী হয়েছিলো, কেন, আর ভবিষ্যতে কী বদলাবে। |
| Blameless postmortem | এমন postmortem, যেখানে মানুষকে দোষ না দিয়ে system এর ফাঁক খোঁজা হয়। |
১২ শর্ট সামারি
- Monitoring এর লক্ষ্য user এর অভিজ্ঞতা পাহারা দেওয়া। SLI দিয়ে সেই অভিজ্ঞতা মাপা হয়, SLO দিয়ে লক্ষ্য ঠিক হয়, আর ১০০% থেকে SLO পর্যন্ত ফাঁকটুকু হলো error budget, যেটা ঠিক করে দেয় কখন feature ship হবে আর কখন reliability এর কাজ।
- Page দিতে হয় symptom এর উপর, cause এর উপর নয়। CPU এর মতো cause এর alert অকারণে বাজে আর আসল বিপদে চুপ থাকে। এতে alert fatigue তৈরি হয়। SLO এর burn rate এর উপর alert দিলে বড় ক্ষতি কয়েক মিনিটে ধরা পড়ে, আর ছোট ঝাঁকুনিতে কেউ জাগে না।
- চারটা golden signal (latency, traffic, errors, saturation) আর এক প্রশ্নের dashboard সমস্যার জায়গা দ্রুত খুঁজে দেয়। Runbook আগে থেকে লিখে রাখা থাকে, তাই রাত তিনটায় ঘুম ভাঙা মাথাতেও ঠিক কাজটা করা যায়। On-call এর প্রথম কাজ হলো কারণ খোঁজার আগে ক্ষতি থামানো।
- Incident এর পর blameless postmortem এ মানুষ নয়, system এর ফাঁক খোঁজা হয়। প্রতিটা ফাঁকের জন্য একটা কাজ, একজন মালিক আর একটা তারিখ ঠিক হয়।
১৩ মনে রাখুন
- Machine নয়, user কে মাপুন। SLI হবে এমন সংখ্যা, যেটা একজন user নিজের চোখে টের পায়।
- ১০০% কখনো লক্ষ্য নয়। বাকি অংশটুকু error budget, আর সেটা খরচ করার জন্যই রাখা।
- Page শুধু symptom এর উপর। Cause এর সংখ্যা dashboard এ রাখুন, কারণ খোঁজার কাজে লাগবে।
- প্রতিটা page এর পরে কিছু করার থাকতে হবে। যে alert এর পর কেউ কিছু করে না, সেটা মুছে ফেলুন।
- Threshold এর চেয়ে burn rate ভালো। এটা জিজ্ঞেস করে, user এর ক্ষতি কত দ্রুত হচ্ছে।
- আগে ক্ষতি থামান, পরে কারণ খুঁজুন। Rollback প্রায় সবসময় রাত তিনটার debugging এর চেয়ে নিরাপদ।
- Postmortem এ মানুষকে নয়, system কে প্রশ্ন করুন। দোষ দিলে মানুষ ভুল লুকায়, আর ফাঁকগুলো থেকে যায়।