সেশন ২০

Monitoring ও Alerting - রাতে phone বাজবে শুধু আসল বিপদে

এই সেশনের লক্ষ্য: System ভালো আছে কিনা, সেটা user এর চোখ দিয়ে মাপতে শেখা। SLI, SLO আর error budget দিয়ে reliability কে একটা সংখ্যায় আনা, golden signals আর symptom-based alert দিয়ে আসল সমস্যা ধরা, আর on-call, runbook ও blameless postmortem দিয়ে সমস্যা এলে শান্তভাবে সামলানো।

০০ যে প্রশ্নগুলোর উত্তর খুঁজবো

সেশন ১৯ এ আমরা 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 ও কোনো সমস্যায় পড়েনি।

ALERTS USERS 37 বার phone বাজলো · CPU > 80% 11PM 12AM 1AM 2AM 3AM 4AM 5AM 6AM 7AM checkout সফল: 99.97% (সারা রাত একই রকম) একজন user ও কোনো সমস্যায় পড়েনি
উপরে মাহিনের রাত: ১১টা ৪০ থেকে ভোর ৫টা পর্যন্ত ৩৭ বার phone বেজেছে, প্রতিবার CPU ৮০% ছাড়ানোর জন্য। নিচে একই সময়ে user দের অভিজ্ঞতা: checkout এর সফলতার হার একটুও নড়েনি। Alert গুলো machine এর কথা বলছিলো, 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। এর তিনটা খারাপ ফল আছে:

  1. আসল alert হারিয়ে যায়: ৩৭টা মিথ্যা alert এর ভিড়ে সত্যিকারের একটা alert আলাদা করে চোখে পড়ে না।
  2. Engineer ক্লান্ত হয়: ঘুম ভাঙা রাতের পর পরদিন কাজে ভুল বেশি হয়। এভাবে কয়েক মাস চললে ভালো engineer চাকরি ছেড়ে চলে যায়।
  3. 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 বেছে নিলো:

খেয়াল করুন, দুটো SLI এর কোনোটাই CPU বা memory নিয়ে নয়। দুটোই এমন জিনিস মাপে, যেটা একজন যাত্রী নিজের চোখে টের পায়: টিকিট কাটা গেলো কিনা, আর বাসের তালিকা তাড়াতাড়ি এলো কিনা।

তিনটা শব্দকে একটা মাপকাঠিতে বসালে সম্পর্কটা পরিষ্কার হয়:

Checkout সফল হওয়ার হার গত 30 দিনে, সব checkout এর মধ্যে SLI: 99.93% আসলে যা মাপা হলো 99.0% 99.5% 99.9% 100% SLA: 99.5% customer এর সাথে চুক্তি SLO: 99.9% team এর নিজের লক্ষ্য SLA সবচেয়ে নিচে রাখা হয়, যাতে SLO মিস হলেও চুক্তি না ভাঙে
একই মাপকাঠিতে তিনটা সংখ্যা। SLI হলো যা আসলে মাপা হলো (৯৯.৯৩%)। SLO হলো team এর লক্ষ্য (৯৯.৯%)। SLA হলো customer কে দেওয়া চুক্তি (৯৯.৫%), যেটা ভাঙলে টাকা ফেরত দিতে হয়। SLI যতক্ষণ SLO এর উপরে, ততক্ষণ সব ঠিক আছে।
কীকে দেখেনা মিললে কী হয়
SLIআসলে যা মাপা হলো (৯৯.৯৩%)Engineering teamকিছু হয় না, এটা শুধু একটা সংখ্যা
SLOTeam এর লক্ষ্য (৯৯.৯%)Engineering আর product teamTeam নিজেই কাজের অগ্রাধিকার বদলায়
SLACustomer এর সাথে চুক্তি (৯৯.৫%)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, এই প্রশ্নের উত্তর দেয়:

এই মাসের error budget: 10,000 fail 7,800 খরচ · 2,200 বাকি · মাসের 12 দিন বাকি হ্যাঁ, বাকি আছে না, শেষ নতুন feature ship চলবে ঝুঁকির deploy ও করা যায় Feature freeze শুধু reliability এর কাজ
Error budget একটা মাসিক হিসাবের খাতার মতো। শনিবারের outage এর পর টিকিট অ্যাপের budget এর ৭৮% খরচ হয়ে গেছে। Budget বাকি থাকলে team নতুন feature ship করতে থাকে। Budget শেষ হলে নতুন feature বন্ধ থাকে, আর সবাই reliability এর কাজ করে।

নিয়মটা কারো মতামতের উপর নির্ভর করে না, একটা সংখ্যার উপর নির্ভর করে। Budget বাকি থাকলে product team যত খুশি feature ship করতে পারে। Budget শেষ হলে নতুন feature বন্ধ থাকে (একে বলে feature freeze)। তখন পুরো team reliability এর কাজ করে, যতক্ষণ না SLI আবার নিরাপদ জায়গায় ফেরে।

Error budget এর আসল মানে

Error budget fail করার অজুহাত নয়। এটা একটা মাপা ঝুঁকির সীমা। Budget বাকি থাকা মানে আপনি দরকারের চেয়ে বেশি সাবধান, তাই আরেকটু দ্রুত চলা যায়। Budget শেষ মানে আপনি বেশি দ্রুত চলেছেন, এখন থামার সময়।

০৪ যেকোনো service এর কোন চারটা সংখ্যা সবসময় দেখতে হয়?

SLI বলে দেয় user খুশি কিনা। কিন্তু একটা service এর স্বাস্থ্য বুঝতে আরো কয়েকটা সংখ্যা লাগে। Google এর engineer রা বছরের পর বছর অভিজ্ঞতা থেকে চারটা সংখ্যা বেছে নিয়েছেন, যেগুলো প্রায় যেকোনো service এর জন্য কাজ করে। এদের বলে golden signals:

Checkout service এক নজরে চারটা প্রশ্ন Latency কত সময় লাগছে? p99: 280ms fail এর latency আলাদা Traffic কত request আসছে? 800 req/s ঈদের আগে 4,000 Errors কতগুলো fail করছে? 0.05% 5xx আর ভুল উত্তর Saturation কতটা ভরে গেছে? DB pool 72/100 যেটা আগে ফুরাবে
যেকোনো service এর জন্য চারটা প্রশ্ন: কত দ্রুত উত্তর দিচ্ছে, কত request আসছে, কতগুলো fail করছে, আর কোন resource ফুরিয়ে আসছে। এই চারটা সংখ্যা ঠিক থাকলে service টা প্রায় নিশ্চিতভাবেই ভালো আছে।
  1. Latency: একটা request এর উত্তর আসতে কত সময় লাগে। এখানে একটা ফাঁদ আছে। Fail হওয়া request প্রায়ই খুব দ্রুত ফেরত আসে, কারণ server কাজটা না করেই error দিয়ে দেয়। তাই সফল আর fail হওয়া request এর latency আলাদা করে মাপতে হয়। না হলে error বাড়লে latency এর graph উল্টো ভালো দেখায়।
  2. Traffic: Service এর উপর কতটা চাপ আসছে, যেমন প্রতি সেকেন্ডে কতগুলো request। টিকিট অ্যাপে সাধারণ দিনে এটা 800 req/s, কিন্তু ঈদের আগের সপ্তাহে 4,000 req/s পর্যন্ত ওঠে।
  3. Errors: কতগুলো request fail করছে। শুধু 500 এর মতো error code নয়, ভুল উত্তরও এর মধ্যে পড়ে। যেমন, payment সফল হলো অথচ টিকিট তৈরি হলো না।
  4. 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 করলো।

CAUSE-BASED SYMPTOM-BASED CPU 35% · Memory 50% সব সংখ্যা threshold (80%) এর নিচে fail হওয়া request এ CPU কম খরচ হয় কোনো alert বাজেনি team জানলো 39 মিনিট পরে Checkout সফল: 80% SLO 99.9% এর অনেক নিচে user যা দেখে, ঠিক সেটাই মাপা 4 মিনিটে page মাহিন 09:09 এ জানতো
একই সকাল, দুই রকম alert। বাম পাশে machine এর সংখ্যা: সব স্বাভাবিক দেখাচ্ছিলো, কারণ fail হওয়া request হালকা, তাতে CPU কম লাগে। ডান পাশে user এর অভিজ্ঞতা: প্রতি পাঁচটা checkout এর একটা fail করছিলো। Alert থাকা উচিত ডান পাশের সংখ্যার উপর।

এখানে দুই রকম alert এর পার্থক্য পরিষ্কার হয়:

তাহলে CPU এর মতো সংখ্যাগুলো কি ফেলে দেবো? না। এগুলো dashboard এ থাকে, সমস্যার কারণ খুঁজতে কাজে লাগে। শুধু এগুলোর জন্য কারো ঘুম ভাঙানো হয় না। কোন signal এর জায়গা কোথায়, সেটা দুটো প্রশ্ন দিয়ে ঠিক করা যায়:

না User কি এখন কষ্ট পাচ্ছে? বা কয়েক ঘণ্টার মধ্যে পাবে? শুধু dashboard যেমন: CPU 85% হ্যাঁ না এখনই কারো কিছু করার আছে? অপেক্ষা করলে কি ক্ষতি বাড়বে? Ticket যেমন: disk 7 দিনে ভরবে হ্যাঁ PAGE: রাত 3টায়ও phone বাজবে যেমন: checkout সফল 80%
প্রতিটা signal কে দুটো প্রশ্নের ভেতর দিয়ে পাঠান। User এর ক্ষতি না হলে সেটা শুধু dashboard এ থাকে। ক্ষতি হবে, কিন্তু কাল সকালে দেখলেও চলে, তাহলে ticket। ক্ষতি এখনই চলছে আর কাউকে এখনই কিছু করতে হবে, শুধু তখনই phone বাজে।

এখানে একটা নতুন শব্দ এলো: 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 পাওয়া যায়।

বাকি error budget 100% 50% 0% দিন 0 দিন 18 দিন 30 দিন 18, শনিবার সকাল 9টা 50 মিনিটে budget এর 48% শেষ তখন burn rate ছিলো 200 burn rate 1: ঠিক 30 দিনে শেষ টিকিট অ্যাপের আসল মাস মাসের দিন
Burn rate ১ মানে budget ঠিক মাস শেষে ফুরাবে (ড্যাশ দেওয়া রেখা)। টিকিট অ্যাপের প্রথম ১৮ দিন রেখাটা ধীরে নেমেছে। শনিবার সকালে burn rate ২০০ তে উঠে গেলো, আর ৫০ মিনিটে budget এর প্রায় অর্ধেক শেষ হলো। মাস শেষ হলো মাত্র ২% budget হাতে নিয়ে।

বাস্তবে team গুলো সাধারণত দুই-তিনটা burn rate নিয়ম একসাথে রাখে। একটা দ্রুত বিপদ ধরে, আরেকটা ধীরে চলা ক্ষতি ধরে:

নিয়মকতটা সময় ধরে দেখা হয়Burn rate এর সীমাতখন budget এর কতটা খরচ হয়কী হয়
দ্রুত ক্ষতিশেষ ১ ঘণ্টা১৪.৪ এর বেশি১ ঘণ্টায় ২%Page
মাঝারি ক্ষতিশেষ ৬ ঘণ্টা৬ এর বেশি৬ ঘণ্টায় ৫%Page
ধীর ক্ষতিশেষ ৩ দিন১ এর বেশি৩ দিনে ১০%Ticket

শনিবার সকালে প্রথম নিয়মটা থাকলে কী হতো? ২০% error চললে শেষ এক ঘণ্টার গড় ১.৪৪% ছাড়াতে মাত্র সাড়ে চার মিনিট লাগে। অর্থাৎ ৯টা ৯ মিনিটেই মাহিনের phone বাজতো, Facebook এর অভিযোগের ৩১ মিনিট আগে। আর মাহিনের সেই রাতের CPU ঝাঁকুনি গুলো? তাতে checkout এর একটাও fail হয়নি, তাই burn rate ০ ছিলো। কোনো phone বাজতো না।

Burn rate কেন ভালো

Burn rate alert শুধু জিজ্ঞেস করে, user এর ক্ষতি কত দ্রুত হচ্ছে। বড় ক্ষতি হলে কয়েক মিনিটে বাজে। ছোট ঝাঁকুনিতে বাজে না। আর চুপচাপ চলতে থাকা ধীর ক্ষতিও শেষ পর্যন্ত একটা ticket হয়ে ধরা পড়ে।

০৭ একটা ভালো dashboard দেখতে কেমন?

শনিবার ৯টা ৪৪ মিনিটে মাহিন যখন laptop খুললো, তখন তার সামনে ছিলো একটা dashboard এ ৬০টা graph। প্রতিটা server এর CPU, memory, disk, network। কোন graph টা দেখবে, সেটা বুঝতেই তার আট মিনিট চলে গেলো।

Dashboard হলো graph এর একটা সাজানো পাতা, যেটা একনজরে system এর অবস্থা দেখায়। ভালো dashboard এর নিয়ম একটাই: প্রতিটা dashboard একটা প্রশ্নের উত্তর দেবে। প্রশ্নটা dashboard এর নামেই লেখা থাকবে।

OVERVIEW SERVICE DETAIL User রা কি টিকিট কিনতে পারছে? SLO · error budget · golden signals Search বাস কত দ্রুত খুঁজে পায়? Checkout কতগুলো booking সফল? Payment gateway কী বলছে? উপরের level এ লাল দেখলে তবেই নিচে নামুন Payment: কেন এমন হচ্ছে? gateway latency · timeout · CPU
প্রতিটা dashboard একটা প্রশ্নের উত্তর দেয়। প্রথম dashboard বলে user রা ঠিক আছে কিনা। সেখানে সমস্যা দেখলে service এর dashboard এ নামুন, তারপর detail এ। শনিবার সকালে এই পথেই payment এর gateway timeout খুঁজে পাওয়া যেতো।

নতুন 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 কে মানুষের পক্ষে সহনীয় রাখে:

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 খুললো, ধাপে ধাপে এগোলো:

1 Page আসে SearchLatencyFastBurn 21:14 2 Acknowledge করে "আমি দেখছি", 5 মিনিটের মধ্যে 21:16 +2 মিনিট 3 Runbook আর dashboard খোলে DB pool 100/100 · 4,000 req/s 21:18 +4 মিনিট 4 Mitigate: server 6 থেকে 12 আগে user কে বাঁচানো, কারণ পরে 21:22 +8 মিনিট 5 #incidents এ update দেয় support জানে user কে কী বলতে হবে 21:24 +10 মিনিট 6 Resolve p99 আবার 280ms · কাল postmortem 21:28 +14 মিনিট
ঈদের আগের রাতে মাহিনের দ্বিতীয় on-call week। Page আসার ১৪ মিনিটের মধ্যে search আবার স্বাভাবিক। লক্ষ্য করুন, চতুর্থ ধাপে মাহিন কারণ খোঁজেনি, আগে user দের কষ্ট থামিয়েছে। কেন DB pool ভরে গেলো, সেটা পরদিন postmortem এ খোঁজা হয়েছে।

চতুর্থ ধাপটা লক্ষ্য করুন। মাহিন DB pool কেন ভরে গেলো, সেটা খুঁজতে বসেনি। আগে search এর server ৬টা থেকে ১২টা করে user দের কষ্ট থামিয়েছে। এই কাজটার নাম mitigation: সমস্যার মূল কারণ ঠিক না করেই ক্ষতি থামানো। Rollback (আগের ভালো version এ ফিরে যাওয়া), server বাড়ানো, একটা feature বন্ধ করা, এগুলো সবই mitigation। মূল কারণ খোঁজা হয় পরে, দিনের আলোয়।

On-call এর প্রথম নিয়ম

আগে user এর ক্ষতি থামান, তারপর কারণ খুঁজুন। User কষ্ট পাচ্ছে এমন অবস্থায় কারণ খোঁজার চেয়ে আগের অবস্থায় ফিরে যাওয়া প্রায় সবসময় ভালো। মূল কারণ খোঁজার জন্য পরের দিন পুরোটাই পড়ে আছে।

০৯ সমস্যা মিটে গেলে কী করবো?

শনিবারের outage এর পরের সোমবার। মিটিং রুমে রাতুল চুপচাপ বসে আছে। সে ধরে নিয়েছে আজ তাকে সবার সামনে বকা শুনতে হবে। কিন্তু নাদিয়া আপা মিটিং শুরু করলেন একটা কথা দিয়ে: “আজ আমরা খুঁজবো না কে ভুল করেছে। আমরা খুঁজবো, আমাদের system কেন একটা ভুলকে ৫০ মিনিট ধরে user এর কাছে পৌঁছাতে দিলো।”

এই মিটিং আর তার লিখিত রিপোর্টের নাম postmortem। আর যে postmortem এ কোনো মানুষকে দোষ দেওয়া হয় না, তাকে বলে blameless postmortem।

দোষ না দেওয়া কেন জরুরি

রাতুলকে দোষ দিলে কী হতো? পরের বার কেউ ভুল করলে সেটা লুকানোর চেষ্টা করতো। কেউ নিজে থেকে বলতো না, “আমার deploy এর পর থেকেই সমস্যা শুরু।” অথচ incident এর সময় ঠিক এই কথাটাই সবচেয়ে দ্রুত সমাধানে পৌঁছে দেয়।

তাছাড়া প্রশ্নটাও ভুল। ১ সেকেন্ডের timeout লেখা একটা মানুষের ভুল। কিন্তু সেই ভুল কোনো test এ ধরা পড়েনি, কোনো review এ চোখে পড়েনি, আর কোনো alert ও বাজেনি। প্রতিটা ফাঁক system এর, মানুষের নয়। মানুষ বদলালেও এই ফাঁকগুলো থেকে যায়। ফাঁক বন্ধ করলে পরের মানুষটাও একই ভুল করতে পারবে না।

Postmortem এ কী থাকে

একটা postmortem এ সাধারণত পাঁচটা অংশ থাকে: কী হয়েছিলো তার ছোট সারাংশ, user এর উপর প্রভাব (৪,৮০০টা fail হওয়া checkout, budget এর ৪৮%), মিনিট ধরে ধরে timeline, মূল কারণ, আর ভবিষ্যতের জন্য কাজের তালিকা। Timeline লিখতে গিয়েই সবচেয়ে বড় শিক্ষাটা চোখে পড়লো:

09:00 10:00 50 মিনিট: প্রতি 5টা checkout এর 1টা fail 09:02 deploy: timeout 10s থেকে 1s 09:44 support মাহিনকে call করে 09:09 symptom alert থাকলে page এখানে 09:55 সব স্বাভাবিক 09:05 payment fail শুরু 09:40 Facebook এ user দের অভিযোগ 09:52 rollback User রা জানলো 09:05 এ, team জানলো 09:44 এ ঠিক alert থাকলে 35 মিনিট আগেই rollback শুরু করা যেতো
Postmortem এর প্রথম কাজ হলো মিনিট ধরে ধরে timeline লেখা। এই timeline এ সবচেয়ে বড় ফাঁকটা চোখে পড়ে: সমস্যা শুরু ৯টা ৫ মিনিটে, অথচ team জানলো ৯টা ৪৪ মিনিটে। ভুল deploy টা ছোট একটা ঘটনা। আসল শিক্ষা হলো, ৩৯ মিনিট কেউ জানতোই না।

তালিকার প্রতিটা কাজের একজন মালিক আর একটা শেষ তারিখ থাকে। না হলে কাজগুলো রিপোর্টের পাতাতেই পড়ে থাকে। শনিবারের 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 কে শেখার সুযোগ হিসেবে দেখুন, দোষ দেওয়ার সুযোগ হিসেবে নয়।

১০ মগজে প্রেশার দিন

আগে নিজে ভাবুন। তারপর উত্তর খুলে দেখুন: বেশিরভাগ মানুষ কীভাবে ভাবে, সেই চিন্তায় কী বাদ পড়ে, আর আসল কথাটা কোথায়।

প্রশ্ন ১: Database server এর CPU ৯৫% এ উঠলে কি page করা উচিত?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“অবশ্যই। 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 এ রাখুন।

প্রশ্ন ২: Boss বললেন, "আমাদের লক্ষ্য ১০০% uptime।" Interview এ এই কথার উত্তরে কী বলবেন?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“১০০% সম্ভব না, কারণ hardware নষ্ট হয় আর network কাটে। তাই ৯৯.৯% এর মতো একটা সংখ্যা রাখা উচিত।”

কথাটা ঠিক, কিন্তু এতে মনে হয় ৯৯.৯% শুধু একটা বাধ্য হয়ে মেনে নেওয়া সংখ্যা।

যে জায়গাটা যোগ করা দরকার

১০০% সম্ভব হলেও সেটা ভালো লক্ষ্য হতো না। প্রথমত, প্রতিটা বাড়তি “৯” এর খরচ আগেরটার চেয়ে অনেক বেশি, অথচ user এর মোবাইল network এর কারণে সে পার্থক্যটা টেরই পায় না। দ্বিতীয়ত, ১০০% লক্ষ্য মানে error budget শূন্য। তাহলে কোনো deploy এর ঝুঁকিও নেওয়া যায় না, আর নতুন feature আসা বন্ধ হয়ে যায়।

সঠিক উত্তর হলো, user এর জন্য যতটা দরকার ঠিক ততটা reliability বেছে নিন। বাকিটুকু error budget, আর সেটা feature ship করার জন্য খরচ করুন।

মাথায় গেঁথে নিন

SLO শুধু একটা লক্ষ্য নয়, এটা একটা সিদ্ধান্ত: এর চেয়ে বেশি reliability কেনার জন্য আমরা টাকা আর সময় খরচ করবো না। সেই বাঁচানো সময় যায় নতুন feature এ।

প্রশ্ন ৩: Alert খুব বেশি বাজছে। CPU এর threshold ৮০% থেকে ৯৫% করে দিলেই কি সমস্যা মিটবে?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“হ্যাঁ। Threshold উঁচু করলে phone কম বাজবে। চাইলে ‘১০ মিনিট ধরে ৯৫% থাকলে’ শর্তটাও যোগ করা যায়।”

এতে phone কম বাজবে ঠিকই, কিন্তু আসল সমস্যাটা থেকে যাবে।

যে জায়গাটা যোগ করা দরকার

সমস্যাটা সংখ্যায় নয়, signal এ। CPU user এর কষ্ট মাপে না, তাই threshold যেখানেই রাখুন, alert হয় অকারণে বাজবে, নয়তো আসল বিপদে চুপ থাকবে। শনিবার সকালে CPU ছিলো ৩৫%। কোনো threshold সেদিন কাজে আসতো না।

সমাধান হলো signal বদলানো: SLO এর burn rate এর উপর alert দেওয়া। সাথে একটা অভ্যাস যোগ করুন। প্রতি সপ্তাহে আগের সপ্তাহের সব page একবার দেখুন। যে page এর পর কেউ কিছু করেনি, সেই alert মুছে ফেলুন বা ticket এ নামিয়ে দিন।

মূল pattern

Noisy alert এর সমাধান threshold বাড়ানো নয়, ঠিক signal বেছে নেওয়া। প্রতিটা page এর পর একটা প্রশ্ন করুন: এর পর কি কাউকে সত্যিই কিছু করতে হয়েছিলো?

১১ যে টার্মগুলো শিখলাম

টার্মমানে
MonitoringSystem এর সংখ্যাগুলো সারাক্ষণ মাপা আর graph এ দেখা।
Alertকোনো সংখ্যা বিপদের সীমা পার হলে system নিজেই মানুষকে খবর দেয়।
Pageএমন alert, যেটা রাতেও phone বাজিয়ে on-call মানুষকে জাগায়।
Ticketকাজের তালিকায় যোগ হওয়া একটা কাজ, যেটা পরের কর্মদিবসে দেখা হয়।
Alert fatigueঅকারণ alert এর ভিড়ে মানুষ alert উপেক্ষা করতে শেখে, আর আসল alert ও হারিয়ে যায়।
SLI (Service Level Indicator)User এর দিক থেকে service কতটা ভালো চলছে, তার মাপা সংখ্যা। সাধারণত ভালো ঘটনা ÷ মোট ঘটনা।
SLO / SLATeam এর নিজের লক্ষ্য / customer এর সাথে চুক্তি। সেশন ০১ এ প্রথম দেখেছেন।
Error budgetSLO এর ভেতরে থেকেও যতটুকু fail করার অনুমতি আছে। ৯৯.৯% SLO তে এটা ০.১%।
Error budget policyBudget শেষ হলে কী হবে, তার আগে থেকে লেখা নিয়ম। যেমন feature freeze।
Feature freezeBudget শেষ হলে নতুন feature ship বন্ধ রেখে শুধু reliability এর কাজ করা।
Golden signalsযেকোনো service এর চারটা মূল সংখ্যা: latency, traffic, errors আর saturation।
Saturationসবচেয়ে সীমিত resource টা কতটা ভরে গেছে।
Cause-based alertসমস্যার সম্ভাব্য কারণের উপর alert, যেমন CPU বা memory।
Symptom-based alertUser যা টের পায় তার উপর alert, যেমন checkout fail বা ধীর search।
Thresholdএকটা নির্দিষ্ট সীমা, যেটা পার হলে alert বাজে।
Burn rateError budget কত দ্রুত খরচ হচ্ছে। Burn rate ১ মানে budget ঠিক মাস শেষে ফুরাবে।
DashboardGraph এর সাজানো পাতা। ভালো dashboard একটা প্রশ্নের উত্তর দেয়।
On-callপালা করে system এর দায়িত্ব নেওয়া। যার পালা, page তার phone এ আসে।
EscalationPrimary সাড়া না দিলে page নিজে থেকে পরের মানুষের কাছে যাওয়া।
Runbookপ্রতিটা alert এর জন্য আগে থেকে লেখা নির্দেশিকা: মানে কী, কী দেখবেন, কী করবেন।
Mitigationমূল কারণ ঠিক না করেই user এর ক্ষতি থামানো, যেমন rollback।
PostmortemIncident এর পর লেখা রিপোর্ট: কী হয়েছিলো, কেন, আর ভবিষ্যতে কী বদলাবে।
Blameless postmortemএমন postmortem, যেখানে মানুষকে দোষ না দিয়ে system এর ফাঁক খোঁজা হয়।

১২ শর্ট সামারি

  1. Monitoring এর লক্ষ্য user এর অভিজ্ঞতা পাহারা দেওয়া। SLI দিয়ে সেই অভিজ্ঞতা মাপা হয়, SLO দিয়ে লক্ষ্য ঠিক হয়, আর ১০০% থেকে SLO পর্যন্ত ফাঁকটুকু হলো error budget, যেটা ঠিক করে দেয় কখন feature ship হবে আর কখন reliability এর কাজ।
  2. Page দিতে হয় symptom এর উপর, cause এর উপর নয়। CPU এর মতো cause এর alert অকারণে বাজে আর আসল বিপদে চুপ থাকে। এতে alert fatigue তৈরি হয়। SLO এর burn rate এর উপর alert দিলে বড় ক্ষতি কয়েক মিনিটে ধরা পড়ে, আর ছোট ঝাঁকুনিতে কেউ জাগে না।
  3. চারটা golden signal (latency, traffic, errors, saturation) আর এক প্রশ্নের dashboard সমস্যার জায়গা দ্রুত খুঁজে দেয়। Runbook আগে থেকে লিখে রাখা থাকে, তাই রাত তিনটায় ঘুম ভাঙা মাথাতেও ঠিক কাজটা করা যায়। On-call এর প্রথম কাজ হলো কারণ খোঁজার আগে ক্ষতি থামানো।
  4. Incident এর পর blameless postmortem এ মানুষ নয়, system এর ফাঁক খোঁজা হয়। প্রতিটা ফাঁকের জন্য একটা কাজ, একজন মালিক আর একটা তারিখ ঠিক হয়।

১৩ মনে রাখুন