ব্লগ

কীভাবে ডিপ্লয়ে আমরা 502 এরর শূন্যে নামিয়ে আনলাম

প্রতিবার Mythex-এর ব্যাকএন্ড ডিপ্লয় করার সময় কয়েকটি অনুরোধ 502 Bad Gateway দিয়ে ব্যর্থ হতো। সংখ্যায় বেশি নয় — কিন্তু ডিপ্লয়ের সময় 502 মানে কারও ক্লিক কিছুই করেনি, বা কেউ যে বিল্ড দেখছিল তা মুহূর্তের জন্য থেমে গেছে। আমরা এটি দুটি আলাদা সমস্যায় খুঁজে পেয়েছি: একটি স্ব-নিরাময় ওয়াচডগ যা আমাদের ডিপ্লয়ের সঙ্গে লড়ছিল, এবং একটি ফাঁক — সার্ভার শোনা বন্ধ করা আর লোড ব্যালেন্সার তাকে ট্রাফিক পাঠানো বন্ধ করার মধ্যে। সমাধানের পর পরপর তিনটি প্রোডাকশন ডিপ্লয়ে সংখ্যাটি ১০ থেকে ৬ এবং শেষে ০-তে নেমেছে।

সেটআপ

আমাদের API ও অর্কেস্ট্রেটর একটি ছোট সার্ভার-গ্রুপে কন্টেইনার হিসেবে চলে, একটি AWS Application Load Balancer (ALB)-এর পেছনে। একটি ডিপ্লয় একবারে একটি সার্ভার আপডেট করে: পুরনো কন্টেইনার ড্রেন করে, নতুন চালু করে, তারপর পরেরটিতে যায়। প্রতিটি সার্ভারে একটি ওয়াচডগ নিশ্চিত করে কন্টেইনারগুলো চালু আছে এবং যা বন্ধ তা আবার চালু করে — যাতে রাত ৩টায় ক্র্যাশ করা প্রসেস কাউকে না জাগিয়েই ফিরে আসে।

এই দুটোই নিজে নিজে যুক্তিসঙ্গত। একসঙ্গে তারা যুক্তিসঙ্গত ছিল না।

সমস্যা ১: ওয়াচডগ ডিপ্লয়ের সঙ্গে দৌড়াচ্ছিল

ওয়াচডগ প্রতি মিনিটে একবার চলত এবং একটি ব্যর্থ হেলথ চেকেই "সুস্থ" করার চেষ্টা করত। একটি ডিপ্লয় ইচ্ছা করেই সেবাগুলো 150 সেকেন্ড পর্যন্ত ড্রেন করে — এই সময়ে হেলথ চেক ব্যর্থ হওয়াটাই প্রত্যাশিত। তাই প্রতিটি ডিপ্লয়ের সময়ই ওয়াচডগ সক্রিয় হতো।

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

সমাধানগুলো:

  • একটি লক। ডিপ্লয় এখন সার্ভারের বুটস্ট্র্যাপ স্ক্রিপ্টের মতো একই ফাইল-লক নেয়, তাই ওয়াচডগ ও ডিপ্লয় কখনো একসঙ্গে চলতে পারে না।
  • একটির বদলে চারবার। ওয়াচডগ কাজ করার আগে পরপর চারটি ব্যর্থ চেক দরকার। ড্রেন হওয়া সেবা আর মৃত মনে হয় না।
  • একটিই সংজ্ঞা। কম্পোজ ফাইল এখন একটি উৎস থেকে সার্ভারে প্রকাশিত হয়, অনুলিপিগুলো আলাদা হয়ে যাওয়ার সুযোগ নেই।
  • বিশ্বাস নয়, যাচাই। ডিপ্লয় জব আর কোনো কমান্ড ফিরে এলেই পাস করে না। সফল হওয়ার আগে প্রতিটি সার্ভারের API, অর্কেস্ট্রেটর, গেটওয়ে ও পাবলিশ ওয়ার্কার যাচাই করে।

সমস্যা ২: ট্রাফিক যাওয়ার আগেই সার্ভার চলে গেল

দ্বিতীয় সমস্যাটি নীরব ছিল। যখন ডিপ্লয় একটি সার্ভার ড্রেন করে, সার্ভার তার হেলথ এন্ডপয়েন্টে 503 দিতে শুরু করে, যাতে লোড ব্যালেন্সার তাকে রোটেশন থেকে সরিয়ে দেয়। আমাদেরটি ৫ সেকেন্ড এভাবে চলত, তারপর বন্ধ হতো।

কিন্তু ALB নির্দিষ্ট ব্যবধানে মাত্র হেলথ চেক করত, এবং কোনো টার্গেটে ট্রাফিক বন্ধ করার আগে পরপর কয়েকটি ব্যর্থ চেক দরকার ছিল — শুরু থেকে শেষ পর্যন্ত প্রায় ৬০ সেকেন্ড পর্যন্ত। ফলে প্রায় ৫৫ সেকেন্ড ধরে লোড ব্যালেন্সার এমন সার্ভারে আসল অনুরোধ পাঠাচ্ছিল, যা শোনা বন্ধ করে দিয়েছে। সেগুলোই ছিল আমাদের 502।

সমাধান ছিল দুটি সময়রেখাকে মেলানো:

  • টার্গেট গ্রুপ এখন প্রতি ৫ সেকেন্ডে চেক করে এবং ২টি ব্যর্থতার পর একটি টার্গেটকে অসুস্থ ঘোষণা করে — ধরতে প্রায় ১০ সেকেন্ড লাগে।
  • ড্রেন হেলথ চেক ব্যর্থ করা শুরু করার পরও ১৫ সেকেন্ড আসল ট্রাফিক পরিবেশন করে, তাই সবসময় সময়ের মিল থাকে।
  • এই সেটিংগুলো কনসোলে কেউ একবার ক্লিক করে ঠিক করেনি; আছে সেই স্ক্রিপ্টে যা ইনফ্রাস্ট্রাকচার তৈরি করে।

সংখ্যাগুলোকে একে অপরের সঙ্গে মিলিয়ে রাখা

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

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

ডিপ্লয় মাপা সহজে ভুল হয়

আমাদের প্রথম পরিমাপ বলেছিল একটি পরিষ্কার ডিপ্লয়ের প্রায় ৩% ভেঙেছে। আসলে তা ভাঙেনি। আমরা প্রতিটি নন-200 রেসপন্স গুনছিলাম, অথচ ড্রেনের সময় হেলথ এন্ডপয়েন্টের 503 কোনো ব্যর্থতা নয় — এটি ড্রেন তার কাজ করছে, লোড ব্যালেন্সারকে জানাচ্ছে ওই সার্ভার যেন না বেছে নেওয়া হয়, যখন সে এখনো আসল অনুরোধ পরিবেশন করছে।

ব্যবহারকারী যা অনুভব করেন তা হলো 502: অনুরোধ এমন কিছুতে পৌঁছেছে যা কিছুই পায়নি। শুধু এগুলো গুনে আসল ছবি পাওয়া গেল — তিনটি প্রোডাকশন ডিপ্লয়ে ১০, তারপর ৬, তারপর ০।

আমরা যা শিখলাম

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

Mythex-এ কোনো অ্যাপ প্রকাশ করলে এর কিছুই আপনার চোখে পড়বে না — আর সেটাই উদ্দেশ্য। সম্পর্কিত: আপনি আপডেট করার সময় প্রকাশিত অ্যাপ কীভাবে চালু থাকে।

Mythex · Pricing · AI দিয়ে যা খুশি বানান · ওয়েবসাইট ও অ্যাপের টেমপ্লেট · Mythex-এর তুলনা · AI অ্যাপ তৈরির শব্দকোষ · AI অ্যাপ তৈরির বিনামূল্যের টুল · English

English አማርኛ العربية Български Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)