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

কেস স্টাডি: মনোলিথ থেকে কন্টেইনারে মাইগ্রেশন

Case study: migrating a monolith to containers
১০ মিনিট পড়া উন্নত · Advanced কেস স্টাডি Python কোডসহ সম্পূর্ণ বাংলায়

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

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

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

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

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

প্রথমে অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করা হয় — প্রতিটি কম্পোনেন্টের জন্য আলাদা Dockerfile লেখা হয় (M6/L23), হার্ডকোডেড কনফিগারেশন (ডেটাবেস URL, ফিচার-ফ্ল্যাগ) সরিয়ে ConfigMap/এনভায়রনমেন্ট ভ্যারিয়েবলে বের করে আনা হয় (M7/L30, M9/L38-এর এক্সটার্নালাইজেশন নীতি) — এতে একই ইমেজ dev/staging/production-এ ভিন্ন কনফিগ নিয়ে চলতে পারে। প্রতিটি কমিটে একটি CI পাইপলাইন (M8/L33) নতুন ইমেজ বিল্ড ও স্ক্যান (M6/L26) করে — কোনো known-vulnerable প্যাকেজ পেলে পাইপলাইন ফেল-ফাস্ট থামে। প্রতিটি মাইগ্রেটেড কম্পোনেন্ট একটি Kubernetes Deployment/Service জোড়া (M7/L28-29) হিসেবে ডিপ্লয় হয়, এবং প্রতিটি কাটওভার একটি ঝুঁকিপূর্ণ এক-ধাক্কা সুইচের বদলে একটি ধীর, ক্যানারি-স্টাইল রোলআউটে হয় (M8/L37)।

৩ · মূল ট্রেড-অফ — ইনক্রিমেন্টাল বনাম বিগ-ব্যাং

স্ট্র্যাংলার-ফিগ বনাম বিগ-ব্যাং

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

ক্লায়েন্ট Client রাউটার (L14 পথ-ভিত্তিক) Strangler Router পুরনো মনোলিথ (VM) অ-মাইগ্রেটেড কম্পোনেন্ট নতুন কন্টেইনার (K8s) মাইগ্রেটেড কম্পোনেন্ট
প্রতিটি কম্পোনেন্ট আলাদাভাবে মাইগ্রেট হয় — রাউটার (L14-এর পথ-ভিত্তিক রাউটিং প্যাটার্নের পুনঃব্যবহার) ঠিক করে কোন সিস্টেম কোন রিকোয়েস্ট সামলাবে।

৪ · কোড — স্ট্র্যাংলার-ফিগ মাইগ্রেশন ট্র্যাকার

নিচের কোডে প্রতিটি অ্যাপ্লিকেশন কম্পোনেন্টের মাইগ্রেশন স্ট্যাটাস ট্র্যাক করা হয়, এবং L14-এর পথ-ভিত্তিক রাউটিং প্যাটার্ন পুনঃব্যবহার করে প্রতিটি কম্পোনেন্টের জন্য বর্তমান রাউটিং সিদ্ধান্ত (পুরনো নাকি নতুন সিস্টেম) দেখানো হয়।

Python
# প্রতিটি মনোলিথ কম্পোনেন্টের মাইগ্রেশন স্ট্যাটাস
components = {
    "ইউজার অথেন্টিকেশন":   {"migrated": True},
    "প্রোডাক্ট ক্যাটালগ":    {"migrated": True},
    "চেকআউট/পেমেন্ট":       {"migrated": False},
    "রিপোর্টিং":            {"migrated": False},
}

def routing_decision(component_info):
    # L14-এর পথ-ভিত্তিক রাউটিং প্যাটার্নের পুনঃব্যবহার — মাইগ্রেটেড হলে নতুন সিস্টেমে, নাহলে পুরনো মনোলিথে
    return "নতুন কন্টেইনারাইজড সার্ভিস (K8s)" if component_info["migrated"] else "পুরনো মনোলিথ (VM)"

def migration_progress(components):
    total = len(components)
    migrated = sum(1 for info in components.values() if info["migrated"])
    pct = (migrated / total) * 100
    return migrated, total, pct

print("=== বর্তমান রাউটিং সিদ্ধান্ত ===")
for name, info in components.items():
    print(f"{name:20}-> {routing_decision(info)}")

migrated_count, total_count, pct_done = migration_progress(components)
print(f"\nমাইগ্রেশন অগ্রগতি: {migrated_count}/{total_count} কম্পোনেন্ট মাইগ্রেটেড ({pct_done:.0f}%)")

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

৫ · ফলাফল

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

মূল কথা · Key takeaway

একটি বড় মাইগ্রেশন সবসময় একটি একক "প্রজেক্ট" নয় — এটি এই কোর্সের ইতিমধ্যে শেখা ছোট ছোট, স্বাধীনভাবে প্রমাণিত কৌশলের (Dockerfile, কনফিগ এক্সটার্নালাইজেশন, CI স্ক্যানিং, K8s ডিপ্লয়মেন্ট, ক্যানারি রোলআউট) একটি সুশৃঙ্খল, ইনক্রিমেন্টাল প্রয়োগ।

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

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

প্র ০১ কেন "চেকআউট/পেমেন্ট" কম্পোনেন্টটি স্ট্র্যাংলার-ফিগ মাইগ্রেশনে সবচেয়ে শেষে মাইগ্রেট করা যুক্তিসঙ্গত?

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

প্র ০২ পুরনো মনোলিথ ও নতুন কন্টেইনারাইজড সার্ভিস একসাথে চলাকালীন কোন অতিরিক্ত অপারেশনাল জটিলতা তৈরি হয়?

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

প্র ০৩ এই কেস স্টাডিতে CI পাইপলাইনে ইমেজ স্ক্যানিং (M6/L26) বাদ দেওয়া হলে কী ঝুঁকি তৈরি হতো?

একটি vulnerable dependency সহ একটি ইমেজ সরাসরি প্রোডাকশনে পৌঁছে যেতে পারত — বিশেষ করে যেহেতু মাইগ্রেশনের সময় প্রচুর নতুন কোড ও ডিপেন্ডেন্সি একসাথে পরিবর্তিত হচ্ছে (উচ্চ পরিবর্তনের হার = ভুল হওয়ার বেশি সুযোগ)। স্ক্যানিংকে একটি বাধ্যতামূলক, স্বয়ংক্রিয় পাইপলাইন গেট রাখা (ঐচ্ছিক না রেখে) নিশ্চিত করে মাইগ্রেশনের তাড়াহুড়োতেও এই নিরাপত্তা ধাপটি কখনো এড়িয়ে যাওয়া যাবে না।

অনুশীলন

  1. পরীক্ষা করুন: উপরের কোডে "চেকআউট/পেমেন্ট"-এর migrated মান True-তে পাল্টান এবং কোড আবার চালিয়ে দেখুন রাউটিং সিদ্ধান্ত ও অগ্রগতি শতাংশ কীভাবে পাল্টায়।

    পরিবর্তনের পর "চেকআউট/পেমেন্ট"-এর রাউটিং সিদ্ধান্ত "নতুন কন্টেইনারাইজড সার্ভিস (K8s)"-এ পাল্টে যাবে, এবং অগ্রগতি ৫০% থেকে ৭৫%-এ উঠবে (৪টির মধ্যে ৩টি মাইগ্রেটেড) — দেখাচ্ছে ট্র্যাকারটি সহজেই যেকোনো মুহূর্তের মাইগ্রেশন অবস্থা প্রতিফলিত করতে পারে।

  2. চিন্তা করুন: আপনার পরিচিত কোনো মনোলিথিক অ্যাপ্লিকেশনের (বাস্তব বা কাল্পনিক) কম্পোনেন্টগুলো কোন ক্রমে মাইগ্রেট করা উচিত বলে মনে করেন, এবং কেন?

    সাধারণ নীতি: সবচেয়ে কম ঝুঁকিপূর্ণ, সবচেয়ে বেশি স্বাধীন (অন্য কম্পোনেন্টের উপর কম নির্ভরশীল) কম্পোনেন্ট দিয়ে শুরু করুন — এটি টিমকে নতুন টুলচেইনে অভ্যস্ত হতে দেয় প্রকৃত ব্যবসায়িক ঝুঁকি ছাড়াই, তারপর ধীরে ধীরে বেশি জটিল/ঝুঁকিপূর্ণ কম্পোনেন্টের দিকে এগোন।

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

আগের পাঠ
মাল্টি-ক্লাউড ও ভেন্ডর লক-ইন কৌশল