পাঠ ৩৭ · ৫১-এর মধ্যে · মডিউল ৯
Home / Courses / System Design / ফেইলওভার ও ডিজাস্টার রিকভারি

ফেইলওভার, রেপ্লিকেশন ও ডিজাস্টার রিকভারি

Failover, replication & disaster recovery
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ফেইলওভার কী এবং এর দুটি মূল উপাদান — ডিটেকশন ও মেকানিজম
  • Active-Passive বনাম Active-Active আর্কিটেকচারের ট্রেড-অফ
  • RTO ও RPO — ডিজাস্টার রিকভারির দুটি মূল মেট্রিক্স, এবং কীভাবে এরা রিডান্ডেন্সি সিদ্ধান্ত ঠিক করে
  • Python দিয়ে একটি active-passive ফেইলওভার সিমুলেশন — প্রাইমারি ডাউন হওয়ার পর রেপ্লিকা প্রমোট হওয়া

১ · ফেইলওভার — ডিটেকশন ও মেকানিজম

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

একটি কার্যকর ফেইলওভার সিস্টেমের দুটি অংশ থাকতেই হবে —

ডিটেকশন
নিয়মিত হেলথ-চেক বা হার্টবিট পাঠিয়ে বোঝা প্রাইমারি এখনো জীবিত কিনা — একটি নির্দিষ্ট সময়ের মধ্যে সাড়া না পেলে "ডাউন" ধরে নেওয়া হয়।
প্রমোশন মেকানিজম
একটি রেপ্লিকাকে নতুন প্রাইমারি বানানো — এই "কোন নোডটি হবে" সিদ্ধান্তটি একাই একটি ছোট কনসেনসাস সমস্যা (L36-এর লিডার ইলেকশন)।
মূল ঝুঁকি — ভুল ডিটেকশন

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

২ · Active-Passive বনাম Active-Active

Active-PassiveActive-Passiveএকটি প্রাইমারি নোড সব ট্রাফিক হ্যান্ডল করে, স্ট্যান্ডবাই রেপ্লিকা(গুলো) অলস বা শুধু রিড-অনলি থাকে যতক্ষণ না প্রাইমারি ব্যর্থ হয়। কনফিগারেশনে একটি নোডই সমস্ত রাইট ও (সাধারণত) রিড হ্যান্ডল করে; স্ট্যান্ডবাই নোড শুধু রেপ্লিকেটেড ডেটা নিয়ে অপেক্ষা করে। সহজ ও প্রেডিক্টেবল, কিন্তু স্ট্যান্ডবাই রিসোর্স স্বাভাবিক সময়ে অব্যবহৃত থাকে — একটি ধরনের অপচয়।

Active-ActiveActive-Activeএকাধিক নোড একসাথে লাইভ ট্রাফিক হ্যান্ডল করে; একটি ব্যর্থ হলে বাকিগুলো তার লোড শুষে নেয়, কোনো "স্ট্যান্ডবাই" নেই। কনফিগারেশনে একাধিক নোড একই সাথে লাইভ ট্রাফিক সার্ভ করে — কোনো রিসোর্স অলস বসে থাকে না, এবং একটি নোড হারালে বাকিরা স্বয়ংক্রিয়ভাবে তার লোড শুষে নেয়। কিন্তু একাধিক নোডে একসাথে লেখা মানেই মাল্টি-মাস্টার কনফ্লিক্ট হ্যান্ডলিং দরকার হয় (L16-এর রেপ্লিকেশন এবং L34-এর CRDT দেখুন)।

ক্লায়েন্ট Client হেলথ-চেকার Health Checker Primary ✕ DOWN health-check failed Replica → Promoted new Primary সার্ভ ✓
হেলথ-চেকার প্রাইমারির ব্যর্থতা শনাক্ত করে এবং replica-কে নতুন primary হিসেবে প্রমোট করে — ক্লায়েন্ট রিকোয়েস্ট নিরবচ্ছিন্নভাবে চালিয়ে যেতে পারে।

৩ · RTO ও RPO — ডিজাস্টার রিকভারির দুটি মূল মেট্রিক্স

যেকোনো ডিজাস্টার রিকভারি (DR) পরিকল্পনার শুরুতে দুটি প্রশ্নের উত্তর জানা দরকার —

RTORecovery Time Objectiveএকটি আউটেজের পর সিস্টেম আবার চালু হতে সর্বোচ্চ কতক্ষণ সময় লাগা মেনে নেওয়া যায়।
কতক্ষণ ডাউনটাইম মেনে নেওয়া যায়? — যেমন "৫ মিনিটের মধ্যে সিস্টেম আবার চালু হতে হবে"।
RPORecovery Point Objectiveএকটি আউটেজে সর্বোচ্চ কতটুকু ডেটা (সময়ের হিসেবে) হারানো মেনে নেওয়া যায়।
কতটুকু ডেটা হারানো মেনে নেওয়া যায়? — যেমন "শেষ ১ মিনিটের বেশি ডেটা হারানো চলবে না"।
RTO/RPO কীভাবে বিনিয়োগ ঠিক করে

RTO ০ (তাৎক্ষণিক ফেইলওভার) ও RPO ০ (একটুও ডেটা হারানো চলবে না) চাইলে সিঙ্ক্রোনাস মাল্টি-রিজিয়ন রেপ্লিকেশন দরকার — ব্যয়বহুল ও প্রতি রাইটে লেটেন্সি যোগ করে। কম কড়াকড়ি RTO/RPO (যেমন ১৫ মিনিট) মেনে নিলে সস্তা, অ্যাসিনক্রোনাস ব্যাকআপ-ভিত্তিক সমাধানই যথেষ্ট। প্রতিটি সিস্টেমের জন্য এই সংখ্যাগুলো ব্যবসায়িক প্রয়োজন (একটি ব্যাংকিং সিস্টেমের RPO প্রায় শূন্য দরকার, একটি ব্লগের নয়) থেকে আসা উচিত, প্রযুক্তিগত সুবিধা থেকে নয়।

৪ · মাল্টি-রিজিয়ন — চূড়ান্ত ডিজাস্টার রিকভারি স্ট্র্যাটেজি

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

নিচের কোড সেলে একটি active-passive ফেইলওভার সিমুলেট করা হলো — একটি primary অবজেক্ট সাধারণ রিকোয়েস্ট সার্ভ করে, তারপর একটি সিমুলেটেড ব্যর্থতা ঘটে, এবং replica-কে প্রমোট করে রিকোয়েস্ট প্রসেসিং নিরবচ্ছিন্নভাবে চলতে থাকে।

Python
class Node:
    def __init__(self, name):
        self.name = name
        self.alive = True
        self.store = {}

    def handle(self, key, value):
        if not self.alive:
            return None
        self.store[key] = value
        return f"{self.name} প্রসেস করলো: {key} = {value}"

primary = Node("Primary")
replica = Node("Replica (Standby)")
current = primary   # শুরুতে সব ট্রাফিক primary হ্যান্ডল করে

def health_check():
    return current.alive

def failover():
    global current
    print(f"[health-check] {current.name} ব্যর্থ হয়েছে বলে ধরা পড়েছে!")
    current = replica
    print(f"[failover] {replica.name} → নতুন Primary হিসেবে PROMOTE করা হলো\n")

# --- স্বাভাবিক অপারেশন ---
print(current.handle("order_101", "confirmed"))
print(current.handle("order_102", "confirmed"))

# --- সিমুলেটেড প্রাইমারি ক্র্যাশ ---
primary.alive = False
print("\n⚠️  Primary ক্র্যাশ করেছে (সিমুলেটেড)\n")

if not health_check():
    failover()

# --- ফেইলওভারের পরও রিকোয়েস্ট নিরবচ্ছিন্নভাবে চলছে ---
print(current.handle("order_103", "confirmed"))
print(current.handle("order_104", "confirmed"))

    
লক্ষ্য করুন — current ভ্যারিয়েবলটিই একমাত্র জিনিস যা বদলায় (primary থেকে replica-তে); বাকি সব কোড অপরিবর্তিত থাকে। বাস্তব সিস্টেমে এই "current" নির্ধারণ একটি DNS রেকর্ড, একটি লোড ব্যালেন্সার টার্গেট, বা একটি সার্ভিস-ডিসকভারি এন্ট্রি (L26) হতে পারে — মূলনীতি একই।
মূল কথা · Key takeaway

ফেইলওভার নিজে থেকে ম্যাজিক নয় — এটি রেপ্লিকেশন (L16), লিডার ইলেকশন (L36), ও হেলথ-চেকিং-এর একটি সমন্বিত প্রয়োগ। RTO/RPO ঠিক করে দেয় কতটা বিনিয়োগ যুক্তিসঙ্গত, এবং active-passive বনাম active-active সিদ্ধান্ত ঠিক করে খরচ বনাম জটিলতার ট্রেড-অফ কোন দিকে যাবে।

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

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

প্র ০১ একটি হেলথ-চেক টাইমআউট খুব ছোট রাখলে কী সমস্যা হতে পারে, এমনকি প্রাইমারি আসলে সুস্থ থাকলেও?

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

প্র ০২ একটি ব্যাংকিং সিস্টেম ও একটি ব্যক্তিগত ব্লগের RPO কেন সম্পূর্ণ আলাদা হওয়া উচিত?

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

প্র ০৩ Active-Active আর্কিটেকচারে রিসোর্স অপচয় কম হলেও কেন এটি সবসময় Active-Passive-এর চেয়ে ভালো পছন্দ নয়?

Active-Active-এ একাধিক নোড একসাথে একই ডেটায় লেখে — অর্থাৎ মাল্টি-মাস্টার কনফ্লিক্ট রেজোলিউশন (L16, L34) বাধ্যতামূলক হয়ে যায়। এই জটিলতা (conflict merge লজিক, কনসিস্টেন্সি গ্যারান্টি দুর্বল হওয়া) সবসময় "কম রিসোর্স অপচয়"-এর সুবিধার চেয়ে বেশি নাও হতে পারে — বিশেষ করে যেসব সিস্টেমে স্ট্রং কনসিস্টেন্সি জরুরি (যেমন ইনভেন্টরি বা পেমেন্ট)। এই কারণে অনেক প্রোডাকশন সিস্টেম ইচ্ছাকৃতভাবে সহজ Active-Passive বেছে নেয়, এমনকি কিছুটা রিসোর্স অপচয় হলেও।

অনুশীলন

  1. চিন্তা করুন: আপনার পরিচিত একটি সার্ভিস (যেমন একটি ই-কমার্স চেকআউট সিস্টেম) বেছে নিয়ে তার জন্য যুক্তিসঙ্গত RTO ও RPO অনুমান করুন এবং কারণ ব্যাখ্যা করুন।

    উদাহরণ — একটি ই-কমার্স চেকআউট: RTO ≈ ২-৫ মিনিট (এর বেশি ডাউনটাইমে সরাসরি বিক্রি হারানো শুরু হয়), RPO ≈ কাছাকাছি শূন্য (একটি হারানো অর্ডার/পেমেন্ট রেকর্ড মানে সরাসরি অর্থ ও গ্রাহকের আস্থা হারানো)। এই কড়া সংখ্যাগুলোই সিঙ্ক্রোনাস রেপ্লিকেশন ও দ্রুত স্বয়ংক্রিয় ফেইলওভারে বিনিয়োগ যুক্তিসঙ্গত করে তোলে।

  2. কোড পরিবর্তন করুন: উপরের কোড সেলে replica-কেও ব্যর্থ করে দিন (replica.alive = False) failover-এর ঠিক পরে, এবং current.handle(...) কল করে দেখুন কী হয় — এটি সিস্টেমের কোন সীমাবদ্ধতা দেখায়?

    এই পরিবর্তনের পর current.handle(...) None রিটার্ন করবে — কারণ এখন কোনো জীবিত নোড নেই। এটি দেখায় ফেইলওভার একটি একক ব্যর্থতা থেকে রক্ষা করে, কিন্তু একাধিক একযোগে ব্যর্থতা (correlated failure, যেমন পুরো রিজিয়ন ডাউন) থেকে নয় — সেজন্যই সত্যিকারের ডিজাস্টার রিকভারিতে শুধু একটি নয়, একাধিক স্বাধীন ব্যাকআপ বা মাল্টি-রিজিয়ন সেটআপ দরকার হয়।

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

পূর্ববর্তী পাঠ
L36 · লিডার ইলেকশন ও কনসেনসাস