পাঠ ৫৫ · ৫৭-এর মধ্যে · মডিউল ১৩
Home / Courses / Cloud Computing & DevOps / কেস স্টাডি: মাল্টি-ক্লাউড DR

কেস স্টাডি: মাল্টি-ক্লাউড ডিজাস্টার রিকভারি স্ট্র্যাটেজি

Case study: multi-cloud disaster recovery
১০ মিনিট পড়া উন্নত · Advanced কেস স্টাডি Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • একটি বাস্তব মাল্টি-ক্লাউড DR স্ট্র্যাটেজিতে কোন আগের লেসনের কৌশল কীভাবে একত্র হয়
  • অ্যাক্টিভ-অ্যাক্টিভ বনাম অ্যাক্টিভ-প্যাসিভ DR-এর মধ্যে ব্যয় ও ফেইলওভার-সময়ের ট্রেড-অফ
  • কেন একটি DR প্ল্যান নিয়মিত বাস্তবে পরীক্ষা করা আবশ্যক
  • একটি হেলথ-চেক-ভিত্তিক স্বয়ংক্রিয় ফেইলওভার ফাংশন Python-এ কীভাবে বাস্তবায়ন করা যায়

১ · কনটেক্সট — সমস্যা

একটি কোম্পানির সম্পূর্ণ প্রোডাকশন সিস্টেম বর্তমানে একটি মাত্র ক্লাউড প্রোভাইডারে চলে। প্রশ্ন: যদি সেই প্রোভাইডারের একটি পুরো রিজন — বা পুরো প্রোভাইডারই — কোনো বড় আউটেজে পড়ে (বিরল কিন্তু বাস্তবে ঘটে থাকা ঘটনা), তাহলে কী হবে? লক্ষ্য: এমন একটি DR স্ট্র্যাটেজি ডিজাইন করা যাতে একটি প্রোভাইডারের সম্পূর্ণ ব্যর্থতাতেও সার্ভিস (হয়তো কমে যাওয়া ক্যাপাসিটিতে হলেও) চালু থাকে।

২ · অ্যাপ্রোচ — কোন পাঠের কৌশল কোথায় প্রয়োগ হলো

প্রথমে ক্রিটিক্যাল ডেটা একাধিক প্রোভাইডার/রিজন জুড়ে রেপ্লিকেট করা হয়, একটি নির্দিষ্ট RPO/RTO লক্ষ্য অনুযায়ী (M3/L12 — কত ঘণ্টার ডেটা হারানো গ্রহণযোগ্য, কত দ্রুত পুরোপুরি সুস্থ হতে হবে তা স্ন্যাপশট ফ্রিকোয়েন্সি ঠিক করে)। ওয়ার্কলোড দুই প্রোভাইডারেই ডিপ্লয়যোগ্য রাখা হয় পোর্টেবল টেকনোলজি চয়েস ব্যবহার করে (M12/L52-এর পোর্টেবিলিটি নীতি — কন্টেইনার, Kubernetes, Terraform)। ট্রাফিক ফেইলওভার হয় হেলথ-চেক-ভিত্তিক DNS রাউটিং দিয়ে (M4/L15) — প্রাইমারি প্রোভাইডার আনহেলদি হলে স্বয়ংক্রিয়ভাবে সেকেন্ডারিতে ট্রাফিক পাঠানো হয়, কোনো ম্যানুয়াল হস্তক্ষেপ ছাড়াই। সবশেষে — এবং প্রায়ই উপেক্ষিত সবচেয়ে গুরুত্বপূর্ণ ধাপ — এই পুরো ফেইলওভার প্রক্রিয়া নিয়মিত সময়ান্তরে বাস্তবে পরীক্ষা করা হয় (একটি "গেম ডে" চালিয়ে ইচ্ছাকৃতভাবে প্রাইমারিকে অফলাইন করে দেখা হয় ফেইলওভার আসলেই কাজ করে কিনা)।

ক্লায়েন্ট Client হেলথ-চেক DNS (L15) Health-check Routing প্রোভাইডার A (প্রাইমারি) healthy হলে ব্যবহৃত প্রোভাইডার B (সেকেন্ডারি) A ডাউন হলে সক্রিয়
প্রাইমারি (প্রোভাইডার A) হেলথ-চেক ফেইল করলে DNS স্বয়ংক্রিয়ভাবে ট্রাফিক সেকেন্ডারিতে (প্রোভাইডার B) সরিয়ে দেয়।

৩ · মূল ট্রেড-অফ — অ্যাক্টিভ-অ্যাক্টিভ বনাম অ্যাক্টিভ-প্যাসিভ

দুটি ভিন্ন বাজেট, দুটি ভিন্ন ফেইলওভার-স্পিড

ফুল অ্যাক্টিভ-অ্যাক্টিভ — দুই প্রোভাইডারেই একসাথে পুরো ক্যাপাসিটি চালু রাখা, ফেইলওভার প্রায় তাৎক্ষণিক, কিন্তু পুরো অতিরিক্ত ইনফ্রাস্ট্রাকচারের জন্য দ্বিগুণ (বা কাছাকাছি) খরচ সবসময় বহন করতে হয়। অ্যাক্টিভ-প্যাসিভ/পাইলট-লাইট — সেকেন্ডারি প্রোভাইডারে ন্যূনতম ("পাইলট লাইটের মতো টিমটিমে") ক্যাপাসিটি চালু রাখা, প্রয়োজনে দ্রুত স্কেল-আপ করা — সস্তা, কিন্তু ফেইলওভারে পুরো ক্যাপাসিটিতে পৌঁছাতে কিছু সময় (মিনিট থেকে ঘণ্টা) লাগে। বেশিরভাগ বাস্তব প্রতিষ্ঠান তাদের ব্যবসার জন্য প্রকৃত ডাউনটাইমের খরচ কতটা — সেই হিসাবের ভিত্তিতেই এই দুইয়ের মধ্যে বেছে নেয়, "ডিফল্ট সঠিক উত্তর" বলে কিছু নেই।

একটি DR প্ল্যান যা কখনো বাস্তবে ইচ্ছাকৃতভাবে ট্রিগার করে পরীক্ষা করা হয়নি, তা একটি নির্ভরযোগ্য প্ল্যান নয় — কাগজে-কলমে নিখুঁত মনে হওয়া একটি প্রক্রিয়া বাস্তবে প্রথমবার চালু করার সময়ই আসল সমস্যা প্রকাশ পায় (ভুল কনফিগারেশন, ভুলে যাওয়া নির্ভরতা)। "ব্যর্থতা ইনজেক্ট করে" নিয়মিত পরীক্ষা তাই DR স্ট্র্যাটেজির একটি বাধ্যতামূলক অংশ, ঐচ্ছিক সংযোজন নয়।

৪ · কোড — হেলথ-চেক-ভিত্তিক ফেইলওভার সিলেক্টর

Python
# প্রতিটি প্রোভাইডারের সিমুলেটেড হেলথ-চেক স্ট্যাটাস
provider_health = {
    "provider_a_primary":   "healthy",
    "provider_b_secondary": "healthy",
}

preferred_order = ["provider_a_primary", "provider_b_secondary"]

def select_active_provider(providers, order):
    for name in order:
        if providers.get(name) == "healthy":
            return name
    return None   # কোনো প্রোভাইডারই healthy নয় — সম্পূর্ণ আউটেজ

# --- স্বাভাবিক অবস্থা ---
active = select_active_provider(provider_health, preferred_order)
print(f"স্বাভাবিক অবস্থা              -> সক্রিয় প্রোভাইডার: {active}")

# --- সিমুলেটেড প্রাইমারি আউটেজ ---
provider_health["provider_a_primary"] = "unhealthy"
active_after_outage = select_active_provider(provider_health, preferred_order)
print(f"প্রাইমারি আউটেজের পর           -> সক্রিয় প্রোভাইডার: {active_after_outage}")

# --- সিমুলেটেড উভয় প্রোভাইডার ডাউন (worst case) ---
provider_health["provider_b_secondary"] = "unhealthy"
active_full_outage = select_active_provider(provider_health, preferred_order)
print(f"উভয় প্রোভাইডার ডাউনের পর        -> সক্রিয় প্রোভাইডার: {active_full_outage}")

    
লক্ষ্য করুন — select_active_provider শুধুমাত্র preferred_order অনুসরণ করে প্রথম healthy প্রোভাইডার খুঁজে বের করে, কোনো ম্যানুয়াল হস্তক্ষেপ ছাড়াই। শেষ কেসে (উভয় ডাউন), ফাংশন None রিটার্ন করে — একটি বাস্তব সিস্টেমে এটি সর্বোচ্চ-গুরুত্বের অ্যালার্ট (M10/L44) ট্রিগার করত, কারণ এটি এমন একটি পরিস্থিতি যেখানে স্বয়ংক্রিয় ফেইলওভার আর সম্ভব নয়।

৫ · ফলাফল

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

মূল কথা · Key takeaway

মাল্টি-ক্লাউড DR একটি একক ফিচার নয় — এটি L12-এর RPO/RTO পরিকল্পনা, L52-এর পোর্টেবিলিটি নীতি, ও L15-এর স্বয়ংক্রিয় ফেইলওভার রাউটিং-এর সুশৃঙ্খল সমন্বয়, যার পুরোটাই নিয়মিত বাস্তব পরীক্ষার মাধ্যমে প্রমাণিত রাখতে হয়।

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

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

প্র ০১ একটি ছোট স্টার্টআপের জন্য অ্যাক্টিভ-অ্যাক্টিভ নাকি অ্যাক্টিভ-প্যাসিভ DR বেশি যুক্তিসঙ্গত, এবং কেন?

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

প্র ০২ যদি এই সিস্টেম L52-এর পোর্টেবিলিটি নীতি না মেনে একটি প্রোভাইডারের প্রোপাইটারি সার্ভিসের উপর ভারী নির্ভরশীল হতো, তাহলে এই DR স্ট্র্যাটেজিতে কী সমস্যা হতো?

সেকেন্ডারি প্রোভাইডারে একই ফাংশনালিটি পুনরায় তৈরি করা কঠিন বা অসম্ভব হয়ে যেত — কারণ প্রোপাইটারি সার্ভিসের সমতুল্য কিছু অন্য প্রোভাইডারে নাও থাকতে পারে, বা থাকলেও ভিন্নভাবে কাজ করত। পোর্টেবিলিটি ছাড়া "মাল্টি-ক্লাউড DR" আসলে সম্ভবই নয় — এটিই কারণ কেন L52-এর নীতি এই কেস স্টাডির একটি পূর্বশর্ত, ঐচ্ছিক সংযোজন নয়।

প্র ০৩ "গেম ডে" (ইচ্ছাকৃত ফেইলওভার ড্রিল) চালানোর সবচেয়ে বড় বাস্তব ঝুঁকি কী, এবং তা কীভাবে ব্যবস্থাপনা করা উচিত?

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

অনুশীলন

  1. পরীক্ষা করুন: উপরের কোডে একটি তৃতীয় প্রোভাইডার "provider_c_tertiary": "healthy" যোগ করুন এবং preferred_order-এ তৃতীয় নাম হিসেবে যুক্ত করুন — এখন উভয় "প্রধান" প্রোভাইডার ডাউন হলে কী হয় দেখুন।

    দুই প্রোভাইডার আনহেলদি হওয়ার পরও ফাংশনটি স্বয়ংক্রিয়ভাবে তৃতীয় healthy প্রোভাইডারে ফেইলওভার করবে (আগে যেখানে None রিটার্ন হতো) — দেখাচ্ছে preferred_order লিস্টে যত বেশি healthy বিকল্প থাকে, সম্পূর্ণ আউটেজের সম্ভাবনা তত কমে।

  2. চিন্তা করুন: আপনার পরিচিত একটি অ্যাপ্লিকেশনের জন্য RTO ৫ মিনিট আর RTO ৫ ঘণ্টা হলে DR স্ট্র্যাটেজির পছন্দ কীভাবে ভিন্ন হবে?

    RTO ৫ মিনিট হলে অ্যাক্টিভ-অ্যাক্টিভ প্রায় অপরিহার্য — পাইলট-লাইট থেকে পূর্ণ ক্যাপাসিটিতে স্কেল-আপ করতে ৫ মিনিটের বেশি সময় লাগতে পারে। RTO ৫ ঘণ্টা হলে পাইলট-লাইট যথেষ্ট — স্কেল-আপের জন্য যথেষ্ট সময় থাকে, তাই দ্বিগুণ খরচ বহন করার প্রয়োজন নেই।

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

আগের পাঠ
কেস স্টাডি: একটি সম্পূর্ণ CI/CD পাইপলাইন তৈরি করা