এই পর্বে যা শিখবেন
- MTTF, MTBF, MTTR আর MTTDL — সংজ্ঞা, সূত্রের যুক্তি আর পূর্ণ সংখ্যাসহ উদাহরণ; independence অনুমানের সীমা
- Striping, mirroring আর XOR parity কীভাবে কাজ করে — হাতে বিট মিলিয়ে হারানো ব্লক ফেরত আনা
- RAID 0, 1, 2, 3, 4, 5, 6, 10 আর 01 — ধারণক্ষমতা, কয়টি ব্যর্থতা সয়, পড়া-লেখার গতি আর small-write penalty
- Rebuild, hot spare, URE-এর ঝুঁকি, write hole, hardware বনাম software RAID (Linux-এর mdadm), আর ZFS-এর RAID-Z
- কেন RAID backup নয় — ৩-২-১ নিয়ম, snapshot, ransomware-প্রতিরোধী backup, replication, erasure coding আর SSD-র বিশেষ দিক
১ · ডিস্ক নষ্ট হয় — MTTF আর সম্ভাবনার হিসাব
পর্ব ৪০-এ দেখেছেন, একটি hard disk ঘূর্ণায়মান প্লেটার, চলমান হেড আর মোটরের যন্ত্র; আর একটি SSD flash চিপ আর একটি ছোট কম্পিউটার (controller), যার নিজের firmware আছে। দুই ধরনের যন্ত্রই একদিন নষ্ট হয়। প্রশ্ন “নষ্ট হবে কি না” নয়, “কখন” — আর তখন ডেটার কী হবে।
এই পর্বের মূল প্রশ্ন: অনেকগুলো অনির্ভরযোগ্য ডিস্ক দিয়ে কীভাবে একটি নির্ভরযোগ্য স্টোরেজ বানানো যায়?
MTTF, MTBF আর MTTR
- MTTF (mean time to failure): একটি যন্ত্র চালু হওয়ার পর নষ্ট হওয়া পর্যন্ত গড় সময়। যে জিনিস মেরামত হয় না, বদলানো হয় (যেমন একটি ডিস্ক), তার জন্য এটিই সঠিক মাপ।
- MTTR (mean time to repair): নষ্ট হওয়ার পর আবার পুরো সুরক্ষিত অবস্থায় ফিরতে গড় সময় — RAID-এ নতুন ডিস্ক বসানো আর তাতে ডেটা ভরার (rebuild) সময়।
- MTBF (mean time between failures): মেরামতযোগ্য সিস্টেমে পরপর দুই ব্যর্থতার মাঝে গড় সময়, মোটামুটি MTBF = MTTF + MTTR. ডিস্ক-নির্মাতারা প্রায়ই “MTBF” লেখেন, আসলে বোঝান MTTF.
- AFR (annualized failure rate): বছরে কত শতাংশ ডিস্ক নষ্ট হয়। ছোট হারে AFR ≈ বছরের ঘণ্টা ÷ MTTF.
MTTF মানে “এতদিন চলবে” নয়। MTTF ১,০০,০০০ ঘণ্টা মানে একটি ডিস্ক ১১ বছর চলবে — এমন নয়। মানে হলো, অনেক ডিস্কের একটি বড় দলে গড়ে প্রতি ১,০০,০০০ ডিস্ক-ঘণ্টায় একটি ব্যর্থতা ঘটে। এই পর্বের হিসাবে ১,০০,০০০ ঘণ্টা ধরলে একটি ডিস্কের এক বছরে নষ্ট হওয়ার সম্ভাবনা প্রায় ৮.৪% (হিসাব: ১ − e−৮৭৬০/১০০০০০)। নির্মাতারা এখন enterprise ডিস্কের জন্য অনেক বড় MTTF লেখেন (১০ লাখ ঘণ্টার বেশি, অর্থাৎ বছরে ১%-এর কম); মাঠপর্যায়ের হার প্রায়ই বেশি — নিচে দেখুন।
অনেক ডিস্ক = আগে প্রথম ব্যর্থতা
ধরুন প্রতিটি ডিস্ক অন্যদের থেকে স্বাধীনভাবে নষ্ট হয়, আর প্রতি ঘণ্টায় নষ্ট হওয়ার হার স্থির λ = ১/MTTF (একে exponential মডেল বলে; এতে ডিস্কের “বয়স” হিসাবে আসে না)। N টি ডিস্কের যেকোনো একটি নষ্ট হওয়ার হার তাহলে N × λ, আর প্রথম ব্যর্থতা পর্যন্ত গড় সময়:
MTTFN ডিস্কের অ্যারে ≈ MTTFএকটি ডিস্ক ÷ N — redundancy না থাকলে এটিই ডেটা হারানোর গড় সময়।
MTTF = ১,০০,০০০ ঘণ্টা ধরলে (এই পর্বের calculator-এর ফল): একটি ডিস্ক — ১১.৪ বছর; ১০টি ডিস্ক — ১০,০০০ ঘণ্টা, প্রায় ৪১৬.৭ দিন; ১০০টি ডিস্ক — ১,০০০ ঘণ্টা, প্রায় ৪১.৭ দিন. এক বছরে ১০০টির অন্তত একটি নষ্ট হওয়ার সম্ভাবনা প্রায় ৯৯.৯৮%. অর্থাৎ বড় সিস্টেমে ডিস্ক নষ্ট হওয়া দুর্ঘটনা নয়, রুটিন ঘটনা।
একটি বাসের টায়ার হয়তো বছরে একবার পাংচার হয়; কিন্তু ১০০টি বাসের কোম্পানিতে প্রায় প্রতিদিন কোথাও একটি। তাই প্রতিটি বাসে বাড়তি চাকা থাকে — RAID সেই বাড়তি চাকা, আর rebuild মিস্ত্রির কাজ।
১৯৮৮ সালে UC Berkeley-র David Patterson, Garth Gibson আর Randy Katz SIGMOD সম্মেলনে প্রকাশ করেন “A Case for Redundant Arrays of Inexpensive Disks (RAID)”. তখন বড় কম্পিউটারে ব্যবহার হতো বিশাল, দামি একক ডিস্ক (তাঁরা বলেছিলেন SLED — single large expensive disk). তাঁদের যুক্তি: PC-র জন্য বানানো ছোট, সস্তা ডিস্ক অনেকগুলো একসাথে জুড়লে গতি আর দামে বড় ডিস্ককে হারানো যায় — কিন্তু তখন MTTF ÷ N সমস্যা দেখা দেয়, তাই redundancy যোগ করতে হবে। গবেষণাপত্রে তাঁরা পাঁচটি সংগঠন বর্ণনা করেন — RAID 1 থেকে 5; RAID 0 আর 6 নাম পরে চালু হয়।
বাস্তবের ডিস্ক — মডেলের চেয়ে জটিল
২০০৭ সালের FAST সম্মেলনে দুটি বড় মাঠ-গবেষণা প্রকাশিত হয়। Bianca Schroeder ও Garth Gibson কয়েকটি বড় সিস্টেমের প্রায় এক লাখ ডিস্কের বদলের রেকর্ড দেখে জানান, বছরে বদলের হার সাধারণত ২–৪% আর কিছু সিস্টেমে ১৩% পর্যন্ত — datasheet-এর হারের চেয়ে অনেক বেশি; আর বদল গুচ্ছ বেঁধে আসে। একই সম্মেলনে Google-এর Eduardo Pinheiro ও সহকর্মীরা নিজেদের বিশাল ডিস্ক-বহরে বয়সভেদে AFR প্রায় ২% থেকে ৮%-এর বেশি পর্যন্ত পান। তাই এই পর্বের MTTF শুধু শিক্ষণের সংখ্যা — বাস্তব সিদ্ধান্তে মাঠ-তথ্য ব্যবহার করুন।
আর একটি অনুমান — independence — বাস্তবে প্রায়ই ভাঙে: একই কারখানার একই ব্যাচের ডিস্ক একই বয়সে একই কাজের চাপে থাকে; একটি বিদ্যুৎ-বিভ্রাট বা অতিরিক্ত গরম একসাথে কয়েকটিকে আঘাত করে; আর rebuild নিজেই বাকি ডিস্কে বাড়তি চাপ দেয়। এমন correlated failure-এর কথা অংশ ৩, ৭ আর ভাবনার প্রশ্ন ২-এ আবার আসবে।
২ · Striping — ডেটা ভাগ করে বহু ডিস্কে, গতির জন্য
প্রথমে গতির কথা। একটি ডিস্ক একসাথে একটিই কাজ করতে পারে — HDD-র হেড একবারে এক জায়গায় থাকে। চারটি ডিস্ক থাকলে চারটি অনুরোধ একসাথে চলতে পারে, অথবা একটি বড় ফাইলের চার টুকরো একসাথে পড়া যায়। ডেটাকে ছোট টুকরোয় ভাগ করে পালা করে ডিস্কগুলোতে বসানোই striping.
ব্যাংকে চারটি টোকেন-কাউন্টার খুললে টোকেন ১ যায় কাউন্টার ১-এ, টোকেন ২ কাউন্টার ২-এ, … টোকেন ৫ আবার কাউন্টার ১-এ — চারজনের কাজ একসাথে চলে। কিন্তু একজন কর্মী অসুস্থ হলে তাঁর কাছে জমা ফাইলগুলো আটকে যায় — striping একা নির্ভরযোগ্যতা দেয় না, বরং কমায়।
Stripe unit, stripe width আর ঠিকানার হিসাব
- Stripe unit বা chunk: এক ডিস্কে পরপর যতটুকু ডেটা বসে, তারপর পরের ডিস্কে যায় — যেমন 64 KiB বা 512 KiB (Linux mdadm-এর বর্তমান ডিফল্ট chunk 512 KiB).
- Stripe: সব ডিস্ক জুড়ে একই “সারির” chunk-গুলো; stripe width = ডেটা-ডিস্কের সংখ্যা × chunk.
- ঠিকানার হিসাব (RAID 0, N টি ডিস্ক): logical chunk নম্বর c হলে ডিস্ক = c mod N, সেই ডিস্কে অবস্থান = ⌊c ÷ N⌋. যেমন N = ৪ হলে chunk ১০ যায় ডিস্ক ২-এ, সেখানে সারি ২-এ।
Chunk ছোট হলে একটি বড় অনুরোধ অনেক ডিস্কে ছড়ায় — এক ফাইল পড়ার throughput বাড়ে, কিন্তু প্রতিটি অনুরোধ সব ডিস্ককে ব্যস্ত রাখে। Chunk বড় হলে ছোট অনুরোধগুলো সাধারণত একটি ডিস্কেই শেষ হয়, ফলে আলাদা আলাদা অনুরোধ একসাথে আলাদা ডিস্কে চলে — database-এর মতো অনেক ছোট random অনুরোধের কাজে ভালো।
পুরোনো RAID 2 আর 3 ভাগ করত bit বা byte স্তরে, তাই প্রতিটি অনুরোধে সব ডিস্ক একসাথে ব্যস্ত হতো (অংশ ৪)। আধুনিক সব নকশা (RAID 0, 4, 5, 6, 10) block-level, যাতে ছোট অনুরোধ একটি ডিস্কেই শেষ হয় আর অনেকগুলো একসাথে চলে।
RAID 0 — শুধু striping
RAID 0-তে কোনো redundancy নেই: N টি ডিস্কের পুরো ধারণক্ষমতা ব্যবহারযোগ্য, পড়া আর লেখা দুটিই প্রায় N গুণ, কিন্তু যেকোনো একটি ডিস্ক গেলে পুরো অ্যারে যায় — কারণ প্রতিটি বড় ফাইলের টুকরো সব ডিস্কে। ডেটা-হারানোর গড় সময় অংশ ১-এর সূত্রেই MTTF ÷ N. তাই RAID 0 শুধু এমন ডেটার জন্য, যা আবার বানানো যায় — ভিডিও এডিটিং-এর অস্থায়ী ফাইল, build cache, বা এমন cluster-এর node যেখানে ডেটার কপি অন্য মেশিনে আছে।
৩ · Mirroring আর MTTDL — দুই কপির শক্তি
সবচেয়ে সরল redundancy: প্রতিটি ব্লক দুটি ডিস্কে লেখা। এটিই RAID 1 বা mirroring. একটি ডিস্ক নষ্ট হলে অন্যটি থেকে সব ডেটা পাওয়া যায়; নতুন ডিস্ক বসিয়ে কপি করলে (rebuild) আবার দুই কপি।
- ধারণক্ষমতা: অর্ধেক (দুই কপির mirror-এ)। N-way mirror-এ N ভাগের এক ভাগ।
- পড়া: যেকোনো কপি থেকে পড়া যায় — দুটি পড়া একসাথে দুই ডিস্কে চলতে পারে, তাই random পড়া প্রায় দ্বিগুণ।
- লেখা: প্রতিটি লেখা দুই ডিস্কেই — একটি ডিস্কের মতোই গতি (দুটি সমান্তরালে চলে), কিন্তু I/O দ্বিগুণ।
ডেটা হারানোর গড় সময় — MTTDL
Mirror-এ ডেটা হারায় তখনই, যখন একটি ডিস্ক নষ্ট হওয়ার পর মেরামত শেষ হওয়ার আগেই অন্যটিও নষ্ট হয়। এই গড় সময়কে বলে MTTDL (mean time to data loss). সূত্রটি তিন ধাপের যুক্তিতে আসে (independence আর exponential মডেল ধরে):
ধাপ ১ — প্রথম ব্যর্থতা: দুটি ডিস্ক, প্রতিটির হার ১/MTTF, তাই যেকোনো একটির ব্যর্থতার হার ২/MTTF; প্রথম ব্যর্থতা পর্যন্ত গড় সময় MTTF/২.
ধাপ ২ — বিপদের জানালা: এরপর MTTR সময় ধরে অ্যারে অরক্ষিত। এই সময়ে বাকি ডিস্কটি নষ্ট হওয়ার সম্ভাবনা ≈ MTTR/MTTF (MTTR অনেক ছোট হলে)। সংখ্যায়: ১০/১,০০,০০০ = ০.০০০১ — দশ হাজারে একবার।
ধাপ ৩ — গড় কতবার চেষ্টা: প্রতিটি প্রথম-ব্যর্থতা একটি “লটারি”, যাতে ০.০০০১ সম্ভাবনায় ডেটা হারায়। গড়ে ১/০.০০০১ = ১০,০০০টি প্রথম-ব্যর্থতার পর একবার হারায়। তাই
MTTDLmirror ≈ (MTTF/২) × (MTTF/MTTR) = MTTF² ÷ (২ × MTTR). ∎
পূর্ণ সংখ্যায় (calculator-এর ফল): MTTF = ১,০০,০০০ ঘণ্টা, MTTR = ১০ ঘণ্টা হলে MTTF² = ১০১০, ২ × MTTR = ২০, তাই MTTDL = ১০১০ ÷ ২০ = ৫ × ১০৮ ঘণ্টা ≈ ৫৭,০৭৭.৬ বছর. একটি ডিস্কের MTTF-এর ঠিক ৫,০০০ গুণ (MTTF ÷ (২ × MTTR) = ৫,০০০)। আর লক্ষ করুন MTTR কোথায়: হরে। মেরামত দ্বিগুণ ধীর হলে MTTDL অর্ধেক — তাই দ্রুত rebuild আর hot spare এত গুরুত্বপূর্ণ (অংশ ৭)।
একই যুক্তি N টি ডিস্কের RAID 5-এ (একটি ব্যর্থতা সয়): প্রথম ব্যর্থতার হার N/MTTF, তারপর বাকি N − ১টির যেকোনো একটি MTTR-এর মধ্যে গেলে ক্ষতি, তাই MTTDLRAID 5 ≈ MTTF² ÷ (N(N − ১) × MTTR) — Patterson ও সহকর্মীদের গবেষণাপত্রেও এই রূপেরই সূত্র। ৬টি ডিস্কে: ১০১০ ÷ (৬ × ৫ × ১০) ≈ ৩.৩৩ × ১০৭ ঘণ্টা ≈ ৩,৮০৫.২ বছর — mirror জোড়ার চেয়ে কম, কারণ বেশি ডিস্ক মানে বেশি “দ্বিতীয় প্রার্থী”।
এই সংখ্যাগুলো বাস্তবের আশাবাদী সীমা। সূত্র ধরে নেয় ব্যর্থতা স্বাধীন, হার স্থির, আর rebuild-এ কোনো পড়ার ত্রুটি নেই; বাস্তবে ব্যর্থতা গুচ্ছ বেঁধে আসে আর বড় ডিস্কে rebuild দিন লাগে (ভাবনার প্রশ্ন ২)। “৫৭ হাজার বছর” মানে “এই মডেলে” — “আমার ডেটা নিরাপদ” নয়।
৪ · Parity আর XOR — এক ব্লকে সবার পাহারা
Mirroring-এ অর্ধেক জায়গা যায়। কম খরচে একই সুরক্ষা কি সম্ভব? হ্যাঁ, যদি আমরা জানি কোন ডিস্কটি নষ্ট হয়েছে — আর ডিস্কের বেলায় তা জানা যায়, কারণ নষ্ট ডিস্ক সাড়া দেয় না বা নিজেই ত্রুটি জানায় (প্রতিটি sector-এর নিজস্ব ECC আছে)। তখন একটি মাত্র বাড়তি ব্লকই যথেষ্ট: সব ডেটা-ব্লকের XOR.
XOR-এর তিনটি গুণ
- a ⊕ a = 0 আর a ⊕ 0 = a — একই জিনিস দুবার XOR করলে মুছে যায়।
- ক্রম বা জোড়া বাঁধায় কিছু যায় আসে না (commutative, associative).
- তাই P = D0 ⊕ D1 ⊕ D2 হলে যেকোনো একটি হারালে বাকিদের XOR-ই সেটি: D1 = D0 ⊕ D2 ⊕ P (কারণ D0 ⊕ D2 ⊕ P = D0 ⊕ D2 ⊕ D0 ⊕ D1 ⊕ D2 = D1).
হাতে বিট মিলিয়ে দেখুন
| ব্লক | বিট (৮টি) | hex |
|---|---|---|
| D0 | 10110010 | b2 |
| D1 | 01101100 | 6c |
| D2 | 11010101 | d5 |
| D0 ⊕ D1 | 11011110 | de |
| P = D0 ⊕ D1 ⊕ D2 | 00001011 | 0b |
এখন D1-এর ডিস্ক নষ্ট। বাকিরা: D0 ⊕ D2 = 01100111, তার সাথে ⊕ P = 01101100 = D1 — হুবহু ফেরত। | ||
প্রতিটি বিট-কলামে নিয়মটি সহজ: P-এর বিট এমন যে ওই কলামে মোট ১-এর সংখ্যা জোড় হয় (even parity). একটি ঘর মুছে গেলে বাকি ঘরগুলো দেখে বলা যায়, জোড় রাখতে সেখানে ০ ছিল না ১. পরীক্ষার খাতায় ঠিক এভাবেই কলাম ধরে হিসাব করুন।
নিচের C প্রোগ্রাম একই কাজ বাস্তবের মতো করে — byte array-র ওপর: তিনটি ৮-byte chunk, তাদের parity, তারপর একটি chunk “হারিয়ে” XOR দিয়ে ফেরত।
#include <stdio.h>
#include <string.h>
#define K 3 /* data chunks in one stripe */
#define C 8 /* bytes per chunk */
static void dump(const char *name, const unsigned char *b) {
printf("%-9s", name);
for (int i = 0; i < C; i++) printf(" %02x", b[i]);
printf("\n");
}
int main(void) {
unsigned char d[K][C], parity[C] = {0}, saved[C];
memcpy(d[0], "Dhaka-01", C);
memcpy(d[1], "Khulna02", C);
memcpy(d[2], "Sylhet03", C);
for (int k = 0; k < K; k++) /* parity = d0 ^ d1 ^ d2, byte by byte */
for (int i = 0; i < C; i++) parity[i] ^= d[k][i];
for (int k = 0; k < K; k++) { char n[16]; snprintf(n, sizeof n, "chunk%d", k); dump(n, d[k]); }
dump("parity", parity);
memcpy(saved, d[1], C); /* keep a copy only to check later */
memset(d[1], 0, C); /* the disk holding chunk1 dies */
for (int i = 0; i < C; i++) /* rebuild = parity ^ all survivors */
d[1][i] = parity[i] ^ d[0][i] ^ d[2][i];
dump("rebuilt1", d[1]);
printf("rebuilt chunk1 = \"%.8s\", identical: %s\n", (const char *)d[1],
memcmp(d[1], saved, C) == 0 ? "yes" : "no");
return 0;
}আউটপুট:
chunk0 44 68 61 6b 61 2d 30 31
chunk1 4b 68 75 6c 6e 61 30 32
chunk2 53 79 6c 68 65 74 30 33
parity 5c 79 78 6f 6a 38 30 30
rebuilt1 4b 68 75 6c 6e 61 30 32
rebuilt chunk1 = "Khulna02", identical: yes
প্রথম তিন লাইন তিনটি chunk-এর ASCII byte (44 = 'D', 4b = 'K', 53 = 'S'). Parity-র প্রথম byte: 44 ⊕ 4b ⊕ 53 = 5c. memset দিয়ে chunk1 মুছে parity[i] ^ d[0][i] ^ d[2][i] দিয়ে আবার বানানো হলো — rebuilt1 লাইন chunk1-এর সাথে হুবহু এক, আর memcmp বলছে identical: yes. বাস্তব RAID-এ এই লুপ চলে ৫১২ KiB chunk-এ, আর kernel এর জন্য SIMD instruction ব্যবহার করে।
ঐতিহাসিক লেভেল — RAID 2 আর RAID 3
- RAID 2: bit-level striping, আর সুরক্ষা Hamming code দিয়ে, যা কোন বিট ভুল তা খোঁজে বলে কয়েকটি বাড়তি ডিস্ক লাগে। কিন্তু ডিস্ক নিজেই জানায় কোন sector পড়া যায়নি, তাই একটি parity-ই যথেষ্ট — RAID 2 আজ অচল।
- RAID 3: byte-level striping আর একটি আলাদা parity ডিস্ক; সব ডিস্কের ঘূর্ণন একসাথে মেলানো (synchronized spindle). বড় sequential কাজে দ্রুত, কিন্তু একবারে একটিই অনুরোধ; আজ বিরল।
RAID 4 — block-level, একটি আলাদা parity ডিস্ক
RAID 4 = block-level striping + সব parity একটি নির্দিষ্ট ডিস্কে। ছোট পড়া একটি ডেটা-ডিস্কেই শেষ হয়, তাই অনেকগুলো পড়া একসাথে চলে। কিন্তু প্রতিটি লেখায় parity বদলাতে হয় — আর সব parity এক ডিস্কে, তাই N − ১টি ডেটা-ডিস্কের সব ছোট লেখা লাইন ধরে ওই একটি ডিস্কের সামনে দাঁড়ায়। Parity ডিস্কই bottleneck — একটি চুলার রেস্তোরাঁর মতো, যেখানে সব রাঁধুনিকে শেষ ধাপে একই চুলায় আসতে হয়।
ব্যতিক্রম: লেখা সবসময় পুরো stripe জুড়ে হলে parity নতুন করে হিসাব করে একসাথে লেখা যায়, পুরোনো কিছু পড়তে হয় না, bottleneck-ও থাকে না। NetApp-এর WAFL file system এভাবে লেখা জমিয়ে বহু বছর RAID 4 (আর দুই-parity রূপ RAID-DP) ব্যবহার করেছে — file system আর RAID একসাথে নকশার পুরোনো উদাহরণ, যার আধুনিক রূপ অংশ ৮-এর ZFS.
৫ · RAID 5 — ঘুরতে থাকা parity আর ছোট লেখার দাম
RAID 4-এর bottleneck-এর সমাধান সহজ: parity একটি ডিস্কে না রেখে stripe-ভেদে ঘুরিয়ে সব ডিস্কে ছড়িয়ে দেওয়া। Stripe 0-এর parity শেষ ডিস্কে, stripe 1-এর parity তার আগেরটিতে, এভাবে। এখন দুটি ছোট লেখা যদি আলাদা stripe-এ পড়ে, তাদের parity আলাদা ডিস্কে — একসাথে চলতে পারে। এটিই RAID 5: distributed parity.
- ধারণক্ষমতা: (N − ১) × S — একটি ডিস্কের সমান জায়গা parity-তে, কিন্তু ছড়ানো। ৪টি ডিস্কে দক্ষতা ৭৫%, ৮টিতে ৮৭.৫%.
- সয়: যেকোনো একটি ডিস্কের ব্যর্থতা।
- পড়া: random পড়ায় N টি ডিস্কই কাজে লাগে (RAID 4-এ parity ডিস্ক পড়ায় অলস থাকে)।
- লেখা: বড়, পুরো-stripe লেখা দ্রুত; কিন্তু ছোট লেখায় দাম — নিচে।
নিচের simulator ৪টি ডিস্কে ৪টি stripe বানায়। প্রতিটি “ব্লক” এখানে এক byte — বার্তা DHAKA-METRO!-এর একেকটি অক্ষর — যাতে পুরো layout এক নজরে দেখা যায়। তারপর একটি ডিস্ক “নষ্ট” করে বাকিদের XOR দিয়ে তার সব ব্লক আবার বানায়।
// RAID 5 simulator: N disks, rotating parity, 1-byte blocks, then a disk failure.
const N = 4, msg = "DHAKA-METRO!"; // 12 data bytes = 4 stripes x 3
const hex = b => b.toString(16).padStart(2, "0");
const disks = Array.from({ length: N }, () => []);
const stripes = msg.length / (N - 1);
let k = 0;
for (let s = 0; s < stripes; s++) {
const pd = N - 1 - (s % N); // parity disk rotates right-to-left
let p = 0;
for (let d = 0; d < N; d++) {
if (d === pd) continue;
const b = msg.charCodeAt(k);
disks[d][s] = { tag: "D" + k++, val: b }; p ^= b;
}
disks[pd][s] = { tag: "P" + s, val: p };
}
const show = cell => (cell.tag + ":" + hex(cell.val)).padEnd(7);
console.log("stripe " + disks.map((_, d) => ("disk" + d).padEnd(7)).join(" "));
for (let s = 0; s < stripes; s++)
console.log((" " + s).padEnd(8) + disks.map(dk => show(dk[s])).join(" "));
const failed = 2, lost = disks[failed]; // remember the truth, then "fail"
disks[failed] = null;
console.log("\ndisk" + failed + " FAILED - rebuilding from the other " + (N - 1) + " disks");
let ok = 0;
for (let s = 0; s < stripes; s++) {
let x = 0;
for (let d = 0; d < N; d++) if (d !== failed) x ^= disks[d][s].val;
const match = x === lost[s].val; ok += match;
console.log(" stripe " + s + ": XOR of survivors = " + hex(x) + " original " +
lost[s].tag + ":" + hex(lost[s].val) + (match ? " match" : " MISMATCH"));
}
console.log(ok + "/" + stripes + " blocks rebuilt correctly");আউটপুট (নির্ধারিত, প্রতিবার একই):
stripe disk0 disk1 disk2 disk3
0 D0:44 D1:48 D2:41 P0:4d
1 D3:4b D4:41 P1:27 D5:2d
2 D6:4d P2:5c D7:45 D8:54
3 P3:3c D9:52 D10:4f D11:21
disk2 FAILED - rebuilding from the other 3 disks
stripe 0: XOR of survivors = 41 original D2:41 match
stripe 1: XOR of survivors = 27 original P1:27 match
stripe 2: XOR of survivors = 45 original D7:45 match
stripe 3: XOR of survivors = 4f original D10:4f match
4/4 blocks rebuilt correctly
টেবিলে P-এর কোনাকুনি সিঁড়ি দেখুন: stripe 0-এ disk3, 1-এ disk2, 2-এ disk1, 3-এ disk0 — pd = N - 1 - (s % N) লাইনটি এটি করে। ডেটা-ব্লক D0…D11 ক্রমে বাকি ডিস্কগুলোতে বসে (যেমন D0:44 = 'D', D1:48 = 'H'). disk2 নষ্ট হলে তার চারটি ব্লকের একটি parity (P1:27) — rebuild-এর কাছে ডেটা আর parity একই: বাকি তিনটির XOR. যেমন stripe 0: 44 ⊕ 48 ⊕ 4d = 41 ('A'). এই layout-কে বলে left-asymmetric; Linux mdadm-এর ডিফল্ট left-symmetric — সেখানে parity একইভাবে ঘোরে, কিন্তু প্রতিটি stripe-এর ডেটা parity-র পরের ডিস্ক থেকে শুরু হয়, যাতে পরপর ব্লক পড়লে সব ডিস্ক সমানভাবে ব্যস্ত থাকে।
Small write — কেন একটি লেখায় চারটি I/O
ধরুন একটি stripe-এর শুধু একটি ব্লক (D1) বদলাতে হবে। Parity-ও বদলাতে হবে, নইলে পরে rebuild ভুল ফল দেবে। নতুন parity জানার দুই উপায়:
- Read-modify-write: পুরোনো D1 আর পুরোনো P পড়া; নতুন P′ = P ⊕ D1পুরোনো ⊕ D1নতুন (পুরোনো D1-এর অবদান XOR করে মুছে নতুনটির অবদান যোগ); তারপর নতুন D1 আর P′ লেখা। ২টি পড়া + ২টি লেখা = ৪টি I/O, ডিস্ক যতগুলোই থাকুক।
- Reconstruct-write: stripe-এর বাকি ডেটা-ব্লকগুলো পড়া, নতুন D1-সহ সবার XOR করে P′, তারপর ২টি লেখা। N টি ডিস্কে N − ২টি পড়া + ২টি লেখা = N টি I/O. ৪টি ডিস্কে দুটিই ৪টি I/O; ৮টিতে প্রথমটি ৪, দ্বিতীয়টি ৮. তাই ছোট লেখায় read-modify-write, প্রায়-পুরো stripe লেখায় reconstruct-write; Linux md যেটিতে কম পড়া লাগে সেটি বাছে।
নিচের stepper পুরোনো উদাহরণের বিটগুলো নিয়েই চলে: D0 = 10110010, D1 = 01101100, D2 = 11010101, P = 00001011; D1-এর নতুন মান 00111111.
1 request: write D1 := 001111112 I/O 1 read old D1 (disk1)3 I/O 2 read old P (disk3)4 CPU P' = P ⊕ D1 ⊕ D1'5 I/O 3 write new D1 (disk1)6 I/O 4 write new P' (disk3)
| disk0 · D0 | |
| disk1 · D1 | |
| disk2 · D2 | |
| disk3 · P | |
| মোট I/O |
- অনুরোধ: D1-এ নতুন মান 00111111 লিখতে হবে। শুরুতে stripe সুসংগত — D0 ⊕ D1 ⊕ D2 = 00001011 = P. এখনো কোনো I/O হয়নি।
- I/O ১: disk1 থেকে পুরোনো D1 (01101100) পড়া হলো। মোট I/O ১।
- I/O ২: disk3 থেকে পুরোনো P (00001011) পড়া হলো। মোট I/O ২।
- হিসাব: P′ = 00001011 ⊕ 01101100 ⊕ 00111111 = 01011000. শুধু CPU-র কাজ, তাই I/O তখনো ২।
- I/O ৩: নতুন D1 (00111111) disk1-এ লেখা হলো; disk3-এ তখনো পুরোনো P — এই মুহূর্তে stripe অসংগত। বিদ্যুৎ গেলে এটিই write hole (অংশ ৮)। মোট I/O ৩।
- I/O ৪: P′ (01011000) disk3-এ লেখা হলো; D0 ⊕ D1′ ⊕ D2 = 01011000 = P′, stripe আবার সুসংগত। মোট ২টি পড়া + ২টি লেখা = ৪টি I/O; disk0 আর disk2 ছোঁয়াই হয়নি।
এই ৪-এর দাম সরাসরি গতিতে পড়ে। প্রতিটি ডিস্ক সেকেন্ডে R টি random I/O পারলে, N টি ডিস্কের RAID 5-এ ছোট random লেখা মোটামুটি N × R ÷ ৪ টি — যেখানে RAID 10-এ N × R ÷ ২ আর RAID 0-তে N × R. Database-এর মতো ছোট-লেখা-ভারী কাজে তাই প্রায়ই RAID 10 বেছে নেওয়া হয়। Write cache ছোট লেখা জমিয়ে পুরো stripe বানাতে পারলে এই দাম কমে (অংশ ৮)।
Degraded read: একটি ডিস্ক নষ্ট অবস্থায় (degraded mode) সেই ডিস্কের ব্লক পড়তে হলে stripe-এর বাকি N − ১টি ব্লক পড়ে XOR করতে হয় — তাই degraded RAID 5 চলে, কিন্তু ধীরে, আর আরেকটি ব্যর্থতায় সব শেষ। Degraded mode তাই জরুরি অবস্থা, স্বাভাবিক অবস্থা নয়।
৬ · RAID 6, RAID 10 বনাম 01, আর সব লেভেলের তুলনা
RAID 6 — P আর Q, দুটি ব্যর্থতা সয়
RAID 6 প্রতিটি stripe-এ দুটি আলাদা হিসাব-ব্লক রাখে, দুটিই ঘুরিয়ে ছড়ানো। P সেই পুরোনো XOR. Q একটি ভিন্ন হিসাব: প্রতিটি ডেটা-ব্লককে আলাদা একটি সহগ দিয়ে “গুণ” করে যোগ — তবে সাধারণ গণিতে নয়, ২৫৬টি মানের একটি finite field (GF(28))-এ, যেখানে যোগ মানেই XOR. এটি Reed–Solomon code-এর একটি বিশেষ রূপ। দুটি ডিস্ক হারালে দুটি অজানা, আর P ও Q দুটি স্বাধীন সমীকরণ — তাই দুটি অজানাই সমাধান করা যায়। Linux-এর md driver ঠিক এই P+Q নকশা ব্যবহার করে; তার গণিত H. Peter Anvin-এর “The mathematics of RAID-6” লেখায় সহজভাবে ব্যাখ্যা করা আছে।
- ধারণক্ষমতা: (N − ২) × S. দক্ষতা ৬টি ডিস্কে ৬৬.৭%, ৮টিতে ৭৫%.
- Small write: পুরোনো D, P, Q পড়া আর নতুন D, P, Q লেখা — ৬টি I/O; Q-এর হিসাবে CPU-ও বেশি খাটে।
- লাভ: rebuild চলার সময়ও আরেকটি ব্যর্থতা বা পড়ার ত্রুটি সয় — বড় ডিস্কের যুগে এটিই মূল যুক্তি (অংশ ৭)। MTTDL-এর সূত্রে MTTF-এর ঘাত ৩ হয়ে যায়: MTTF³ ÷ (N(N − ১)(N − ২) × MTTR²)।
RAID 10 বনাম RAID 01
দুটিই striping আর mirroring মেলায়, শুধু ক্রম উল্টো। RAID 10 (1+0): আগে জোড়ায় জোড়ায় mirror, তারপর জোড়াগুলোর ওপর stripe. RAID 01 (0+1): আগে দুটি RAID 0 stripe, তারপর পুরো stripe দুটিকে একে অপরের mirror. ধারণক্ষমতা আর স্বাভাবিক গতি একই — অর্ধেক জায়গা, ছোট লেখায় ২টি I/O. পার্থক্য দেখা দেয় একটি ডিস্ক নষ্ট হওয়ার পর।
1 4 disks: A1 A2 B1 B22 first failure: A13 second failure = A2 ?4 second failure = B1 ?5 second failure = B2 ?6 tally
| RAID 10 (pair X │ pair Y) | |
| RAID 10 ফল | |
| RAID 01 (S1 ═ S2) | |
| RAID 01 ফল |
- শুরু: একই ৪টি ডিস্ক, ডেটার অবস্থানও এক — A1 ও A2-তে chunk A, B1 ও B2-তে chunk B. পার্থক্য শুধু controller কীভাবে দল বাঁধে: RAID 10-এ জোড়া X(A1, A2) আর Y(B1, B2); RAID 01-এ stripe S1(A1, B1) আর S2(A2, B2).
- প্রথম ব্যর্থতা A1: RAID 10-এ শুধু জোড়া X degraded, A2 কাজ চালায়। RAID 01-এ পুরো S1 অচল — B1 সুস্থ হলেও অব্যবহৃত; অ্যারে এখন কার্যত একটি RAID 0 (S2).
- দ্বিতীয় ব্যর্থতা A2: chunk A-এর শেষ কপি গেল — দুই নকশাতেই ডেটা হারাল।
- দ্বিতীয় ব্যর্থতা B1: RAID 10-এ জোড়া Y-তে B2 আছে — টিকে গেল। RAID 01-এও টিকে গেল, কারণ B1 আগেই অচল S1-এ ছিল।
- দ্বিতীয় ব্যর্থতা B2: RAID 10-এ B1 আছে — টিকে গেল। RAID 01-এ S2 ভাঙল, আর S1 তো আগেই অচল — ডেটা হারাল, যদিও chunk B সুস্থ B1-এ বসে আছে।
- হিসাব: বাকি ৩টি ডিস্কের যেকোনোটি সমান সম্ভাবনায় দ্বিতীয়বার নষ্ট হলে RAID 10 টেকে ২/৩ (৬৬.৭%), RAID 01 টেকে ১/৩ (৩৩.৩%). ৮টি ডিস্কে ৮৫.৭% বনাম ৪২.৯%. Rebuild-এও RAID 10 এগিয়ে: শুধু একটি ডিস্ক কপি, RAID 01-এ পুরো stripe.
নিচের ছোট প্রোগ্রামটি সব সম্ভাব্য (প্রথম, দ্বিতীয়) ব্যর্থতা-জোড়া গুনে একই উত্তর ৪, ৬ আর ৮টি ডিস্কে যাচাই করে।
// RAID 10 vs RAID 01: after one disk fails, which second failures lose data?
// Enumerate every ordered pair (first, second) of distinct failed disks.
function alive(kind, n, dead) { // disks 0..n-1, dead = Set
const half = n / 2;
if (kind === "10") { // mirror pairs (0,1) (2,3) ... striped
for (let p = 0; p < n; p += 2) if (dead.has(p) && dead.has(p + 1)) return false;
return true;
}
// "01": stripe A = disks 0..half-1, stripe B = half..n-1, A mirrored to B;
// one dead disk takes its whole stripe offline.
const aDead = [...dead].some(d => d < half), bDead = [...dead].some(d => d >= half);
return !(aDead && bDead);
}
for (const n of [4, 6, 8]) {
for (const kind of ["10", "01"]) {
let survive = 0, total = 0;
for (let a = 0; a < n; a++)
for (let b = 0; b < n; b++) {
if (a === b) continue;
total++;
if (alive(kind, n, new Set([a, b]))) survive++;
}
console.log(`n=${n} RAID ${kind}: second failure survivable in ${survive}/${total} cases` +
` = ${(100 * survive / total).toFixed(1)}%`);
}
}আউটপুট (নির্ধারিত, প্রতিবার একই):
n=4 RAID 10: second failure survivable in 8/12 cases = 66.7%
n=4 RAID 01: second failure survivable in 4/12 cases = 33.3%
n=6 RAID 10: second failure survivable in 24/30 cases = 80.0%
n=6 RAID 01: second failure survivable in 12/30 cases = 40.0%
n=8 RAID 10: second failure survivable in 48/56 cases = 85.7%
n=8 RAID 01: second failure survivable in 24/56 cases = 42.9%
৪টি ডিস্কে ক্রমযুক্ত জোড়া ৪ × ৩ = ১২টি; RAID 10 টেকে ৮টিতে, RAID 01 ৪টিতে — stepper-এর ২/৩ আর ১/৩. সাধারণ সূত্র: n টি ডিস্কে প্রথম ব্যর্থতার পর বাকি n − ১টির মধ্যে RAID 10-এ ঘাতক মাত্র ১টি (জোড়ার সঙ্গী), তাই টেকার সম্ভাবনা (n − ২)/(n − ১); RAID 01-এ ঘাতক অন্য stripe-এর n/২টি, তাই টেকে (n/২ − ১)/(n − ১) — যা কখনো ৫০%-এ পৌঁছায় না। তাই বাস্তবে “RAID 10” প্রায় সবসময় সঠিক পছন্দ; কিছু controller নামে 01 হলেও ভেতরে 10-এর মতো আচরণ করে — ডকুমেন্টেশন দেখে নিন।
সব লেভেল এক টেবিলে
| লেভেল | কৌশল | ব্যবহারযোগ্য (N টি S আকারের ডিস্ক) | নিশ্চিতভাবে সয় | Random পড়া | ছোট লেখায় I/O | কোথায় মানায় |
|---|---|---|---|---|---|---|
| RAID 0 | striping | N × S | ০ | N × R | ১ | অস্থায়ী, আবার বানানো যায় এমন ডেটা |
| RAID 1 | mirror (২ কপি) | S (২টি ডিস্কে) | ১ | ২ × R | ২ | OS ডিস্ক, ছোট সার্ভার |
| RAID 2 | bit-striping + Hamming | ডিস্কভেদে | ১ | — | — | ঐতিহাসিক |
| RAID 3 | byte-striping + আলাদা parity | (N − ১) × S | ১ | একবারে একটি | সব ডিস্ক | ঐতিহাসিক, বড় sequential কাজ |
| RAID 4 | block-striping + আলাদা parity | (N − ১) × S | ১ | (N − ১) × R | ৪ (parity ডিস্কে লাইন) | পুরো-stripe লেখে এমন file system |
| RAID 5 | ঘুরতে থাকা parity | (N − ১) × S | ১ | N × R | ৪ | পড়া-ভারী কাজ, ছোট ডিস্কের অ্যারে |
| RAID 6 | P + Q parity | (N − ২) × S | ২ | N × R | ৬ | বড় ডিস্কের বড় অ্যারে, archive |
| RAID 10 | mirror-জোড়ার ওপর stripe | N/২ × S | ১ (ভাগ্য ভালো হলে N/২ পর্যন্ত) | N × R | ২ | database, ছোট-লেখা-ভারী কাজ |
| RAID 01 | stripe-এর mirror | N/২ × S | ১ | N × R | ২ | এড়িয়ে চলুন — RAID 10 নিন |
R = একটি ডিস্কের প্রতি সেকেন্ডে random I/O; গতির কলামগুলো আনুমানিক, controller, cache আর workload-এ অনেক বদলায়। এবার একটি নির্দিষ্ট অ্যারের সংখ্যা — ৬টি ৪ TB ডিস্ক — আর অংশ ১ ও ৩-এর MTTF/MTTDL-এর হিসাব এক জায়গায়:
// RAID calculator: usable capacity, efficiency, failures survived, small-write cost,
// then the MTTF / MTTDL numericals (independent failures assumed).
const N = 6, S = 4; // N disks, S TB each
const levels = [ // [name, data disks, guaranteed failures, I/Os per small write]
["RAID 0", N, 0, 1],
["RAID 1", 1, N - 1, N], // N-way mirror: every write goes to all N
["RAID 5", N - 1, 1, 4],
["RAID 6", N - 2, 2, 6],
["RAID 10", N / 2, 1, 2],
];
console.log(`${N} disks x ${S} TB = ${N * S} TB raw`);
console.log("level usable efficiency survives I/Os per small write");
for (const [name, data, fail, io] of levels)
console.log(name.padEnd(9) + (data * S + " TB").padStart(6) +
((100 * data / N).toFixed(1) + "%").padStart(12) +
String(fail).padStart(10) + String(io).padStart(12));
const MTTF = 100000, MTTR = 10, HPY = 8760; // hours; hours per year
const yrs = h => (h / HPY).toFixed(1) + " years";
console.log(`\nMTTF of one disk: ${MTTF} h = ${yrs(MTTF)}`);
for (const n of [10, 100]) console.log(`MTTF of ${n} disks (first failure): ${MTTF / n} h = ${(MTTF / n / 24).toFixed(1)} days`);
const pair = MTTF ** 2 / (2 * MTTR);
console.log(`MTTDL mirrored pair = MTTF^2/(2*MTTR) = ${pair.toExponential(2)} h = ${yrs(pair)}`);
const r5 = MTTF ** 2 / (N * (N - 1) * MTTR);
console.log(`MTTDL RAID 5, ${N} disks = MTTF^2/(N(N-1)MTTR) = ${r5.toExponential(2)} h = ${yrs(r5)}`);
// Unrecoverable read errors while rebuilding RAID 5: all N-1 survivors are read in full.
const bits = (N - 1) * S * 1e12 * 8;
for (const ure of [1e14, 1e15]) {
const expected = bits / ure;
console.log(`URE spec 1 per ${ure.toExponential(0)} bits: read ${(N - 1) * S} TB, ` +
`expected UREs ${expected.toFixed(2)}, P(no URE) = ${(100 * Math.exp(-expected)).toFixed(1)}%`);
}আউটপুট (নির্ধারিত, প্রতিবার একই):
6 disks x 4 TB = 24 TB raw
level usable efficiency survives I/Os per small write
RAID 0 24 TB 100.0% 0 1
RAID 1 4 TB 16.7% 5 6
RAID 5 20 TB 83.3% 1 4
RAID 6 16 TB 66.7% 2 6
RAID 10 12 TB 50.0% 1 2
MTTF of one disk: 100000 h = 11.4 years
MTTF of 10 disks (first failure): 10000 h = 416.7 days
MTTF of 100 disks (first failure): 1000 h = 41.7 days
MTTDL mirrored pair = MTTF^2/(2*MTTR) = 5.00e+8 h = 57077.6 years
MTTDL RAID 5, 6 disks = MTTF^2/(N(N-1)MTTR) = 3.33e+7 h = 3805.2 years
URE spec 1 per 1e+14 bits: read 20 TB, expected UREs 1.60, P(no URE) = 20.2%
URE spec 1 per 1e+15 bits: read 20 TB, expected UREs 0.16, P(no URE) = 85.2%
প্রথম টেবিলে RAID 1 সারিটি ৬টি ডিস্কেরই একই কপি (৬-way mirror) ধরেছে — তাই মাত্র ৪ TB, কিন্তু ৫টি ব্যর্থতা সয়; সাধারণ দুই-ডিস্কের mirror-এ দক্ষতা ৫০%. RAID 10-এর survives 1 “নিশ্চিত” সংখ্যা। নিচের অংশে অংশ ১ আর ৩-এর সংখ্যাগুলোই। শেষ দুই লাইন অংশ ৭-এর বিষয় — RAID 5 rebuild-এ বাকি ৫টি ডিস্কের ২০ TB পুরো পড়তে হলে, স্পেসিফিকেশনের সবচেয়ে খারাপ হারে একটিও পড়ার ত্রুটি না হওয়ার সম্ভাবনা মাত্র ২০.২%. N, S, MTTR বদলে নিজের অ্যারে হিসাব করুন।
৭ · ডিস্ক নষ্ট হলে — rebuild, URE আর hot spare
একটি ডিস্ক নষ্ট হলে অ্যারে degraded mode-এ চলে। সুরক্ষা ফেরাতে নতুন ডিস্ক বসিয়ে প্রতিটি stripe-এর হারানো ব্লক বানিয়ে তাতে লিখতে হয় — rebuild (ZFS-এর ভাষায় resilver). অংশ ৫-এর simulator-এর অ্যারেতে disk2 নষ্ট হলে কী ঘটে, ধাপে ধাপে:
1 array optimal, 4 disks2 disk2 fails: degraded3 spare: rebuild stripe 04 spare: rebuild stripe 15 spare: rebuild stripe 26 spare: rebuild stripe 3
| disk0 | |
| disk1 | |
| disk2 | |
| hot spare | |
| disk3 | |
| অবস্থা |
- স্বাভাবিক অবস্থা: চারটি ডিস্কই সুস্থ; প্রতিটি stripe-এ ৪টি ব্লকের XOR শূন্য, যেমন stripe 0: 44 ⊕ 48 ⊕ 41 = 4d = P0.
- disk2 নষ্ট: অ্যারে degraded, কোনো redundancy নেই। একটি অ্যাপ D2 চাইলে controller বাকি তিনটি পড়ে 44 ⊕ 48 ⊕ 4d = 41 ফেরত দেয় — একটি পড়ার বদলে তিনটি।
- Rebuild, stripe 0: hot spare যোগ হলো; 44 ⊕ 48 ⊕ 4d = 41 spare-এ লেখা হলো। অগ্রগতি ১/৪।
- Rebuild, stripe 1: 4b ⊕ 41 ⊕ 2d = 27 — এটি ছিল parity P1, rebuild-এর কাছে ডেটা আর parity একই। অগ্রগতি ২/৪।
- Rebuild, stripe 2: 4d ⊕ 5c ⊕ 54 = 45 spare-এ লেখা হলো। অগ্রগতি ৩/৪।
- Rebuild, stripe 3: 3c ⊕ 52 ⊕ 21 = 4f; spare এখন নতুন disk2, অ্যারে আবার optimal. পুরো সময়টা বাকি তিনটি ডিস্ক শুরু থেকে শেষ পর্যন্ত পড়তে হয়েছে — ধাপ ২ থেকে ৬ জুড়ে আরেকটি ব্যর্থতা বা একটি পড়ার ত্রুটি মানে ডেটা হারানো।
Rebuild কত সময় নেয়
সবচেয়ে ভালো ক্ষেত্রেও rebuild-এ নতুন ডিস্কটি শুরু থেকে শেষ পর্যন্ত লিখতে হয়। একটি HDD-র sequential গতি ধরুন ১৫০–২০০ MB/s: ৪ TB ডিস্কে ১৫০ MB/s-এ প্রায় ৭.৪ ঘণ্টা, ২০০ MB/s-এ প্রায় ৫.৬ ঘণ্টা; ১৬ TB ডিস্কে ২০০ MB/s-এ প্রায় ২২.২ ঘণ্টা — আর অ্যারে যদি একই সময়ে ব্যবহারকারীর কাজও সামলায়, গতি ধরুন ৫০ MB/s-এ নামলে প্রায় ৮৮.৯ ঘণ্টা, প্রায় চার দিন। এগুলোই বাস্তবের MTTR, আর অংশ ৩-এর সূত্রে MTTR হরে বসে। Linux md-তে rebuild-এর গতির সীমা dev.raid.speed_limit_min/_max sysctl দিয়ে ঠিক হয়।
URE — rebuild-এর লুকানো ঝুঁকি
ডিস্কের datasheet-এ একটি সংখ্যা থাকে: unrecoverable read error rate — যেমন সাধারণ desktop HDD-তে “প্রতি ১০১৪ বিট পড়ায় ১টির কম”, enterprise HDD-তে প্রায়ই ১০১৫. URE মানে ডিস্ক একটি sector পড়তে পারল না, নিজের ECC দিয়েও ঠিক করতে পারল না। স্বাভাবিক RAID 5-এ এতে সমস্যা নেই — অন্য ডিস্কের parity দিয়ে সেই sector বানিয়ে আবার লেখা হয়। কিন্তু degraded RAID 5-এ redundancy নেই; rebuild-এর মাঝে একটি URE মানে অন্তত সেই stripe-এর ডেটা আর বানানো যায় না।
Calculator-এর হিসাব: ৬টি ৪ TB ডিস্কের RAID 5-এ rebuild-এ বাকি ৫টির ২০ TB = ১.৬ × ১০১৪ বিট পড়তে হয়। ১০১৪ হারে গড়ে ১.৬০টি URE প্রত্যাশিত, একটিও না হওয়ার সম্ভাবনা e−১.৬ ≈ ২০.২%; ১০১৫ হারে ০.১৬টি, সম্ভাবনা ৮৫.২%. এই ধরনের হিসাব থেকেই ২০০৭ সালে Robin Harris ZDNet-এ লেখেন “Why RAID 5 stops working in 2009” — বড় ডিস্কের যুগে RAID 5-এর rebuild প্রায় নিশ্চিত ব্যর্থ হবে। এটি “RAID 5 is dead” বিতর্কের সূচনা।
সংখ্যাগুলো সতর্কতার সাথে পড়ুন। ১০১৪ একটি স্পেসিফিকেশন-সীমা (“এর চেয়ে খারাপ নয়”), মাপা গড় নয়, তাই ২০.২% একটি হতাশাবাদী সীমা। আর একটি URE সব controller-এ পুরো অ্যারে মারে না: Linux md সেই ব্লক bad-block তালিকায় তুলে rebuild চালিয়ে যেতে পারে, ZFS বলে দেয় কোন ফাইলটি ক্ষতিগ্রস্ত; কিছু hardware controller অবশ্য পুরো rebuild থামিয়ে দেয়। প্রায় সর্বসম্মত নিষ্কর্ষ: বড় HDD-র বড় অ্যারেতে single-parity RAID 5-এর বদলে RAID 6 / RAID-Z2 বা RAID 10, আর নিয়মিত backup.
Hot spare আর scrubbing
- Hot spare: অ্যারেতে আগে থেকে লাগানো একটি অলস ডিস্ক। ব্যর্থতা ধরা পড়লেই controller সেটিতে rebuild শুরু করে — মানুষ এসে ডিস্ক বদলানোর ঘণ্টা বা দিন MTTR থেকে বাদ যায়।
- Scrubbing: নিয়মিত (যেমন মাসে একবার) পুরো অ্যারে পড়ে parity মিলিয়ে দেখা আর খারাপ sector আগেভাগে ঠিক করা — যাতে লুকানো URE rebuild-এর দিনে প্রথম ধরা না পড়ে। Linux md-তে root হিসেবে
/sys/block/md0/md/sync_action-এcheckলিখে শুরু হয়; অনেক distro এর জন্য একটি নির্ধারিত cron বা systemd timer রাখে। ZFS-এzpool scrub, hardware controller-এ সাধারণত “patrol read”.
৮ · Hardware বনাম software RAID, write hole আর ZFS RAID-Z
RAID কোথায় চলে
Hardware RAID
একটি আলাদা RAID controller কার্ড (নিজের প্রসেসর, নিজের cache, নিজের firmware) ডিস্কগুলো সামলায়; OS শুধু একটি বড় “ডিস্ক” দেখে। Parity-র হিসাব আর ছোট লেখা জমানো কার্ডই করে। দুর্বলতা: firmware একটি কালো বাক্স, আর কার্ড নষ্ট হলে প্রায়ই একই ধরনের কার্ড লাগে।
উদাহরণ: সার্ভারের RAID কার্ডSoftware RAID
OS-এর kernel নিজেই RAID চালায়; ডিস্কগুলো সাধারণ controller-এ। আধুনিক CPU-তে XOR আর RAID 6-এর হিসাব সামান্য খরচ। লাভ: স্বচ্ছ, বিনামূল্যে, যেকোনো মেশিনে ডিস্ক সরিয়ে আবার জোড়া যায়। Linux-এ md driver আর তার টুল mdadm; Windows-এ Storage Spaces (mirror, parity); macOS-এর Disk Utility-তে RAID 0 আর RAID 1 সেট।
উদাহরণ: mdadm, Storage Spaces, ZFSমাদারবোর্ডের firmware RAID (“fake RAID”)-এ আসল কাজ OS-এর driver-ই করে। Linux-এ একটি software RAID 5 তৈরি আর পর্যবেক্ষণ দেখতে এমন (root লাগে, আর /dev/sdb…/dev/sde-এর সব ডেটা মুছে যাবে — তাই এখানে চালানো যায় না, শুধু নমুনা):
# ৪টি ডিস্ক দিয়ে RAID 5 (ডিফল্ট chunk 512K, layout left-symmetric)
$ sudo mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# পরে একটি ডিস্ক নষ্ট হয়েছে (sdd বাদ গেছে), নতুন sde যোগ করে rebuild চলছে:
$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2](F) sdc[1] sdb[0]
11720661504 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UU_U]
[==>..................] recovery = 12.6% (493123456/3906887168) finish=301.4min speed=188762K/sec
bitmap: 0/30 pages [0KB], 65536KB chunk
$ sudo mdadm --detail /dev/md0 # অবস্থা, কোন ডিস্ক faulty, rebuild কত দূর
$ sudo mdadm /dev/md0 --remove /dev/sdd # নষ্ট ডিস্ক অ্যারে থেকে বাদলাইনগুলো পড়তে শিখুন: [4/3] মানে ৪টি ডিস্কের অ্যারে, সক্রিয় ৩টি; [UU_U]-এ প্রতিটি অবস্থানের অবস্থা — U সুস্থ, _ নেই বা rebuild চলছে; (F) মানে faulty. algorithm 2 হলো left-symmetric layout. ব্লক-সংখ্যা: প্রতিটি সদস্যের 3906887168 KiB × ৩টি ডেটা-ডিস্ক = 11720661504 — RAID 5-এর (N − ১) × S. finish=301.4min: বাকি অংশ ÷ বর্তমান গতি, প্রায় পাঁচ ঘণ্টা। bitmap হলো write-intent bitmap: কোন অঞ্চলে লেখা চলছিল তার হিসাব, যাতে হঠাৎ বন্ধ হওয়ার পর পুরো অ্যারে নয়, শুধু সেই অঞ্চলগুলো আবার মেলাতে হয়।
Write hole — অর্ধেক লেখা stripe
অংশ ৫-এর stepper-এর ধাপ ৫ মনে করুন: নতুন D1 লেখা হয়ে গেছে, নতুন P তখনো নয়। ঠিক তখন বিদ্যুৎ গেলে ডিস্কে stripe অসংগত — D0 ⊕ D1′ ⊕ D2 ≠ P. সমস্যাটি তখনই ধরা পড়ে না; পরে কোনো একদিন একটি ডিস্ক নষ্ট হলে rebuild এই ভুল P দিয়ে একটি অন্য ব্লক “ফেরত” বানায় — ভুল ডেটা, কোনো সতর্কবার্তা ছাড়াই। এটিই write hole. পর্ব ৪৪-এর crash consistency সমস্যার RAID-সংস্করণ: একাধিক ডিস্কে লেখা একসাথে atomic হয় না।
প্রতিকার কয়েক রকম:
- Battery- বা flash-backed write cache: hardware controller লেখাগুলো আগে নিজের cache-এ রাখে; বিদ্যুৎ গেলে একটি ব্যাটারি বা supercapacitor সেই cache বাঁচিয়ে রাখে (বা flash-এ ঢেলে দেয়), আর বিদ্যুৎ ফিরলে অসমাপ্ত লেখাগুলো শেষ করে। ব্যাটারি দুর্বল হলে ভালো controller নিজে থেকেই write-back cache বন্ধ করে ধীর-কিন্তু-নিরাপদ write-through-এ চলে যায়।
- Journal: Linux md-তে RAID 4/5/6-এর জন্য একটি আলাদা দ্রুত ডিস্কে write journal, অথবা partial parity log (PPL) রাখার ব্যবস্থা আছে (Linux ৪.x সংস্করণগুলোর সময় যোগ হয়েছে) — পর্ব ৪৪-এর journaling-এর একই ধারণা।
- কখনো জায়গায় না লেখা: ZFS-এর পথ — নিচে।
ZFS RAID-Z — RAID file system-এর ভেতরে
Sun Microsystems-এ Jeff Bonwick আর Matthew Ahrens-এর নেতৃত্বে তৈরি ZFS (২০০৫ সালে OpenSolaris-এ প্রকাশ; আজ OpenZFS প্রকল্প Linux, FreeBSD-সহ বিভিন্ন OS-এ) volume manager, RAID আর file system একসাথে মেলায়। তার RAID-Z (একটি parity-র RAID-Z1, দুটির Z2, তিনটির Z3) RAID 5/6-এর দুটি দুর্বলতা দূর করে:
- Write hole নেই: ZFS copy-on-write (পর্ব ৪৪), আর RAID-Z-এর stripe-এর প্রস্থ পরিবর্তনশীল — প্রতিটি লেখা নতুন জায়গায় নিজেই একটি পূর্ণ stripe, নিজের parity-সহ। তাই read-modify-write নেই; নতুন লেখা শেষ না হলে পুরোনো সংস্করণই বৈধ।
- প্রতিটি ব্লকের checksum: সাধারণ RAID শুধু জানে কোন ডিস্ক নষ্ট; একটি ডিস্ক যদি চুপচাপ ভুল ডেটা ফেরত দেয় (silent data corruption — firmware বাগ, ভুল জায়গায় লেখা), RAID 5 জানতেই পারে না কোন ব্লকটি ভুল। ZFS প্রতিটি ব্লকের checksum তার parent pointer-এ রাখে; পড়ার সময় না মিললে parity বা mirror থেকে সঠিক কপি বানায় আর ভুলটি মেরামত করে দেয় (self-healing).
- Resilver শুধু ব্যবহৃত ডেটার: file system জানে কোন ব্লক সত্যিই ব্যবহৃত, তাই অর্ধেক-ভরা pool-এর rebuild পুরো ডিস্ক পড়ার চেয়ে কম সময় নেয়।
দাম: RAID-Z-এ ছোট random পড়ায় প্রায়ই একটি গোটা stripe লাগে, তাই random-পড়া-ভারী কাজে ZFS-এর mirror বেশি দ্রুত; আর pool-এর গঠন পরে বদলানো তুলনামূলক কঠিন। Btrfs-এরও নিজস্ব RAID আছে, তবে তার RAID 5/6 নিয়ে Btrfs-এর নিজের ডকুমেন্টেশন বহু বছর ধরে সতর্ক করে আসছে — ব্যবহারের আগে বর্তমান অবস্থা দেখে নিন।
আরও গভীরে: Linux-এর RAID 6 কোড বুট হওয়ার সময় কয়েকটি বাস্তবায়ন (সাধারণ C, SSE2, AVX2, AVX-512, ARM-এর NEON ইত্যাদি) মেপে সবচেয়ে দ্রুতটি বেছে নেয় — dmesg-এ “raid6: using algorithm …” ধরনের লাইন দেখা যায়। Q-এর হিসাবে GF(28)-এ ২ দিয়ে গুণ আসলে একটি shift আর শর্তসাপেক্ষ XOR, তাই SIMD-তে একসাথে অনেক byte করা যায়। বড় pool-এর দীর্ঘ resilver কমাতে OpenZFS ২.১ dRAID এনেছে, যেখানে spare-এর জায়গা সব ডিস্কে ছড়ানো থাকে, ফলে rebuild-এ একটি নয়, সব ডিস্ক একসাথে লেখে।
৯ · RAID backup নয় — ৩-২-১, snapshot, erasure coding আর SSD
এই পর্বের সবচেয়ে গুরুত্বপূর্ণ বাক্য: RAID রক্ষা করে ডিস্কের ব্যর্থতা থেকে, ডেটার ভুল থেকে নয়। RAID-এর কাজ সব কপিকে সবসময় একই রাখা। তাই যা কিছু “বৈধ লেখা” হিসেবে আসে — একটি ভুল rm -rf, একটি অ্যাপের বাগে নষ্ট হওয়া database, ransomware-এর এনক্রিপ্ট করা ফাইল — RAID তা মুহূর্তেই সব ডিস্কে নিখুঁতভাবে ছড়িয়ে দেয়। চুরি, আগুন বা বন্যায় পুরো সার্ভার গেলে RAID কিছুই করতে পারে না।
অফিসের ফাইল ক্যাবিনেটে প্রতিটি ফাইলের দুটি কপি একই ড্রয়ারে রাখলে একটি কপি ছিঁড়ে গেলে অন্যটি আছে — এটি RAID. কিন্তু কেউ ভুল করে একটি চিঠি দুই কপিতেই কেটে দিলে, বা ক্যাবিনেটসহ ঘরে আগুন লাগলে, দুই কপিই শেষ। Backup হলো অন্য ভবনে, আলাদা তালাবদ্ধ আলমারিতে, গত সপ্তাহের তারিখ লেখা একটি কপি।
৩-২-১ নিয়ম
৩টি কপি (আসল + ২টি backup), ২টি ভিন্ন মাধ্যমে (যেমন ডিস্ক-অ্যারে আর টেপ বা ক্লাউড object storage), ১টি অন্য জায়গায় (offsite). এই ৩-২-১ নিয়মের জনপ্রিয়তার কৃতিত্ব সাধারণত আলোকচিত্রী Peter Krogh-কে দেওয়া হয়। আজ অনেকে যোগ করেন: অন্তত একটি কপি অফলাইন বা বদলানো-যায়-না (immutable), আর restore পরীক্ষায় শূন্য ত্রুটি।
Snapshot বনাম backup
ZFS, Btrfs, LVM বা Windows-এর Volume Shadow Copy একটি মুহূর্তের snapshot নিতে পারে — copy-on-write-এর কারণে প্রায় সঙ্গে সঙ্গে আর প্রায় বিনা খরচে। ভুল করে মোছা ফাইল ফেরত আনতে চমৎকার, কিন্তু snapshot একই pool-এ থাকে: pool নষ্ট হলে, বা কেউ admin অধিকার পেয়ে snapshot মুছে দিলে, সেটিও যায়। Snapshot-কে অন্য মেশিনে পাঠালে (যেমন ZFS-এর zfs send) তবেই তা backup-এর অংশ হয়।
Ransomware-প্রতিরোধী backup (প্রতিরক্ষার দিক)
- অফলাইন বা air-gapped কপি: যে ডিস্ক বা টেপ backup শেষে খুলে রাখা হয়, ভাইরাস নেটওয়ার্ক দিয়ে সেটিতে পৌঁছাতে পারে না।
- Immutable storage: ক্লাউড object storage-এর “object lock” বা WORM (write once, read many) সুবিধায় নির্দিষ্ট সময় পর্যন্ত কপি মোছা বা বদলানো যায় না — admin-এর চুরি হওয়া পাসওয়ার্ড দিয়েও না।
- আলাদা লগইন: backup সিস্টেমের লগইন মূল সার্ভার থেকে আলাদা, multi-factor authentication-সহ।
- Restore-এর মহড়া: যে backup থেকে কখনো ফেরত আনা হয়নি, সেটি আছে কি না জানা নেই। নিয়মিত একটি এলোমেলো ফাইল আর পুরো সিস্টেম ফেরত এনে দেখা।
Database-এর বেলায় এই প্রশ্নগুলো — full আর incremental backup, point-in-time recovery, replication-এর ধরন — বিস্তারিত আছে DBMS কোর্সের backup আর replication পর্বে।
Replication আর erasure coding — ডেটা সেন্টারের মাপে RAID
একটি মেশিনের ভেতরের RAID পুরো মেশিন, র্যাক বা ডেটা সেন্টার হারানো সামলায় না। বড় distributed storage (পর্ব ৫৩) তাই একই ধারণা মেশিনের স্তরে নেয়:
- Replication: প্রতিটি ব্লকের ৩টি কপি তিনটি আলাদা মেশিনে (প্রায়ই আলাদা র্যাকে) — HDFS-এর ঐতিহ্যগত ডিফল্ট। ২টি হারানো সয়, কিন্তু খরচ ৩ গুণ জায়গা। মনে রাখুন, replication ভুল মুছে ফেলাকেও সাথে সাথে কপি করে — এটিও backup নয়।
- Erasure coding: RAID 6-এর সাধারণ রূপ। ডেটাকে k টুকরো করে m টি Reed–Solomon হিসাব-টুকরো যোগ, k + m টুকরো k + m টি আলাদা মেশিনে; যেকোনো k টি থাকলেই সব ফেরত। যেমন ১০ + ৪: যেকোনো ৪টি হারানো সয়, আর জায়গা লাগে ১৪ ÷ ১০ = ১.৪ গুণ — ৩-কপির replication-এর ৩ গুণের অর্ধেকেরও কম। Facebook-এর f4 warm-storage-এর গবেষণাপত্রে RS(১০, ৪)-এর কথা আছে, আর HDFS ৩ থেকে erasure coding যোগ হয়েছে। দাম: একটি টুকরো ফেরত আনতে k টি মেশিন থেকে পড়তে হয়।
SSD-র বিশেষ দিক
- Correlated failure-এর নতুন রূপ: RAID 1-এ দুটি একই মডেলের SSD হুবহু একই লেখা পায়, তাই flash-এর ক্ষয় (wear) দুটিতেই প্রায় সমান গতিতে বাড়ে — দুটি কাছাকাছি সময়ে আয়ু শেষ করতে পারে। আর firmware বাগ একই মডেলের সব ড্রাইভকে একসাথে আঘাত করে — ২০১৯ সালে একটি বড় সার্ভার-নির্মাতা কিছু enterprise SAS SSD নির্দিষ্ট ঘণ্টা চলার পর অকেজো হওয়ার বাগ নিয়ে সতর্ক করেছিল। প্রতিকার: firmware হালনাগাদ, ভিন্ন ব্যাচ বা মডেল মেশানো, আর SMART-এর wear-সূচক দেখা।
- TRIM: file system মুছে ফেলা ব্লকের খবর SSD-কে দেয়, যাতে SSD-র ভেতরের garbage collection সহজ হয় (পর্ব ৪০)। RAID স্তর এই খবর নিচের ডিস্কে পাঠায় কি না, তা implementation-নির্ভর — যেমন Linux md RAID 0/1/10-এ discard পাঠায়, কিন্তু RAID 4/5/6-এ শুধু তখনই, যখন নিরাপদ বলে আলাদাভাবে চালু করা হয় (
raid456module-এরdevices_handle_discard_safely). নিজের সেটআপেlsblk --discardদিয়ে দেখে নিন।
১০ · AI-এর যুগে RAID আর স্টোরেজ
স্টোরেজের প্রশ্নে AI-এর একটি ভুল উত্তর মানে ডেটা হারানো। বারবার দেখা ভুলগুলো:
| AI-এর ভুল | কেন ভুল | কীভাবে যাচাই করবেন |
|---|---|---|
| “RAID 1 আছে, backup লাগবে না” | Mirror ভুল মুছে ফেলা আর ransomware দুই কপিতেই লেখে | ৩-২-১ নিয়ম; নিজে একটি restore করে দেখুন |
| RAID 5-এর ধারণক্ষমতা N × S বা N/২ × S বলা | সঠিক (N − ১) × S | এই পর্বের calculator |
| MTTDL-এর সংখ্যা ভুল (যেমন সূত্রে ২ বা MTTR বাদ) | MTTF² ÷ (২ × MTTR); ঘণ্টা থেকে বছরে ভাগ ৮,৭৬০ | হাতে আবার হিসাব; calculator-এ মেলান |
| “RAID 01 আর 10 একই” | দ্বিতীয় ব্যর্থতায় টেকার সম্ভাবনা আলাদা (৪ ডিস্কে ২/৩ বনাম ১/৩) | এই পর্বের enumerator |
ভুল ডিস্কে mdadm --create বা --zero-superblock | নাম এক মেশিন থেকে আরেকটিতে বদলায় (/dev/sdb আজ এক ডিস্ক, কাল অন্য) | lsblk -o NAME,SIZE,MODEL,SERIAL দিয়ে serial মিলিয়ে নিন; আগে backup |
| Windows বা macOS প্রশ্নে Linux কমান্ড, বা পুরোনো kernel-এর তথ্য | প্রতিটি OS-এর RAID টুল আলাদা, আর সুবিধাগুলো version-ভেদে বদলায় | OS আর version উল্লেখ করে প্রশ্ন; অফিসিয়াল ডকুমেন্টেশন |
পরিকল্পনা চাওয়ার সময় সব তথ্য দিন, আর হিসাব আলাদা করে চান:
AI-এর উত্তর মানার আগে — চেকলিস্ট
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- N টি S আকারের ডিস্কে RAID 5 আর RAID 6-এর ব্যবহারযোগ্য জায়গা? — (N − ১) × S আর (N − ২) × S; RAID 10-এ N/২ × S.
- RAID 5-এ একটি ছোট লেখায় কয়টি I/O, কেন? — ৪টি: পুরোনো ডেটা আর parity পড়া, নতুন ডেটা আর parity লেখা; P′ = P ⊕ Dপুরোনো ⊕ Dনতুন.
- Mirror-এর MTTDL-এর সূত্র? — MTTF² ÷ (২ × MTTR); ১,০০,০০০ ঘণ্টা আর ১০ ঘণ্টায় ৫ × ১০৮ ঘণ্টা, প্রায় ৫৭,০৭৮ বছর।
- RAID 10 কেন RAID 01-এর চেয়ে ভালো? — প্রথম ব্যর্থতায় 01 পুরো stripe হারায়; ৪ ডিস্কে দ্বিতীয় ব্যর্থতা সয় ২/৩ বনাম ১/৩, আর rebuild-ও ছোট।
- RAID কি backup? — না; ডিস্ক-ব্যর্থতা সামলায়, ভুল মুছে ফেলা, ransomware বা আগুন নয়। ৩-২-১ নিয়ম লাগে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১১৯৮৮ সালের “সস্তা ডিস্কের অ্যারে” ধারণাটি কেন বিশাল দামি ডিস্কের জগৎকে হারিয়ে দিল? আর নামের “Inexpensive” কেন পরে “Independent” হয়ে গেল?
১৯৮০-এর দশকে বড় কম্পিউটারের স্টোরেজ মানে ছিল বিশাল, ফ্রিজ-আকারের ডিস্ক-ইউনিট, যা মেইনফ্রেম-নির্মাতারা নিজেরাই বানাতেন আর খুব বেশি দামে বিক্রি করতেন। একই সময়ে PC-র বাজারের বিপুল উৎপাদনে ছোট ৫.২৫ ও ৩.৫ ইঞ্চি ডিস্ক প্রতি মেগাবাইটে সস্তা হয়ে উঠছিল। Patterson, Gibson আর Katz-এর মূল পর্যবেক্ষণ ছিল অর্থনৈতিক: CPU আর মেমরির গতি যত দ্রুত বাড়ছে, একক ডিস্কের গতি তত দ্রুত বাড়ছে না, তাই I/O ক্রমেই কম্পিউটারের দুর্বলতম অংশ হয়ে উঠছে। একটি বড় ডিস্কের একটি হেডের বদলে অনেক ছোট ডিস্কের অনেক হেড — সমান্তরালভাবে কাজ।
কিন্তু তাঁরা সমস্যাটিও স্পষ্ট দেখিয়েছিলেন: অংশ ১-এর MTTF ÷ N. ছোট ডিস্কগুলোর নির্ভরযোগ্যতা একটি বড় ডিস্কের চেয়ে কম না হলেও, অনেকগুলো একসাথে জুড়লে অ্যারে অগ্রহণযোগ্য রকম ঘন ঘন ব্যর্থ হবে। গবেষণাপত্রের আসল অবদান তাই শুধু “অনেক ডিস্ক” নয়, বরং redundancy-র একটি পদ্ধতিগত শ্রেণিবিন্যাস — mirroring থেকে Hamming code, একক parity আর ছড়ানো parity — আর প্রতিটির জন্য ধারণক্ষমতা, গতি আর MTTDL-এর হিসাব। শিল্প-জগৎ সেই “লেভেল” নম্বরগুলো আজও ব্যবহার করে।
বাণিজ্যিক RAID দ্রুত ছড়ায়, আর নির্মাতারা দামি পণ্যে “সস্তা ডিস্ক” লেবেলে অস্বস্তি বোধ করায় ১৯৯০-এর দশকে শিল্প-সংগঠনগুলো “Independent” শব্দটি জনপ্রিয় করে। শব্দবদলের পেছনে একটি সত্যও আছে: RAID-এর গণিত দামের ওপর নয়, ব্যর্থতাগুলো স্বাধীন হওয়ার ওপর দাঁড়িয়ে। আজকের ক্লাউডের দর্শনও একই: অসংখ্য সস্তা যন্ত্র, আর সফটওয়্যারে redundancy.
মূল উপলব্ধি: RAID-এর জয় ছিল অর্থনীতি আর সম্ভাবনার মিলন — সস্তা অংশ দিয়ে দামি নির্ভরযোগ্যতা, শর্ত একটিই: redundancy-র হিসাব সঠিক হতে হবে।
প্র ০২MTTDL-এর সূত্র ধরে নেয় ডিস্কগুলো স্বাধীনভাবে নষ্ট হয়। বাস্তবে এই অনুমান কোথায় ভাঙে, আর তাতে “৫৭ হাজার বছর”-এর কী হয়?
সূত্রের দ্বিতীয় ধাপে আমরা বলেছিলাম, প্রথম ডিস্ক নষ্ট হওয়ার পর MTTR সময়ে দ্বিতীয়টি নষ্ট হওয়ার সম্ভাবনা MTTR/MTTF — অর্থাৎ প্রথমটির ব্যর্থতা দ্বিতীয়টি সম্পর্কে কিছুই বলে না। কিন্তু একটি সার্ভারের দুটি ডিস্ক প্রায়ই একই ব্যাচের, একই তাপমাত্রা আর বিদ্যুৎ-সরবরাহে চলে, আর mirror-এ একদম একই লেখা পায়। একটি যদি কোনো উৎপাদন-ত্রুটিতে নষ্ট হয়, অন্যটিতেও সেই ত্রুটি থাকার সম্ভাবনা বেশি। একটি বিদ্যুৎ-স্পাইক বা অতিরিক্ত গরম সবাইকে একসাথে আঘাত করে।
তার ওপর rebuild নিজেই একটি চাপ-পরীক্ষা: সুস্থ ডিস্কগুলোকে ঘণ্টার পর ঘণ্টা পুরো গতিতে পড়তে হয়, যা হয়তো তারা মাসের পর মাস করেনি; দুর্বল ডিস্ক ঠিক তখনই ভেঙে পড়ে। Schroeder ও Gibson ২০০৭ সালের মাঠ-গবেষণায় দেখান, একটি বদলের পর অল্প সময়ের মধ্যে আরেকটি বদলের সম্ভাবনা স্বাধীন মডেলের প্রত্যাশার চেয়ে বেশি — ব্যর্থতা গুচ্ছ বেঁধে আসে। ফলে MTTDL-এর আসল মান সূত্রের চেয়ে অনেক কম হতে পারে।
SSD-র যুগে firmware বাগও যোগ হয়েছে: একই মডেলের সব ড্রাইভ একই কোড চালায়, তাই একটি সময়-গোনার বাগ সবগুলোকে প্রায় একই ঘণ্টায় অকেজো করতে পারে (অংশ ৯-এর ২০১৯ সালের সতর্কবার্তা) — mirror তখন প্রায় কোনো সুরক্ষা দেয় না।
তাই প্রকৌশলীরা ভিন্ন ব্যাচের ডিস্ক মেশান, hot spare দিয়ে MTTR কমান, RAID 6 নেন, আর RAID-এর বাইরে আলাদা backup রাখেন — সবচেয়ে বড় correlated ঘটনা (আগুন, চুরি, ভুল কমান্ড) কোনো সূত্রে ধরা পড়ে না।
মূল উপলব্ধি: নির্ভরযোগ্যতার সূত্র ঠিক ততটাই ভালো, যতটা তার অনুমান; বাস্তবে ব্যর্থতা একসাথে আসে, তাই নকশায় বৈচিত্র্য আর সম্পূর্ণ আলাদা কপি রাখতে হয়।
প্র ০৩“RAID 5 is dead” — ২০০৭ সালের এই সতর্কবাণী কতটা সঠিক প্রমাণিত হলো? সংখ্যাগুলো কী বলে, আর কী বলে না?
Robin Harris-এর যুক্তি ছিল সরল পাটিগণিত: ডিস্কের আকার প্রতি কয়েক বছরে দ্বিগুণ হচ্ছে, কিন্তু datasheet-এর URE হার (১০১৪ বিটে একটি) একই জায়গায় দাঁড়িয়ে। Rebuild-এ পড়তে হয় বাকি সব ডিস্কের পুরোটা, তাই প্রত্যাশিত URE-এর সংখ্যা ডিস্কের আকারের সাথে বাড়ে। এই পর্বের calculator-এ ৬টি ৪ TB ডিস্কেই প্রত্যাশিত URE ১.৬০, একটিও না হওয়ার সম্ভাবনা ২০.২%. ১২ বা ২০ TB ডিস্কে এই সম্ভাবনা আরও অনেক কমে যায়। তাঁর ভবিষ্যদ্বাণী: একসময় সাধারণ RAID 5-এর rebuild প্রায় নিশ্চিতভাবে ব্যর্থ হবে।
কতটা সত্য হলো? দিকটা সঠিক ছিল — শিল্প-জগৎ সত্যিই বড় HDD অ্যারেতে single-parity থেকে সরে এসেছে। বহু storage নির্মাতা বড় ডিস্কে RAID 6 বা তার সমতুল্যকে ডিফল্ট বা সুপারিশ করেন, ZFS ব্যবহারকারীরা RAID-Z2/Z3 নেন, আর বড় ক্লাউড সিস্টেম erasure coding-এ বহু parity রাখে। কিন্তু “প্রায় নিশ্চিত ব্যর্থতা” বাস্তবে দেখা যায়নি, কারণ সংখ্যাগুলোর পেছনে কয়েকটি সূক্ষ্মতা আছে। প্রথমত, ১০১৪ একটি স্পেসিফিকেশন-সীমা; মাপা হার অনেক ক্ষেত্রেই অনেক ভালো। দ্বিতীয়ত, ভালো software একটি URE-কে পুরো অ্যারের নয়, একটি ফাইলের ক্ষতি হিসেবে সামলায় (অংশ ৭)। তৃতীয়ত, নিয়মিত scrubbing লুকানো খারাপ sector আগেভাগে ঠিক করে।
আবার উল্টো দিকে, URE-ই একমাত্র ঝুঁকি নয় — বড় ডিস্কের দীর্ঘ rebuild-এ (অংশ ৭-এ ১৬ TB-তে প্রায় ২২ ঘণ্টা থেকে চার দিন) দ্বিতীয় ডিস্ক পুরোপুরি নষ্ট হওয়ার জানালাও বড়, আর correlated failure সেই ঝুঁকি আরও বাড়ায়।
মূল উপলব্ধি: একটি সতর্ক “worst-case” হিসাব ভবিষ্যদ্বাণী হিসেবে অতিরঞ্জিত হলেও নকশার দিক ঠিক করে দিতে পারে — প্রশ্ন হওয়া উচিত “rebuild চলার সময় আমার আর কতটা সুরক্ষা বাকি থাকে?”
প্র ০৪ZFS RAID-কে file system-এর ভেতরে ঢুকিয়েছে — একে কেউ কেউ স্তরভাঙা নকশা বলেছেন। এই বিতর্কে কোন পক্ষের যুক্তি কী?
প্রথাগত নকশায় স্তরগুলো আলাদা: নিচে ডিস্ক, তার ওপর RAID (hardware বা md), তার ওপর volume manager (যেমন LVM), সবার ওপরে file system. প্রতিটি স্তর ওপরের স্তরকে একটি সরল “ব্লক ডিভাইস” দেখায় — যেকোনো file system যেকোনো RAID-এর ওপর চলে। পর্ব ৬-এর OS-এর গঠনের আলোচনার মতোই এটি modularity-র যুক্তি। ZFS প্রকাশের পর একজন পরিচিত Linux kernel রক্ষণাবেক্ষণকারী একে “rampant layering violation” বলেছিলেন বলে প্রায়ই উদ্ধৃত হয়, আর ZFS-এর স্রষ্টা Jeff Bonwick একই প্রশ্ন শিরোনাম করে ব্লগে জবাব দেন।
ZFS-এর পক্ষের যুক্তি: স্তরগুলোর মাঝখানের সরল ইন্টারফেসটিই সমস্যার উৎস। RAID জানে না কোন ব্লক ব্যবহৃত, তাই rebuild-এ ফাঁকা অংশও পড়ে। RAID জানে না কোন ব্লকটি “সঠিক”, শুধু জানে কোন ডিস্ক সাড়া দিচ্ছে না — তাই চুপচাপ ভুল ডেটা ফেরত দেওয়া ডিস্ক ধরতে পারে না। file system জানে না কোন লেখা stripe-এর অর্ধেক, তাই write hole তৈরি হয়। ZFS সব তথ্য এক জায়গায় রেখে তিনটি সমস্যাই সমাধান করে: প্রতিটি ব্লকের checksum তার parent-এ, copy-on-write-এ পূর্ণ-stripe লেখা, আর শুধু ব্যবহৃত ব্লকের resilver. অংশ ৪-এর WAFL-ও একই যুক্তির উদাহরণ।
বিপক্ষের উদ্বেগও ভিত্তিহীন নয়: একটি বিশাল, জটিল কোডভিত্তি; RAM-এর চাহিদা; আর pool-এর গঠন পরে বদলানো তুলনামূলক কঠিন। Linux-এ আরেকটি বাস্তব বাধা লাইসেন্স — OpenZFS-এর CDDL লাইসেন্স আর kernel-এর GPLv2-এর সামঞ্জস্য নিয়ে মতভেদের কারণে ZFS মূল kernel-এর অংশ নয়, আলাদা module হিসেবে আসে।
মূল উপলব্ধি: স্তর ভাগ করা সাধারণত ভালো, কিন্তু যখন সঠিকতার জন্য দরকারি তথ্য স্তরের সীমানায় হারিয়ে যায়, তখন সীমানা নতুন করে আঁকাই ভালো প্রকৌশল হতে পারে।
প্র ০৫একটি প্রতিষ্ঠানের RAID, replication আর snapshot — সবই ছিল, তবু ডেটা হারাল। এটা কীভাবে সম্ভব, আর বাস্তবের ঘটনা থেকে কী শেখা যায়?
২০১৭ সালের জানুয়ারিতে কোড-হোস্টিং সেবা GitLab.com-এ একটি ঘটনা ঘটে, যা কোম্পানিটি নিজেই খোলাখুলি লিখে প্রকাশ করেছিল। Database replication-এর একটি সমস্যা সারাতে গিয়ে একজন প্রকৌশলী ক্লান্ত অবস্থায় ভুল সার্ভারে — replica-র বদলে primary-তে — ডেটা-ডিরেক্টরি মোছার কমান্ড চালান। এরপর ধরা পড়ে, কয়েকটি backup ব্যবস্থার প্রায় কোনোটিই প্রত্যাশামতো কাজ করছিল না। শেষে কয়েক ঘণ্টা আগের একটি সুযোগবশত নেওয়া snapshot থেকে ফেরত আনা হয়, আর সেই কয়েক ঘণ্টার কিছু ডেটা স্থায়ীভাবে হারায়।
এই পর্বের ভাষায়: RAID একটি বৈধ মোছার কমান্ড বিশ্বস্তভাবে সব ডিস্কে লিখে দেয়। Replication একই কাজ করে আরেক মেশিনে: primary-র যেকোনো বদল replica-তে যায়, ভুলসহ। Snapshot একই সিস্টেমে থাকলে সেটি একই কমান্ড, একই admin বা একই ransomware-এর নাগালে। একমাত্র যে জিনিস ভুলের বিরুদ্ধে রক্ষা করে, তা হলো সময়ে পিছিয়ে থাকা, আলাদা জায়গায় রাখা, আর পরীক্ষা করা একটি কপি — যা ৩-২-১ নিয়ম চায়। আর “পরীক্ষা করা” শব্দটি এখানে মূল: backup চালানো আর backup থেকে ফেরত আনতে পারা এক জিনিস নয়।
প্রতিষ্ঠানগুলো দুটি মাপ ব্যবহার করে: RPO (কতটা সময়ের ডেটা হারানো সহ্য করা যায়) আর RTO (কত দ্রুত সেবা ফিরতে হবে)। RAID আর replication RTO কমায় — ডিস্ক বা সার্ভার গেলে সেবা চলতে থাকে। কিন্তু RPO-র নিশ্চয়তা আসে শুধু আলাদা, সংস্করণযুক্ত backup থেকে। ব্যাংকের মতো প্রতিষ্ঠান তাই সাধারণত আলাদা একটি disaster recovery সাইটও রাখে; নিখুঁত শর্ত নিজের ক্ষেত্রের নিয়ন্ত্রক নির্দেশনায় দেখে নিতে হয়।
মূল উপলব্ধি: redundancy ব্যর্থতা থেকে বাঁচায়, ভুল থেকে বাঁচায় না; ভুল থেকে বাঁচায় শুধু আলাদা, পুরোনো, আর নিয়মিত restore করে পরীক্ষা করা কপি।
অনুশীলন
হাতে হিসাব, আউটপুট অনুমান আর কমান্ড — আগে নিজে চেষ্টা করুন, তারপর উত্তর মেলান।
-
হাতে হিসাব: ৮টি ২ TB ডিস্ক। (ক) RAID 0, 5, 6 আর 10-এ ব্যবহারযোগ্য জায়গা কত? (খ) প্রতিটি ডিস্কের MTTF ২,০০,০০০ ঘণ্টা আর MTTR ২৪ ঘণ্টা হলে RAID 5-এর MTTDL কত বছর? (গ) RAID 5 rebuild-এ ১০১৪ URE হার ধরলে একটিও পড়ার ত্রুটি না হওয়ার সম্ভাবনা কত?
(ক) RAID 0: ৮ × ২ = ১৬ TB; RAID 5: ৭ × ২ = ১৪ TB; RAID 6: ৬ × ২ = ১২ TB; RAID 10: ৪ × ২ = ৮ TB.
(খ) MTTF² = (২ × ১০৫)² = ৪ × ১০১০; N(N − ১) × MTTR = ৮ × ৭ × ২৪ = ১,৩৪৪; MTTDL = ৪ × ১০১০ ÷ ১,৩৪৪ ≈ ২.৯৮ × ১০৭ ঘণ্টা ÷ ৮,৭৬০ ≈ ৩,৩৯৭ বছর (scratch script-এ যাচাই: ২,৯৭,৬১,৯০৪.৮ ঘণ্টা)। একই তথ্যে RAID 6-এর সূত্র দেয় প্রায় ৪৭ লাখ বছর — কিন্তু দুটিই independence ধরে নেওয়া আশাবাদী সংখ্যা।
(গ) পড়তে হবে বাকি ৭টির ১৪ TB = ১.১২ × ১০১৪ বিট; প্রত্যাশিত URE ১.১২; সম্ভাবনা e−১.১২ ≈ ৩২.৬% (calculator-এ
N = 8, S = 2বসালে একই)। স্পেসিফিকেশনের সবচেয়ে খারাপ হার, তাই হতাশাবাদী সীমা। -
হাতে trace — XOR: একটি RAID 5 stripe-এ D0 = 11001010, D2 = 01010110, P = 10010011; D1-এর ডিস্ক নষ্ট। D1 কী ছিল? তারপর D1-এর জায়গায় নতুন মান 11110000 লিখতে read-modify-write-এ নতুন P′ কত হবে?
D0 ⊕ D2 = 10011100; ⊕ P = 10011100 ⊕ 10010011 = 00001111 = D1.
P′ = P ⊕ D1পুরোনো ⊕ D1নতুন = 10010011 ⊕ 00001111 ⊕ 11110000. প্রথম দুটি: 10011100; তার সাথে 11110000: 01101100. যাচাই: D0 ⊕ D1নতুন ⊕ D2 = 11001010 ⊕ 11110000 ⊕ 01010110 = 00111010 ⊕ 01010110 = 01101100 ✓.
-
আউটপুট অনুমান: RAID 5 simulator-এ শুধু
const failed = 2বদলেconst failed = 0করলে rebuild অংশের লাইনগুলো কী হবে? কোন লাইনে parity ব্লক ফেরত আসবে?disk0 FAILED - rebuilding from the other 3 disks stripe 0: XOR of survivors = 44 original D0:44 match stripe 1: XOR of survivors = 4b original D3:4b match stripe 2: XOR of survivors = 4d original D6:4d match stripe 3: XOR of survivors = 3c original P3:3c match 4/4 blocks rebuilt correctlydisk0-এর কলাম টেবিল থেকেই পড়া যায়: D0:44, D3:4b, D6:4d, P3:3c. Stripe 3-এ parity disk0-তে (
pd = 4 - 1 - 3 = 0), তাই শেষ লাইনে P3 ফেরত আসে। উদাহরণ: stripe 3-এ 52 ⊕ 4f ⊕ 21 = 3c. -
কমান্ড লিখুন: একটি Linux সার্ভারে
/dev/md0(RAID 5)-এর/dev/sdcডিস্কে SMART সতর্কবার্তা দেখা দিয়েছে; এখনো পুরো নষ্ট হয়নি। নিরাপদে ডিস্কটি বদলানোর ধাপগুলো কমান্ডসহ লিখুন (নতুন ডিস্ক/dev/sdf).একটি সম্ভাব্য ক্রম (root লাগে; আগে backup হালনাগাদ আছে কি না নিশ্চিত হোন):
cat /proc/mdstat # অ্যারে এখন [UUUU] কি না lsblk -o NAME,SIZE,MODEL,SERIAL # কোনটি সত্যিই sdc, serial লিখে রাখুন mdadm /dev/md0 --add /dev/sdf # নতুন ডিস্ক আগে spare হিসেবে mdadm /dev/md0 --replace /dev/sdc --with /dev/sdf # sdc থেকেই কপি, redundancy থাকে cat /proc/mdstat # recovery = ...% দেখুন, শেষ হওয়া পর্যন্ত অপেক্ষা mdadm /dev/md0 --remove /dev/sdc # replace শেষে sdc faulty হয়ে যায়, তারপর বাদ mdadm --detail /dev/md0 # সব active sync, State : cleanমূল বিষয়: আগে
--failকরে ডিস্ক সরালে অ্যারে degraded হয়ে যেত, আর rebuild-এর পুরো সময় কোনো redundancy থাকত না।--replace(mdadm ৩.৩ থেকে) পুরোনো ডিস্ক চালু রেখেই নতুনটিতে কপি করে। ডিস্কের নাম বুটের পর বদলাতে পারে — তাই serial মিলিয়ে নিন।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমRAID 5-এর একটি ডিস্ক নষ্ট হওয়া থেকে আবার পুরো সুরক্ষিত হওয়া পর্যন্ত ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- Controller ডিস্কটিকে faulty চিহ্নিত করে, অ্যারে degraded mode-এ যায়
- নষ্ট ডিস্কের ব্লক পড়তে হলে বাকিদের XOR করে উত্তর দেওয়া হয়
- Hot spare বা নতুন ডিস্ক অ্যারেতে যোগ হয়
- প্রতিটি stripe-এর হারানো ব্লক XOR দিয়ে বানিয়ে নতুন ডিস্কে লেখা হয়
- সব stripe শেষ হলে অ্যারে আবার optimal অবস্থায় ফেরে
৫টি ৪ TB ডিস্ক দিয়ে বানানো RAID 5 অ্যারের ব্যবহারযোগ্য ধারণক্ষমতা কত?
- ২০ TB
- ১০ TB
- ১৬ TB
- ১২ TB
RAID 5-এ একটি stripe-এর মাত্র একটি ডেটা-ব্লক বদলাতে (read-modify-write পদ্ধতিতে) মোট কয়টি ডিস্ক I/O লাগে?
- ১টি — শুধু নতুন ডেটা লেখা
- ৪টি — ২টি পড়া আর ২টি লেখা
- ২টি — ডেটা আর parity লেখা
- ৬টি — তিনটি পড়া আর তিনটি লেখা
একটি mirror জোড়ার প্রতিটি ডিস্কের MTTF ১,০০,০০০ ঘণ্টা আর MTTR ১০ ঘণ্টা। স্বাধীন ব্যর্থতা ধরে MTTDL ≈ MTTF² ÷ (২ × MTTR) সূত্রে উত্তর কত?
- ৫ × ১০৮ ঘণ্টা, প্রায় ৫৭ হাজার বছর
- ২,০০,০০০ ঘণ্টা, প্রায় ২৩ বছর
- ৫০,০০০ ঘণ্টা, প্রায় ৫.৭ বছর
- ১০৯ ঘণ্টা, প্রায় ১,১৪,০০০ বছর
৪টি ডিস্কের একটি RAID 10 আর একটি RAID 01-এ একটি করে ডিস্ক নষ্ট হয়েছে। বাকি তিনটির যেকোনো একটি সমান সম্ভাবনায় পরের বার নষ্ট হলে কোন অ্যারে কত সম্ভাবনায় টিকে থাকে?
- দুটিই ২/৩
- RAID 10 ১/৩, RAID 01 ২/৩
- দুটিই ০ — একটি ব্যর্থতার পর আর কোনোটিই সয় না
- RAID 10 ২/৩, RAID 01 ১/৩
একটি অফিসের ফাইল-সার্ভারে RAID 6 আছে। একদিন ransomware সব শেয়ার করা ফাইল এনক্রিপ্ট করে দিল। RAID 6 সম্পর্কে কোন কথাটি সঠিক?
- RAID 6-এর P আর Q থেকে পুরোনো ফাইল ফেরত আনা যায়
- দুটি ডিস্ক বদলে rebuild করলে ফাইলগুলো আগের অবস্থায় ফিরবে
- কোনো সাহায্য করবে না — এটি backup নয়; আলাদা, অফলাইন বা immutable backup থেকে ফেরত আনতে হবে
- RAID 6 এনক্রিপশন আটকে দেয়, কারণ দুটি parity মিলবে না
RAID 5-এর “write hole” কী, আর ZFS-এর RAID-Z কীভাবে এটি এড়ায়?
- ডিস্কের ফাঁকা অংশ; RAID-Z ফাঁকা অংশে শূন্য লেখে
- ডেটা আর parity-র লেখার মাঝে crash হলে stripe অসংগত থাকা; RAID-Z প্রতিটি লেখা নতুন জায়গায় পূর্ণ stripe হিসেবে লেখে
- Rebuild-এর সময় পড়ার ত্রুটি; RAID-Z দ্বিগুণ গতিতে পড়ে
- একটি parity ডিস্কে সব লেখা জমা হওয়া; RAID-Z parity ছড়িয়ে দেয়
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- সম্ভাবনা: N টি ডিস্কের প্রথম ব্যর্থতা ≈ MTTF ÷ N (১,০০,০০০ ঘণ্টায় ১০০টিতে ৪১.৭ দিন)। Mirror-এর MTTDL ≈ MTTF² ÷ (২ × MTTR) = ৫ × ১০৮ ঘণ্টা; RAID 5-এ MTTF² ÷ (N(N − ১) × MTTR). সব সূত্র স্বাধীন ব্যর্থতা ধরে — বাস্তবে আশাবাদী।
- কৌশল: striping গতি দেয়, mirroring আর XOR parity সুরক্ষা দেয়। হারানো ব্লক = বাকিদের XOR. RAID 2 ও 3 ঐতিহাসিক, RAID 4-এ parity ডিস্ক bottleneck.
- লেভেল: RAID 5 = (N − ১) × S, একটি ব্যর্থতা, ছোট লেখায় ৪ I/O; RAID 6 = (N − ২) × S, দুটি, ৬ I/O; RAID 10 = N/২ × S, ২ I/O, আর RAID 01-এর চেয়ে বেশি টেকে (৪ ডিস্কে ২/৩ বনাম ১/৩)।
- Rebuild: বাকি সব ডিস্ক পুরো পড়ে; বড় ডিস্কে ঘণ্টা থেকে দিন, আর URE-এর ঝুঁকি — তাই hot spare, scrubbing, RAID 6/RAID-Z2. Write hole ঠেকায় battery-backed cache, journal বা ZFS-এর copy-on-write ও checksum.
- RAID backup নয়: ৩-২-১ নিয়ম, একটি অফলাইন বা immutable কপি, নিয়মিত restore-মহড়া। Snapshot ও replication সাহায্য করে, কিন্তু একা যথেষ্ট নয়; বড় মাপে erasure coding (যেমন ১০ + ৪)।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৪৬ · Protection — domain, access matrix, ACL আর capabilityপরবর্তী পর্বকে কোন resource-এ কী করতে পারবে — OS-এর নিয়ম।
- অপারেটিং সিস্টেম · কোর্স হোম৬৪টি পর্বপুরো কোর্সের রোডম্যাপ — কোন পর্ব কখন।
- পর্ব ৪৪ · Crash consistency — fsck, journaling আর copy-on-write file systemপেছনে ফিরেWrite hole-এর আত্মীয় সমস্যা, আর ZFS-এর copy-on-write ও checksum.
- পর্ব ৪০ · ডিস্ক আর SSD — গঠন আর disk schedulingপেছনে ফিরেযে ডিস্কগুলো দিয়ে RAID বানানো হয়, তাদের ভেতরের গঠন।
- DBMS · Backup আর replicationডেটাবেসDatabase-এর full/incremental backup, point-in-time recovery আর replication.
- DBMS · RecoveryডেটাবেসCrash-এর পর database কীভাবে সুসংগত অবস্থায় ফেরে — write-ahead logging.