SSD Nodes Learn 🎉 VPS $4.99/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor

RAID 10 কী এবং কেন VPS সার্ভারে এটি ব্যবহার করা হয়

RAID 10 কীভাবে কাজ করে এবং কেন NVMe স্টোরেজের জন্য এটি সেরা তা জানুন। RAID 1, 5, 6 এর পার্থক্য, /proc/mdstat পড়ার নিয়ম এবং RAID যে ব্যাকআপ নয় তার বিস্তারিত ব্যাখ্যা এখানে দেখুন।

RAID 10 কী এবং কেন VPS হোস্ট এটি ব্যবহার করে

RAID 10 হলো এমন একটি স্টোরেজ লেআউট যা বেশিরভাগ VPS হোস্ট ভার্চুয়ালাইজড NVMe (non-volatile memory express) ড্রাইভের ক্ষেত্রে ব্যবহার করে। এটি প্রতিটি ড্রাইভকে একটি পার্টনার ড্রাইভের সাথে মিরর করে এবং তারপর সেই মিরর করা জোড়াগুলোর মধ্যে ডেটা স্ট্রাইপ করে। অ্যারে বন্ধ না করেই একটি ড্রাইভ নষ্ট হতে পারে এবং এর মেরামত প্রক্রিয়ায় পুরো সেটের অন্য সব ড্রাইভ পড়ার পরিবর্তে শুধুমাত্র টিকে থাকা পার্টনার ড্রাইভ থেকে সরাসরি কপি করা হয়।

RAID-এর পূর্ণরূপ হলো redundant array of independent disks। এর একটিই কাজ: কোনো ডিস্ক নষ্ট হলে বা পরিবর্তন করার সময় মেশিনটিকে সচল রাখা। এই কাজের মূল লক্ষ্য হলো availability বা প্রাপ্যতা, আর প্রাপ্যতা মানেই নিরাপত্তা নয়।

RAID আপনার রাইট অপারেশনগুলোকে প্রতিলিপি করে। rm -rf /srv হলো একটি রাইট অপারেশন। মিররের উভয় অংশই একই মিলিসেকেন্ডে ডিরেক্টরি মুছে ফেলে এবং এরপরও অ্যারে নিজেকে সুস্থ হিসেবে রিপোর্ট করে।

এই বাক্যটি মনে রাখুন। এই পৃষ্ঠার বাকি অংশে প্রতিটি লেভেল কী ধরনের বিপর্যয় সামলাতে পারে এবং প্রতিটি রাইট অপারেশনে এর খরচ কত তা আলোচনা করা হয়েছে। শেষ অংশগুলোতে আপনার নিজের মেশিনে অ্যারের স্ট্যাটাস দেখার কমান্ড এবং RAID যে বিপর্যয়গুলো কখনোই সামলাতে পারে না, তা নিয়ে আলোচনা করা হয়েছে।

হোস্টিং ক্রেতারা সাধারণত যে লেভেলগুলোর মুখোমুখি হন: 1, 5, 6 এবং 10

একটি প্ল্যান পেজে একটি সংখ্যা উল্লেখ থাকে এবং সেখানেই শেষ। এই সংখ্যাটি দুটি প্রশ্নের উত্তর দেয়: কয়টি ড্রাইভ নষ্ট হতে পারে এবং প্রতিটি রাইট অপারেশনের খরচ কত।

RAID 1 হলো একটি মিরর। দুটি ড্রাইভে একই ব্লক থাকে। প্রতিটি রাইট উভয় ড্রাইভেই যায়। যেকোনো ড্রাইভ থেকে রিড করা সম্ভব। একটি ড্রাইভ নষ্ট হলেও ডেটা হারায় না এবং মোট ধারণক্ষমতার অর্ধেক ব্যবহারযোগ্য থাকে। এতে কোনো প্যারিটি হিসাব করতে হয় না, তাই রাইট পাথটি সংক্ষিপ্ত।

RAID 5 হলো স্ট্রাইপিং, যেখানে প্রতি স্ট্রাইপে একটি প্যারিটি ব্লক থাকে। n সংখ্যক ড্রাইভ থাকলে আপনি n-1 সংখ্যক ড্রাইভের ধারণক্ষমতা পাবেন এবং অ্যারেটি ঠিক একটি ড্রাইভ নষ্ট হওয়া পর্যন্ত টিকে থাকতে পারে। প্যারিটি কোনো নির্দিষ্ট ড্রাইভে থাকে না। এটি সব ড্রাইভের মধ্যে ঘুরেফিরে থাকে, তাই প্রতিটি ড্রাইভেই ডেটা এবং প্যারিটি উভয়ই থাকে।

RAID 6 প্রতিটি স্ট্রাইপে দ্বিতীয় একটি স্বাধীন প্যারিটি ব্লক যোগ করে, যা সাধারণত P এবং Q হিসেবে লেখা হয়। এটি একসাথে দুটি ড্রাইভ নষ্ট হলেও টিকে থাকতে পারে। এটি শোনার চেয়েও বেশি গুরুত্বপূর্ণ, কারণ প্রথম ড্রাইভটি নষ্ট হওয়ার পর সেটি মেরামত করার সময় প্রায়ই দ্বিতীয় ড্রাইভটি নষ্ট হয়ে যায়।

RAID 10 হলো মিররের একটি স্ট্রাইপ। ড্রাইভগুলো জোড়ায় জোড়ায় মিরর করা থাকে এবং ডেটা সেই জোড়াগুলোর মধ্যে ছড়িয়ে দেওয়া হয়। ব্যবহারযোগ্য ধারণক্ষমতা মোট ধারণক্ষমতার অর্ধেক, যা RAID 1-এর মতোই, তবে এর সাথে স্ট্রাইপিংয়ের প্যারালালিজম যুক্ত থাকে।

আপনি এটিকে RAID 1+0 হিসেবেও লেখা দেখবেন, যা সঠিক বর্ণনা: প্রথমে মিরর, তারপর মিররগুলোর ওপর স্ট্রাইপ। RAID 0+1 হলো অন্য ক্রম, যেখানে প্রথমে স্ট্রাইপ এবং তারপর দুটি স্ট্রাইপকে মিরর করা হয়। এটি তুলনামূলক খারাপ, কারণ একটি ড্রাইভ নষ্ট হলে পুরো একটি স্ট্রাইপ অকেজো হয়ে যায় এবং মেরামতের সময় পুরো অন্য পাশটি কপি করতে হয়।

Linux একটি বিশেষ ক্ষেত্র যা জানা প্রয়োজন। কার্নেলের raid10 দুটি স্তরের পরিবর্তে একটি একক সত্তা হিসেবে কাজ করে, তাই এটি বিজোড় সংখ্যক ড্রাইভেও চলতে পারে এবং এর এমন কিছু লেআউট (near, far, offset) আছে যা নেস্টেড সেটআপে সম্ভব নয়। এই কারণেই একটি Linux বক্সে স্ট্যাটাস লাইনে দুটি অ্যারের নাম না লিখে 2 near-copies লেখা থাকে।

ChartEight 1 TB drives: usable capacity and drives lost before data loss
The data behind this chart
[
  {
    "label": "RAID 1 (four mirrored pairs)",
    "usable_tb": 4,
    "worst_case_drives_lost": 1,
    "best_case_drives_lost": 4
  },
  {
    "label": "RAID 5",
    "usable_tb": 7,
    "worst_case_drives_lost": 1,
    "best_case_drives_lost": 1
  },
  {
    "label": "RAID 6",
    "usable_tb": 6,
    "worst_case_drives_lost": 2,
    "best_case_drives_lost": 2
  },
  {
    "label": "RAID 10",
    "usable_tb": 4,
    "worst_case_drives_lost": 1,
    "best_case_drives_lost": 4
  }
]

আটটি 1 TB ড্রাইভ RAID 5-এর অধীনে 7 TB এবং RAID 10-এর অধীনে 4 TB ব্যবহারযোগ্য জায়গা দেয়। এই পার্থক্যটি সরাসরি আর্থিক খরচের সাথে জড়িত, আর এই কারণেই প্যারিটির প্রস্তাব বারবার আসে। RAID 6 যেকোনো প্যাটার্নে 2 টি ড্রাইভ নষ্ট হলেও টিকে থাকে। RAID 10 শুধুমাত্র 1 টি ড্রাইভ নষ্ট হওয়ার নিশ্চয়তা দেয়, কারণ দ্বিতীয় ড্রাইভটি নষ্ট হওয়ার সময় যদি সেটি ইতিমধ্যে নষ্ট হয়ে যাওয়া ড্রাইভটির পার্টনার হয়, তবে তা বিপজ্জনক। যদি কোনো দুটি ব্যর্থতা একই জোড়ায় না ঘটে, তবে এটি সর্বোচ্চ 4 টি ড্রাইভ নষ্ট হওয়া পর্যন্ত টিকে থাকতে পারে, তবে এটি ডিজাইনের বৈশিষ্ট্যের চেয়ে ভাগ্যের ওপর বেশি নির্ভরশীল।

প্রতিটি রাইট অপারেশনে বিভিন্ন লেভেলের খরচ

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

কন্ট্রোলার শুধুমাত্র নতুন ব্লক থেকে প্যারিটি পুনরায় গণনা করতে পারে না। এর জন্য প্রথমে পুরনো ডেটা ব্লক এবং পুরনো প্যারিটি ব্লকের প্রয়োজন হয়। তাই RAID 5-এ একটি ছোট র‍্যান্ডম রাইট অপারেশন সম্পন্ন করতে রিড, রিড, রাইট, রাইট—এই চারটি ধাপের প্রয়োজন হয়। RAID 6-এ রক্ষণাবেক্ষণের জন্য দ্বিতীয় একটি সিনড্রোম থাকে, তাই একই রাইট অপারেশনে রিড, রিড, রিড, রাইট, রাইট, রাইট—এই ছয়টি ধাপের প্রয়োজন হয়।

ChartDevice operations per small random write, and drives read during a rebuild
The data behind this chart
[
  {
    "label": "RAID 1 (2 drives)",
    "write_ops_per_host_write": 2,
    "drives_read_to_rebuild": 1
  },
  {
    "label": "RAID 5 (8 drives)",
    "write_ops_per_host_write": 4,
    "drives_read_to_rebuild": 7
  },
  {
    "label": "RAID 6 (8 drives)",
    "write_ops_per_host_write": 6,
    "drives_read_to_rebuild": 7
  },
  {
    "label": "RAID 10 (8 drives)",
    "write_ops_per_host_write": 2,
    "drives_read_to_rebuild": 1
  }
]

একটি ছোট র‍্যান্ডম রাইট অপারেশনের খরচ RAID 6-এর ক্ষেত্রে 6 ডিভাইস অপারেশন এবং RAID 10-এর ক্ষেত্রে 2 ডিভাইস অপারেশন। এই সংখ্যাগুলো ল্যাটেন্সির পার্থক্যের প্রকৃত চিত্র তুলে ধরে না। দুটি মিরর রাইট সমান্তরালভাবে সম্পন্ন হয়, তাই গেস্ট সিস্টেমকে দুটির মধ্যে যেটি ধীরগতির তার জন্য অপেক্ষা করতে হয়। প্যারিটি পাথে একটি রিড অপারেশন থাকে যা নতুন প্যারিটি গণনার আগে অবশ্যই শেষ হতে হয়, তাই গেস্ট সিস্টেমকে একটি রিড এবং তারপর একটি রাইট অপারেশনের জন্য পর্যায়ক্রমে অপেক্ষা করতে হয়। একটি ব্যস্ত হোস্টে সেই রিড অপারেশনটি অন্য সবার I/O-এর পেছনে কিউতে (queue) আটকে থাকে।

এখানে একটি গুরুত্বপূর্ণ ব্যতিক্রম আছে। যদি রাইট অপারেশনটি পুরো একটি স্ট্রাইপ পূর্ণ করার মতো বড় হয়, তবে পুরনো ডেটার প্রয়োজন হয় না, কারণ স্ট্রাইপের প্রতিটি ব্লকই প্রতিস্থাপিত হচ্ছে। সেক্ষেত্রে মেমরিতে থাকা ডেটা থেকেই প্যারিটি গণনা করা হয় এবং খরচ কমে মাত্র একটি অতিরিক্ত রাইট অপারেশনে নেমে আসে। এই কারণেই RAID 5-কে সিকোয়েন্সিয়াল বেঞ্চমার্কে ভালো মনে হয়, কিন্তু অনেক টেন্যান্টের ছোট ছোট রাইট অপারেশনের মিশ্র লোডে এটি খারাপ পারফর্ম করে। আপনি বাস্তবে যে ধরনের প্যাটার্ন ব্যবহার করেন তা পরীক্ষা করুন: সঠিকভাবে VPS ডিস্ক বেঞ্চমার্ক করা বলতে বোঝায় বাস্তবসম্মত কিউ ডেপথ (queue depth)-এ র‍্যান্ডম I/O পরীক্ষা করা, কোনো একটি বড় dd নয়।

কেন রিবিল্ড (rebuild) প্রক্রিয়াটি ঝুঁকিপূর্ণ

একটি প্যারিটি রিবিল্ডকে বাকি সব ড্রাইভ থেকে তথ্য নিয়ে হারিয়ে যাওয়া ড্রাইভটি পুনর্গঠন করতে হয়, তাই এটি প্রথম ব্লক থেকে শেষ ব্লক পর্যন্ত 7 সংখ্যক সচল ড্রাইভ থেকে ডেটা পড়ে। একটি RAID 10 রিবিল্ড শুধুমাত্র 1 সংখ্যক ড্রাইভ পড়ে: মৃত ড্রাইভটির মিরর পার্টনার, এছাড়া অন্য কিছু নয়।

এর ফলে দুটি খরচ বা প্রভাব তৈরি হয়। প্রথমটি হলো সময়, কারণ রিবিল্ডের গতি নির্ভর করে সবচেয়ে ধীরগতির সচল ড্রাইভ এবং প্যারিটি ক্যালকুলেশনের ওপর। দ্বিতীয়টি হলো লোড। একটি প্যারিটি সেটের প্রতিটি ড্রাইভ পুরো সময় জুড়ে ব্যস্ত থাকে, তাই রিবিল্ড শেষ না হওয়া পর্যন্ত সেই নোডের প্রতিটি গেস্ট (guest) উচ্চ ল্যাটেন্সি অনুভব করে। RAID 10-এর ক্ষেত্রে শুধুমাত্র একটি জোড়া ব্যস্ত থাকে এবং অন্য জোড়াগুলো স্বাভাবিক গতিতে কাজ চালিয়ে যায়।

একই সময়ে তথ্যের সঠিকতা নিয়ে ঝুঁকিও থাকে। একটি মৃত ড্রাইভসহ RAID 5 অ্যারেতে কোনো রিডানডেন্সি অবশিষ্ট থাকে না, তাই সচল ড্রাইভের যেকোনো জায়গায় একটি অপাঠ্য সেক্টর (unreadable sector) থাকলে তা আর পুনরুদ্ধার করা সম্ভব হয় না। রিবিল্ড হলো এমন একটি অপারেশন যা প্রতিটি সেক্টর পড়ে, এমনকি যেগুলোতে এক বছরেও কেউ হাত দেয়নি। প্রকাশিত ডেটাশিট অনুযায়ী, একটি কনজিউমার হার্ড ড্রাইভের প্রতি 10^14 বিট পড়ার ক্ষেত্রে একটি অপাঠ্য রিড এরর হতে পারে এবং এন্টারপ্রাইজ NVMe ড্রাইভের ক্ষেত্রে এটি 10^17 বা তার চেয়ে ভালো। এগুলো মূলত ভেন্ডরের স্পেসিফিকেশন, পরিমাপ নয়। তবে এই অনুপাতটি ব্যাখ্যা করে কেন RAID 5 রিবিল্ড ব্যর্থ হওয়ার পুরনো সতর্কবার্তাটি বড় স্পিনিং ডিস্কের ক্ষেত্রে প্রযোজ্য ছিল এবং কেন NVMe-এর ক্ষেত্রে এটি অনেক কম গুরুত্বপূর্ণ। তবে লোডের বিষয়টি যেকোনো মিডিয়ামের ক্ষেত্রেই সত্য।

রিবিল্ডের আগেই স্ক্রাবিং (scrubbing) করে সুপ্ত এররগুলো খুঁজে বের করুন। Debian এবং Ubuntu-তে md অ্যারের জন্য পর্যায়ক্রমিক স্ক্রাবিংয়ের ব্যবস্থা থাকে। রিলিজভেদে এই মেকানিজম ভিন্ন হতে পারে, তাই আপনার সিস্টেমে কোনটি আছে তা যাচাই করুন এবং ম্যানুয়ালি একটি পাস (pass) শুরু করুন।

systemctl list-timers --all | grep -i mdcheck
ls -l /etc/cron.d/mdadm
echo check | sudo tee /sys/block/md0/md/sync_action
cat /sys/block/md0/md/mismatch_cnt

sync_action পাস শেষ হলে idle-এ ফিরে যায় এবং mismatch_cnt-এর মান 0 হওয়া উচিত। মিরর সেটে শূন্যের চেয়ে বেশি কোনো সংখ্যা থাকার অর্থ হলো দুটি অংশের তথ্যের অমিল রয়েছে এবং কার্নেল বলতে পারছে না কোনটি সঠিক, কারণ কোনো কপিতেই চেকসাম (checksum) থাকে না। কিছু অমিল ক্ষতিকর নয়, এবং সোয়াপ পার্টিশন (swap partition) সাধারণত এর কারণ হয়: কার্নেল এমন একটি পেজ লিখতে পারে যা তার অজান্তেই পরিবর্তিত হয়ে যায়। ডেটা অ্যারেতে এই সংখ্যা বাড়তে থাকা মানে হলো ড্রাইভটি পরিবর্তনের সময় হয়েছে।

কেন VPS প্রোভাইডাররা NVMe-এর জন্য RAID 10-কে আদর্শ হিসেবে বেছে নেয়

একটি হাইপারভাইজার নোড কেবল একটি ওয়ার্কলোড চালায় না। এটি কয়েক ডজন সম্পর্কহীন গেস্ট সিস্টেম চালায় এবং তাদের I/O ইন্টারলিভড বা মিশ্রিত অবস্থায় ছোট ছোট রাইট স্ট্রিম হিসেবে আসে, যার মধ্যে কোনো লোকালিটি থাকে না। এটি ঠিক সেই প্যাটার্ন যেখানে প্যারিটি রিড-মডিফাই-রাইট সাইকেল সবচেয়ে বেশি ব্যয়বহুল হয় এবং একটি শেয়ারড নোডে সারাদিন এই প্যাটার্নই চলতে থাকে।

এর সাথে রিবিল্ডের আচরণ যোগ করলে সিদ্ধান্ত নেওয়া সহজ হয়ে যায়। প্যারিটি নোডে একটি ড্রাইভ নষ্ট হলে তা ওই বক্সের প্রতিটি গেস্টের গতি কমিয়ে দেয়। অন্যদিকে, RAID 10 নোডে একটি ড্রাইভ নষ্ট হলে তা কেবল একটি জোড়াকে ধীর করে দেয় এবং কপি করার প্রক্রিয়াটি ড্রাইভের গতিতে ধারাবাহিকভাবে সম্পন্ন হয়। প্রোভাইডাররা এমন ল্যাটেন্সি বিক্রি করে যা হঠাৎ বেড়ে যায় না, তাই তারা ক্যাপাসিটির বিনিময়ে এটি নিশ্চিত করে: মোট raw NVMe-এর অর্ধেক মিররিংয়ের জন্য ব্যবহৃত হয়।

ড্রাইভের আকার বৃদ্ধির বিষয়টিও একই দিকে নির্দেশ করে। ড্রাইভ যত বড় হয়, রিবিল্ডের সময়কাল তত দীর্ঘ হয় এবং প্যারিটির ক্ষেত্রে সেই সময়টিতে সবকিছু ধীর হয়ে পড়ে এবং কোনো সুরক্ষা থাকে না। ভার্চুয়ালাইজেশনের জন্য ZFS ডেপ্লয়মেন্টে ওয়াইড raidz-এর পরিবর্তে মিররড vdev-এর পুল ব্যবহারের কারণও এটিই: একটি মিরর রিসিভার কেবল ব্যবহৃত ব্লকগুলোকেই কপি করে, তাও একটি জোড়ার মধ্যে।

এর মানে এই নয় যে RAID 10 সব জায়গায় সঠিক। একটি ব্যাকআপ টার্গেটে দীর্ঘ সিকোয়েন্সিয়াল রাইট হয় এবং তা খুব কম পড়া হয়, তাই সেখানে RAID 6 ভালো বিকল্প। এটি দুটি ড্রাইভ নষ্ট হলেও টিকে থাকে এবং বেশিরভাগ ক্যাপাসিটি ফিরিয়ে দেয়। সংখ্যার চেয়ে ওয়ার্কলোডই এখানে সিদ্ধান্ত নেয়। আপনি আজ যে প্ল্যানটি বেছে নিচ্ছেন, তার জন্য লেআউটের চেয়ে মিডিয়ামটি বেশি গুরুত্বপূর্ণ এবং SATA SSD থেকে NVMe-তে উত্তরণ যেকোনো RAID পার্থক্যের চেয়ে অনেক বেশি কার্যকর।

/proc/mdstat পড়ার নিয়ম

আপনার নিজের অ্যারে আছে এমন একটি মেশিনে এগুলো চালান: একটি ডেডিকেটেড সার্ভার, বাড়িতে রাখা কোনো বক্স, অথবা দুটি সংযুক্ত ভলিউমসহ একটি VPS যা আপনি নিজেই অ্যাসেম্বল করেছেন। আপনার নিজের আউটপুট পড়ুন। নিচের ব্লকগুলো হলো উদাহরণ, যা এমনভাবে লেখা হয়েছে যাতে আপনি আপনার প্রাপ্ত আউটপুটের সাথে মিলিয়ে দেখতে পারেন।

cat /proc/mdstat
sudo mdadm --detail /dev/md0
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTS

একটি সুস্থ চারটি ড্রাইভের RAID 10 অ্যারে অনেকটা এরকম আউটপুট দেয়।

Personalities : [raid1] [raid10]
md0 : active raid10 nvme3n1p3[3] nvme2n1p3[2] nvme1n1p3[1] nvme0n1p3[0]
      3906764800 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 0/30 pages [0KB], 65536KB chunk

unused devices: <none>

এর প্রতিটি অংশ তথ্য বহন করে।

  • Personalities চলমান কার্নেলে লোড হওয়া md মডিউলগুলোর তালিকা দেখায়। সেখানে raid10 থাকা মানে হলো কোডটি উপলব্ধ, এর বেশি কিছু নয়।
  • md0 : active raid10 হলো অ্যারে ডিভাইস, এর অবস্থা এবং এর লেভেল।
  • এরপরের নামগুলো হলো সদস্য। বর্গাকার বন্ধনীতে থাকা সংখ্যাটি হলো অ্যারে মেটাডেটাতে ডিভাইসের ইনডেক্স, এটি লাইনের অবস্থান নয় এবং সবসময় স্লট নম্বরও নয়।
  • ড্রাইভ পরিবর্তনের পর নতুন সদস্য সাধারণত যে স্লটটি পূরণ করে তার চেয়ে বড় ইনডেক্স ধরে রাখে, তাই nvme4n1p3[4] স্লট 2-এ থাকতে পারে। mdadm --detail এর RaidDevice কলামে প্রকৃত স্লটটি প্রিন্ট করে, তাই যখন পার্থক্যের বিষয়টি গুরুত্বপূর্ণ হয় তখন সেটি ব্যবহার করুন।
  • সদস্যের পরে (F) মানে হলো ত্রুটিপূর্ণ। (S) মানে হলো স্পেয়ার: উপস্থিত, নিষ্ক্রিয়, কোনো কিছু নষ্ট হওয়ার অপেক্ষায়।
  • 3906764800 blocks super 1.2 হলো 1 KiB ব্লকে ব্যবহারযোগ্য আকার, এরপর মেটাডেটা ফরম্যাট।
  • 512K chunks 2 near-copies হলো স্ট্রাইপ চাঙ্ক সাইজ এবং RAID 10 লেআউট, যা এখানে প্রতিটি ব্লকের দুটি কপি পাশাপাশি রাখে।
  • [4/4] হলো অ্যারেতে প্রত্যাশিত সদস্য সংখ্যা, এরপর বর্তমানে সিঙ্কে থাকা সংখ্যা।
  • [UUUU] হলো স্লট অনুযায়ী প্রতি স্লটে একটি ক্যারেক্টার। U হলো এমন একটি স্লট যা সচল এবং সিঙ্কে আছে। _ হলো এমন একটি স্লট যেখানে কোনো কিছু কাজ করছে না।
  • bitmap: হলো রাইট ইনটেন্ট বিটম্যাপ। এটি রেকর্ড করে কোন অঞ্চলগুলোতে লেখা হচ্ছিল, যাতে কোনো সদস্য বিচ্ছিন্ন হয়ে আবার ফিরে আসলে পুরো ড্রাইভের পরিবর্তে শুধুমাত্র সেই অঞ্চলগুলো পুনরায় সিঙ্ক হয়।

[4/3] এবং [UU_U] এর অর্থ যখন কোনো সমস্যা হয়

একটি ক্ষতিগ্রস্ত অ্যারে দেখতে এমন হয়।

md0 : active raid10 nvme3n1p3[3] nvme2n1p3[2](F) nvme1n1p3[1] nvme0n1p3[0]
      3906764800 blocks super 1.2 512K chunks 2 near-copies [4/3] [UU_U]

দুটি বন্ধনী একসাথে পড়ুন। [4/3] বলছে চারটি স্লটের মধ্যে একটি কাজ করছে না। [UU_U] বলছে কোনটি, কারণ আন্ডারস্কোরটি তৃতীয় ক্যারেক্টার এবং স্লটগুলো শূন্য থেকে গণনা করা হয়, তাই স্লট 2 ডাউন আছে। (F) ফ্ল্যাগটি শুধুমাত্র তখনই ডিভাইসের নাম দেখায় যখন ব্যর্থ ড্রাইভটি সংযুক্ত থাকে। এটিকে মেশিন থেকে খুলে ফেললে লাইন থেকে নাম মুছে যায়, কিন্তু আন্ডারস্কোরটি থেকে যায়।

এই পুরো সময়জুড়ে অ্যারে সার্ভিস প্রদান চালিয়ে যায়, এবং RAID 10-এ এটি প্রায় পূর্ণ গতিতেই কাজ করে, যে কারণে কেউ অনুভব করে বুঝতে পারে না। কোনো কিছুকে অবশ্যই আপনাকে জানাতে হবে।

grep -i mailaddr /etc/mdadm/mdadm.conf
sudo mdadm --monitor --scan --oneshot --test
systemctl list-units --all | grep -i md

mdadm প্যাকেজটি একটি মনিটর ডিমন ইনস্টল করে যা /etc/mdadm/mdadm.conf থেকে MAILADDR পড়ে, এবং রিলিজের মধ্যে ইউনিটটির নাম পরিবর্তিত হয়েছে, তাই অনুমান না করে শেষ কমান্ডটি দিয়ে এটি খুঁজে বের করুন। --test রান প্রতি অ্যারের জন্য অবিলম্বে একটি মেসেজ পাঠায়। এর পরে ইনবক্স খালি থাকা মানে হলো মেইল পাথটি ভেঙে গেছে, তাই যে মেসেজটি আপনার আসলে প্রয়োজন ছিল সেটিও একইভাবে হারিয়ে যেত।

যখন কোনো প্রতিস্থাপন পুনর্গঠন (rebuild) হয়, তখন অ্যারের নিচে একটি প্রগ্রেস লাইন দেখা যায়।

md0 : active raid10 nvme4n1p3[4] nvme3n1p3[3] nvme1n1p3[1] nvme0n1p3[0]
      3906764800 blocks super 1.2 512K chunks 2 near-copies [4/3] [UU_U]
      [==>..................]  recovery = 12.4% (242012928/1953382400) finish=63.1min speed=452000K/sec

recovery হলো একটি প্রতিস্থাপন ড্রাইভে রিবিল্ড। resync হলো নতুন তৈরি অ্যারেতে প্রথম কনসিস্টেন্সি পাস। check হলো আপনার উপরে ট্রিগার করা স্ক্রাব। বন্ধনীতে থাকা জোড়াটি হলো প্রতি-ডিভাইস মোটের বিপরীতে 1 KiB ব্লকে অগ্রগতি, এবং finish হলো বর্তমান গতিতে কার্নেলের অনুমান। সেই গতি /proc/sys/dev/raid/speed_limit_min এবং speed_limit_max দ্বারা সীমাবদ্ধ, এবং এই সীমাগুলো বিদ্যমান যাতে রিবিল্ড প্রোডাকশন I/O-কে বাধাগ্রস্ত না করে।

রিবিল্ড চলাকালীন একটি পূর্ণ mdadm --detail
/dev/md0:
           Version : 1.2
     Creation Time : Tue Mar 10 09:14:22 2026
        Raid Level : raid10
        Array Size : 3906764800 (3.64 TiB 4.00 TB)
     Used Dev Size : 1953382400 (1.82 TiB 2.00 TB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Aug  5 11:02:41 2026
             State : clean, degraded, recovering
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : near=2
        Chunk Size : 512K

    Rebuild Status : 12% complete

              Name : storage:0
            Events : 4184

    Number   Major   Minor   RaidDevice State
       0     259        3        0      active sync set-A   /dev/nvme0n1p3
       1     259        7        1      active sync set-B   /dev/nvme1n1p3
       4     259       11        2      spare rebuilding    /dev/nvme4n1p3
       3     259       15        3      active sync set-B   /dev/nvme3n1p3

Number কলামটি হলো /proc/mdstat-এর বন্ধনীতে প্রিন্ট করা মেটাডেটা ইনডেক্স। RaidDevice কলামটি হলো স্লট, যা [UU_U] স্ট্রিংয়ের অবস্থান। এখানে সেগুলো ভিন্ন কারণ ডিভাইস 4 সেই ড্রাইভটিকে প্রতিস্থাপন করেছে যা স্লট 2 ধরে রেখেছিল। set-A এবং set-B প্রতিটি মিররের দুটি অংশকে নির্দেশ করে, তাই একই জোড়ায় set-A এর সদস্য এবং set-B এর সদস্য যারা একই ডেটা ধরে রাখে, তাদের একসাথে হারানো যাবে না।

আপনার নিজের অ্যারেতে ড্রাইভ প্রতিস্থাপন করা চারটি কমান্ডের কাজ, এবং শেষটি হলো চেক।

sudo mdadm --manage /dev/md0 --fail /dev/nvme2n1p3
sudo mdadm --manage /dev/md0 --remove /dev/nvme2n1p3
sudo mdadm --manage /dev/md0 --add /dev/nvme4n1p3
cat /proc/mdstat

রিকভারি লাইনটি এক বা দুই সেকেন্ডের মধ্যে দেখা যাওয়া উচিত। প্রতিস্থাপন পার্টিশনটিকে অবশ্যই mdadm --detail থেকে Used Dev Size এর সমান বড় হতে হবে, এবং সামান্য ছোট পার্টিশনও not large enough to join array ফরম্যাটের মেসেজ দিয়ে প্রত্যাখ্যাত হবে। নতুন ড্রাইভটি যোগ করার আগে পুরনোটির সাথে মিলিয়ে পার্টিশন করুন।

VPS-এর ভেতর থেকে আপনি যা দেখতে পান এবং যা পান না

বেশিরভাগ গেস্ট সিস্টেম হোস্টের RAID দেখতে পায় না, এবং এটি পরিকল্পিতভাবেই করা হয়েছে। হাইপারভাইজার আপনাকে একটি ভার্চুয়াল ডিস্ক প্রদান করে। সেই ডিস্কটি NVMe ড্রাইভের কোনো RAID 10 পুল থেকে তৈরি নাকি একটি মাত্র ড্রাইভের ওপর অবস্থিত, তা হোস্টের বৈশিষ্ট্য এবং এটি আপনার গেস্ট সিস্টেমের ভেতর দেখা যায় না।

systemd-detect-virt
lsblk -d -o NAME,SIZE,ROTA,MODEL
cat /proc/mdstat

systemd-detect-virt কমান্ডটি KVM গেস্টের ক্ষেত্রে kvm প্রদর্শন করে, কন্টেইনারের ক্ষেত্রে lxc-এর মতো কন্টেইনার টাইপ দেখায় এবং বেয়ার মেটাল সার্ভারে none প্রদর্শন করে। KVM গেস্টের ক্ষেত্রে আপনি সাধারণত lsblk-এ একটি মাত্র vda বা sda দেখতে পাবেন এবং /proc/mdstat-এ কোনো অ্যারে (array) থাকবে না, কারণ গেস্টের ভেতরে এগুলোর অস্তিত্ব নেই।

কন্টেইনার-ভিত্তিক VPS-এর ক্ষেত্রে এই তথ্য নির্ভরযোগ্য নয়। কন্টেইনারগুলো হোস্টের কার্নেল শেয়ার করে এবং /proc-এর কিছু অংশ নেমস্পেসড (namespaced) থাকে না, তাই সেখানে যা দেখা যায় তা আপনার স্লাইসের পরিবর্তে হোস্টের বর্ণনা হতে পারে। এর কোনোটিকেই আপনার স্টোরেজ সম্পর্কিত তথ্য হিসেবে গণ্য করবেন না। আপনার স্টোরেজ লেআউট কেমন তা জানতে প্রোভাইডারকে জিজ্ঞাসা করুন এবং যদি এটি আপনার জন্য গুরুত্বপূর্ণ হয়, তবে লিখিত উত্তর নিন।

আপনি ভেতর থেকে যা পরীক্ষা করতে পারেন তা হলো আপনাকে দেওয়া ডিস্কটির আচরণ। আপনার VPS ডিস্কটি সত্যিই NVMe কি না তা যাচাই করা অংশে এমন কমান্ডগুলো আলোচনা করা হয়েছে যা প্রকৃত তথ্য প্রদান করে এবং একটি SSD VPS-এ আসলে কী থাকে অংশে প্ল্যান পেজে দেওয়া লেবেলের দাবিগুলো বিশ্লেষণ করা হয়েছে।

আপনার কি VPS-এর ভেতরে RAID চালানো উচিত?

সাধারণত না, এর কারণ হলো failure domains। আপনি যদি একটি VPS-এ দুটি volume যুক্ত করে mdadm দিয়ে সেগুলোকে mirror করেন, তবে উভয় volume-ই একই physical array, একই node এবং একই power supply-এর পেছনে থাকতে পারে। এতে আপনি যে redundancy আগে থেকেই পাচ্ছিলেন, তার জন্য প্রতিটি write-এর খরচ দ্বিগুণ করবেন, অথচ একটি বড় ধরনের ব্যর্থতায় আপনি উভয় copy-ই হারাবেন।

এটি তখনই করা সার্থক যখন provider নিশ্চিত করে যে volume-গুলো আলাদা failure domain-এ রয়েছে, অথবা আপনি যখন এমন dedicated server ব্যবহার করছেন যেখানে আপনি সরাসরি drive-গুলোকে নির্দেশ করতে পারেন। অন্যথায়, এই পরিশ্রম এমন backup-এর পেছনে ব্যয় করা ভালো যা মেশিন থেকে বাইরে রাখা যায়।

RAID আপনাকে যা থেকে সুরক্ষা দেয় না

RAID শুধুমাত্র একটি ঘটনার ক্ষেত্রে কাজ করে: যখন একটি ড্রাইভ সঠিকভাবে কাজ করা বন্ধ করে দেয়। নিচে উল্লিখিত প্রতিটি কাজই একটি বৈধ রাইট (write) হিসেবে গণ্য হয়, তাই অ্যারে সেটিকে প্রতিটি কপিতে প্রয়োগ করে এবং নিজেকে সুস্থ হিসেবে রিপোর্ট করে।

  • ডিলিট করা (Deletion): ভুল ডিরেক্টরিতে rm -rf চালানো, অথবা এমন কোনো deploy script যেখানে পাথের কোনো ভেরিয়েবল সেট করা নেই। অ্যারে এটিকে একটি বৈধ রাইট হিসেবে দেখে এবং তা দুইবারই কার্যকর করে।
  • র‍্যানসমওয়্যার (Ransomware): এনক্রিপশন হলো এক ধরনের রাইট অপারেশন। একটি সুস্থ অ্যারে মিররের উভয় অংশেই এনক্রিপ্ট করা ভার্সনটি সংরক্ষণ করে।
  • ত্রুটিপূর্ণ অ্যাপ্লিকেশন (A broken application): এমন কোনো বাগ যা আপনার ডাটাবেসে আবর্জনা (garbage) লেখে, তা রিডান্ড্যান্ট ড্রাইভেও একই আবর্জনা লিখে ফেলে।
  • পুরো নোড (The whole node): কোনো হোস্ট ফেইল করলে, অথবা ভুলবশত কোনো অ্যাকাউন্ট সাসপেন্ড হলে। একটি অ্যারে নিখুঁত অবস্থায় থেকেও দুর্গম (unreachable) হতে পারে।
  • আপনি নিজে, এক সপ্তাহ পরে: সোমবার আপনি যে ফাইলটি ডিলিট করেছেন, তা সোমবারই প্রতিটি ড্রাইভ থেকে মুছে গেছে। শুধুমাত্র তার আগের কোনো কপিই তা ফিরিয়ে আনতে পারে।

একই স্টোরেজে স্ন্যাপশট রাখাও এর সমাধান নয়। এগুলো ডিলিট হওয়া থেকে রক্ষা করতে সাহায্য করে, কিন্তু যে অ্যারেতে এগুলো থাকে, সেই অ্যারে নষ্ট হয়ে গেলে স্ন্যাপশটও নষ্ট হয়ে যায়। ব্যাকআপকে ব্যাকআপ হিসেবে গণ্য করার মূল বৈশিষ্ট্য হলো এটি অন্য কোথাও সংরক্ষিত থাকা। restic ব্যবহার করে এনক্রিপ্ট করা অফ-সার্ভার ব্যাকআপ হলো এই পৃষ্ঠার অন্য অর্ধেক: একটি ড্রাইভ নষ্ট হয়ে গেলেও অ্যারে আপনাকে সার্ভিস চালু রাখতে সাহায্য করে, আর যখন কোনো রাইট অপারেশনের কারণে ক্ষতি হয় যা অ্যারে সানন্দে সম্পন্ন করেছে, তখন restic আপনার ডাটা ফিরিয়ে আনে।

FAQ

RAID 10 থাকলে কি আমার ব্যাকআপের প্রয়োজন নেই?

না। RAID 10 শুধুমাত্র ড্রাইভ নষ্ট হয়ে যাওয়া থেকে সুরক্ষা দেয়। এটি প্রতিটি বৈধ রাইট অপারেশনকে মিররের উভয় অংশে লিখে রাখে, তাই কোনো ফাইল ডিলিট করলে বা র‍্যানসমওয়্যার আক্রমণ হলে তা তাৎক্ষণিকভাবে রিডানড্যান্ট ড্রাইভেও কার্যকর হয়। এর ফলে অ্যারেটি নিজেকে সুস্থ হিসেবেই রিপোর্ট করে, কারণ সিস্টেমের দৃষ্টিতে কোনো হার্ডওয়্যার ফেইলিয়র ঘটেনি। আপনার অবশ্যই মেশিনের বাইরে ব্যাকআপ কপি রাখা প্রয়োজন এবং সেগুলো কার্যকর কি না তা যাচাই করতে নিয়মিত রিস্টোর টেস্ট করা উচিত।

VPS প্রোভাইডাররা কেন RAID 5 বা RAID 6 এর বদলে RAID 10 বেছে নেয়?

এর দুটি কারণ রয়েছে, যার উভয়ই ছোট র‍্যান্ডম রাইট অপারেশনের সাথে সম্পর্কিত। প্যারিটি রাইটের ক্ষেত্রে নতুন প্যারিটি হিসাব করার আগে পুরনো ডেটা এবং পুরনো প্যারিটি রিড করতে হয়। ফলে RAID 5 এ একটি ছোট রাইটের জন্য 4 এবং RAID 6 এ 6 অপারেশন প্রয়োজন হয়, যেখানে মিররের ক্ষেত্রে মাত্র 2 অপারেশন লাগে। এছাড়া প্যারিটি রিবিল্ডের সময় প্রতিটি সচল ড্রাইভ শুরু থেকে শেষ পর্যন্ত রিড করতে হয়, যা ঘণ্টার পর ঘণ্টা নোডের প্রতিটি গেস্টের পারফরম্যান্স কমিয়ে দেয়। অন্যদিকে, RAID 10 রিবিল্ড একটি ড্রাইভ থেকে অন্য ড্রাইভে কপি করে এবং বাকি পেয়ারগুলোকে প্রভাবিত করে না। প্রোভাইডাররা এর বিনিময়ে স্টোরেজ ক্যাপাসিটি ত্যাগ করে, যা মোট raw NVMe এর অর্ধেক।

/proc/mdstat এ [U_] বা [UU_U] এর মানে কী?

প্রতিটি ক্যারেক্টার অ্যারের একটি স্লটকে নির্দেশ করে, যা স্লটের ক্রম অনুযায়ী সাজানো থাকে। U মানে হলো ওই স্লটে একটি মেম্বার আছে যা সচল এবং সিঙ্কে আছে। _ মানে হলো ওই স্লটে কোনো কার্যকর ড্রাইভ নেই। দুটি ড্রাইভের মিররে [U_] মানে হলো দ্বিতীয় স্লটটি ডাউন এবং কোনো রিডানড্যান্সি অবশিষ্ট নেই। এটি তার আগের জোড়ার সাথে মিলিয়ে পড়ুন, যেখানে [4/3] নির্দেশ করে যে অ্যারেটি চারটি মেম্বার আশা করছে কিন্তু তিনটি আছে। স্লটের ক্রম mdadm --detail এর RaidDevice কলামের সাথে মেলে, লাইনে ডিভাইস নামগুলো যে ক্রমে আছে তার সাথে নয়।

একটি RAID 10 অ্যারে থেকে কয়টি ড্রাইভ নষ্ট হতে পারে?

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

আমার কি mdadm ব্যবহার করে VPS এর ভেতরে দুটি ভলিউম মিরর করা উচিত?

সাধারণত না। একটি VPS এ সংযুক্ত দুটি ভলিউম প্রায়শই একই হোস্টের একই ফিজিক্যাল অ্যারেতে থাকে। তাই সেগুলোকে মিরর করলে প্রতিটি রাইট অপারেশনের খরচ দ্বিগুণ হয়, কিন্তু হোস্টের নিজস্ব RAID যে সুরক্ষা দেয় তার বাইরে নতুন কোনো সুরক্ষা পাওয়া যায় না। এটি কেবল তখনই করা উচিত যখন প্রোভাইডার নিশ্চিত করে যে ভলিউমগুলো আলাদা ফেইলিয়র ডোমেইনে রয়েছে। অন্যথায়, এই প্রচেষ্টাকে মেশিনের বাইরে ব্যাকআপ রাখার কাজে ব্যয় করা শ্রেয়।