ബ്ലോഗ്

ഡിപ്ലോയ് സമയത്തെ 502 പിശകുകൾ പൂജ്യത്തിലേക്ക് എത്തിച്ചത് എങ്ങനെ

ഓരോ തവണയും Mythex-ന്റെ ബാക്ക്എൻഡ് ഡിപ്ലോയ് ചെയ്യുമ്പോൾ, കുറച്ച് അഭ്യർത്ഥനകൾ 502 Bad Gateway ലഭിച്ചു പരാജയപ്പെട്ടു. എണ്ണം വലുതല്ല — പക്ഷേ ഡിപ്ലോയ് സമയത്തെ 502 എന്നാൽ ആരുടെയെങ്കിലും ക്ലിക്ക് ഒന്നും ചെയ്തില്ല, അല്ലെങ്കിൽ കാത്തിരുന്ന ബിൽഡ് ഒരു നിമിഷം നിന്നുപോയി എന്നാണ്. ഇത് രണ്ട് വേറിട്ട പ്രശ്നങ്ങളിലേക്ക് എത്തി: ഡിപ്ലോയ്കളോട് പോരടിച്ച ഒരു സ്വയം-സുഖപ്പെടുത്തുന്ന വാച്ച്ഡോഗ്; സെർവർ കേൾക്കുന്നത് നിർത്തിയതും ലോഡ് ബാലൻസർ അതിലേക്കുള്ള ട്രാഫിക് നിർത്തിയതും തമ്മിലുള്ള വിടവ്. ശരിയാക്കലുകൾക്ക് ശേഷമുള്ള തുടർച്ചയായ മൂന്ന് പ്രൊഡക്ഷൻ ഡിപ്ലോയ്കളിൽ എണ്ണം 10 → 6 → 0 ആയി കുറഞ്ഞു.

പശ്ചാത്തലം

ഞങ്ങളുടെ API-യും ഓർക്കസ്ട്രേറ്ററും AWS Application Load Balancer (ALB) പിന്നിലുള്ള ഒരു ചെറിയ സെർവർ കൂട്ടത്തിൽ കണ്ടെയ്നറുകളായി ഓടുന്നു. ഒരു ഡിപ്ലോയ് ഒരു സമയം ഒരു സെർവർ മാത്രം അപ്ഡേറ്റ് ചെയ്യുന്നു: പഴയ കണ്ടെയ്നറുകൾ ഒഴിപ്പിക്കുന്നു, പുതിയവ തുടങ്ങുന്നു, പിന്നെ അടുത്ത സെർവറിലേക്ക് പോകുന്നു. ഓരോ സെർവറിലും ഒരു വാച്ച്ഡോഗ് കണ്ടെയ്നറുകൾ ഉയർന്നിട്ടുണ്ടോ എന്ന് പരിശോധിച്ച് പ്രവർത്തിക്കാത്തവയെ റീസ്റ്റാർട്ട് ചെയ്യുന്നു — രാത്രി 3 മണിക്ക് ക്രാഷായ ഒരു പ്രോസസ് ആരെയും ഉണർത്താതെ തിരിച്ചുവരണം എന്നതിനാണ് ഇത്.

രണ്ടും ഒറ്റയ്ക്ക് ന്യായമാണ്. ഒരുമിച്ചാകുമ്പോൾ അവ ചേരുന്നില്ല.

പ്രശ്നം 1: വാച്ച്ഡോഗ് ഡിപ്ലോയുമായി മത്സരിച്ചു

വാച്ച്ഡോഗ് ഓരോ മിനിറ്റിലും ഒരിക്കൽ ഓടി, ഒറ്റ പരാജയപ്പെട്ട ഹെൽത്ത് ചെക്കിൽ 'ചികിത്സിച്ചു'. ഡിപ്ലോയ് മനഃപൂർവം 150 സെക്കൻഡ് വരെ സേവനങ്ങളെ ഒഴിപ്പിക്കുന്നു — ആ സമയത്ത് ഹെൽത്ത് ചെക്ക് പരാജയപ്പെടേണ്ടതാണ്. അതിനാൽ ഓരോ ഡിപ്ലോയിലും വാച്ച്ഡോഗ് പ്രവർത്തിച്ചു.

മിക്കപ്പോഴും മത്സരം ദോഷമില്ലാതെ തോറ്റു. ഒരിക്കൽ അത് ജയിച്ചു: ഡിപ്ലോയുടെ മധ്യത്തിൽ അത് compose ഫയൽ (ഏത് കണ്ടെയ്നറുകൾ ഓടണമെന്ന വിവരണം) വീണ്ടും എഴുതി, ഒരു സെർവറിൽ ഗേറ്റ്‌വേ കണ്ടെയ്നർ ഇല്ലാതെയാക്കി — ഡിപ്ലോയ് ജോബ് വിജയം റിപ്പോർട്ട് ചെയ്തപ്പോഴും.

പരിഹാരങ്ങൾ:

  • ഒരൊറ്റ ലോക്ക്. ഡിപ്ലോയ് ഇപ്പോൾ സെർവറിന്റെ bootstrap സ്ക്രിപ്റ്റിന്റെ അതേ ഫയൽ ലോക്ക് എടുക്കുന്നു, അതിനാൽ വാച്ച്ഡോഗും ഡിപ്ലോയും ഒരേ സമയം ഓടില്ല.
  • നാല് തവണ, ഒന്നല്ല. തുടർച്ചയായ നാല് പരാജയപ്പെട്ട പരിശോധനകൾക്ക് ശേഷമേ വാച്ച്ഡോഗ് പ്രവർത്തിക്കൂ. ഒഴിപ്പിക്കപ്പെടുന്ന സേവനം ഇനി ചത്തതായി തോന്നില്ല.
  • ഒരൊറ്റ നിർവചനം. compose ഫയലിന് ഇപ്പോൾ ഒരേയൊരു ഉറവിടമേയുള്ളൂ, സെർവറുകളിലേക്ക് പ്രസിദ്ധീകരിക്കുന്നത്; പകർപ്പുകൾ വ്യതിചലിക്കില്ല.
  • വിശ്വസിക്കരുത്, പരിശോധിക്കുക. ഒരു കമാൻഡ് തിരിച്ചുവന്നു എന്നതുകൊണ്ട് ഡിപ്ലോയ് ജോബ് ഇനി വിജയിക്കില്ല. ഓരോ സെർവറിലെയും API, ഓർക്കസ്ട്രേറ്റർ, ഗേറ്റ്‌വേ, പബ്ലിഷ് വർക്കർ എന്നിവ പരിശോധിച്ചിട്ടേ വിജയിക്കൂ.

പ്രശ്നം 2: ട്രാഫിക് നിർത്തുന്നതിന് മുമ്പ് സെർവർ പോയി

രണ്ടാമത്തേത് കൂടുതൽ നിശ്ശബ്ദമായിരുന്നു. ഡിപ്ലോയ് ഒരു സെർവർ ഒഴിപ്പിക്കുമ്പോൾ, സെർവർ ഹെൽത്ത് എൻഡ്പോയിന്റിൽ 503 നൽകാൻ തുടങ്ങുന്നു, അങ്ങനെ ലോഡ് ബാലൻസർ അതിനെ റൊട്ടേഷനിൽ നിന്ന് മാറ്റുന്നു. ഞങ്ങളുടേത് 5 സെക്കൻഡ് അങ്ങനെ ചെയ്തു, പിന്നെ അടഞ്ഞു.

പക്ഷേ ALB ഇടയ്ക്കിടെ മാത്രമേ ഹെൽത്ത് പരിശോധിക്കൂ, ഒരു ടാർഗെറ്റിലേക്കുള്ള റൂട്ടിങ് നിർത്തുന്നതിന് മുമ്പ് തുടർച്ചയായി നിരവധി പരാജയങ്ങൾ വേണം — ആകെ ഏകദേശം 60 സെക്കൻഡ് വരെ. അതിനാൽ ഏകദേശം 55 സെക്കൻഡ് നേരത്തേക്ക്, കേൾക്കുന്നത് നിർത്തിയ സെർവറിലേക്ക് ലോഡ് ബാലൻസർ യഥാർത്ഥ അഭ്യർത്ഥനകൾ അയച്ചുകൊണ്ടിരുന്നു. അവയായിരുന്നു ഞങ്ങളുടെ 502-കൾ.

പരിഹാരം രണ്ട് ടൈംലൈനുകളെ യോജിപ്പിക്കുകയായിരുന്നു:

  • ടാർഗെറ്റ് ഗ്രൂപ്പ് ഇപ്പോൾ ഓരോ 5 സെക്കൻഡിലും പരിശോധിക്കുന്നു, 2 പരാജയങ്ങൾക്ക് ശേഷം ടാർഗെറ്റിനെ അനാരോഗ്യകരമായി അടയാളപ്പെടുത്തുന്നു — ശ്രദ്ധിക്കാൻ ഏകദേശം 10 സെക്കൻഡ്.
  • ഹെൽത്ത് ചെക്കുകൾ പരാജയപ്പെട്ടു തുടങ്ങിയ ശേഷവും ഒഴിപ്പിക്കൽ 15 സെക്കൻഡ് യഥാർത്ഥ ട്രാഫിക് സേവിക്കുന്നത് തുടരുന്നു, എപ്പോഴും ഓവർലാപ്പ് ഉറപ്പാക്കാൻ.
  • ഈ ക്രമീകരണങ്ങൾ ഒരു കൺസോളിൽ ആരോ ഒരിക്കൽ ക്ലിക്ക് ചെയ്ത ഇടത്തല്ല, ഇൻഫ്രാസ്ട്രക്ചർ ഒരുക്കുന്ന സ്ക്രിപ്റ്റിലാണ്.

സംഖ്യകൾ പരസ്പരം പിടിച്ചുനിർത്തുന്നത്

ഇങ്ങനെയുള്ള ടൈംഔട്ടുകൾ പരസ്പരം ആശ്രയിക്കുന്നു. ഒഴിപ്പിക്കൽ ലോഡ് ബാലൻസർ ശ്രദ്ധിക്കാൻ വേണ്ട സമയത്തേക്കാൾ നീളണം; ഒഴിപ്പിക്കലും ഷട്ട്ഡൗണും ചേർന്ന് കണ്ടെയ്നർ നിർബന്ധമായി കൊല്ലുന്നതിന് മുമ്പ് തീരണം. ആറ് മാസം കഴിഞ്ഞ് ആരെങ്കിലും ഒരു സംഖ്യ മാറ്റി ബഗ് വീണ്ടും കൊണ്ടുവരുന്നത് എളുപ്പമാണ്.

അതിനാൽ ഈ ബന്ധങ്ങൾ ടെസ്റ്റുകളായി എഴുതി വച്ചു: ഒഴിപ്പിക്കൽ ഹെൽത്ത്-ചെക്ക് ഇടവേള × പരാജയ പരിധിയേക്കാൾ നീളണം; വീണ്ടും ആരോഗ്യകരമായി അടയാളപ്പെടാൻ എടുക്കുന്ന സമയം ചെറുതായിരിക്കണം; മുഴുവൻ ഒഴിപ്പിക്കലും കണ്ടെയ്നറിന്റെ stop grace period-ൽ ഒതുങ്ങണം. ഒരു സംഖ്യ മാത്രം മാറ്റിയാൽ മറ്റുള്ളവ ഇല്ലാതെ CI പരാജയപ്പെടും. ടെസ്റ്റുകളെ തന്നെ mutation-test ചെയ്തു — ഓരോ സംഖ്യയും തെറ്റായ മൂല്യത്തിലേക്ക് മാറ്റി ഒരു ടെസ്റ്റ് അത് പിടിച്ചോ എന്ന് പരിശോധിച്ചു.

ഡിപ്ലോയ് അളക്കുന്നത് തെറ്റാൻ എളുപ്പമാണ്

ആദ്യത്തെ അളവ് പറഞ്ഞത്, ശുദ്ധമായ ഒരു ഡിപ്ലോയ് ഏകദേശം 3% തകർന്നു എന്നാണ്. അങ്ങനെ ആയിരുന്നില്ല. ഞങ്ങൾ 200 അല്ലാത്ത ഓരോ പ്രതികരണവും എണ്ണിയിരുന്നു, പക്ഷേ ഒഴിപ്പിക്കൽ സമയത്ത് ഹെൽത്ത് എൻഡ്പോയിന്റിൽ നിന്നുള്ള 503 ഒരു പരാജയമല്ല — അത് ഒഴിപ്പിക്കൽ അതിന്റെ ജോലി ചെയ്യുന്നതാണ്: യഥാർത്ഥ അഭ്യർത്ഥനകൾ സേവിക്കുന്നത് തുടരുമ്പോൾ ആ സെർവർ തിരഞ്ഞെടുക്കരുതെന്ന് ലോഡ് ബാലൻസറിനോട് പറയുന്നു.

ഉപയോക്താക്കൾക്ക് അനുഭവപ്പെടുന്നത് 502 ആണ്: അഭ്യർത്ഥന ഒന്നിലും എത്തിയില്ല. അവ മാത്രം എണ്ണിയപ്പോൾ യഥാർത്ഥ ചിത്രം കിട്ടി — മൂന്ന് പ്രൊഡക്ഷൻ ഡിപ്ലോയ്കളിൽ 10, പിന്നെ 6, പിന്നെ 0.

ഇതിൽ നിന്ന് ഞങ്ങൾ പഠിച്ചത്

  • സ്വയം-സുഖപ്പെടുത്തലിന് ആസൂത്രിത downtime അറിയണം. ഡിപ്ലോയും ക്രാഷും തമ്മിൽ വേർതിരിച്ചറിയാനാകാത്ത വാച്ച്ഡോഗ് ഒടുവിൽ ഡിപ്ലോയോട് പോരടിക്കും.
  • ഒഴിപ്പിക്കൽ ഒരു കൈകൊടുക്കലാണ്. ലോഡ് ബാലൻസർ ട്രാഫിക് അയയ്ക്കുന്നത് നിർത്തിയെന്ന് തെളിയുന്നത് വരെ സെർവർ സേവനം തുടരണം; ആ സമയക്രമം സെർവറിലല്ല, ബാലൻസറിലാണ് സജ്ജമാക്കുന്നത്.
  • ബന്ധങ്ങൾ ടെസ്റ്റുകളായി എഴുതുക. ഓപ്പറേഷണൽ സംഖ്യകൾ മാറിപ്പോകും. പരസ്പരം ബന്ധിപ്പിക്കുന്ന ടെസ്റ്റുകൾ അങ്ങനെ മാറില്ല.
  • അളക്കുന്നതിന് മുമ്പ് എന്താണ് അളക്കുന്നതെന്ന് തീരുമാനിക്കുക. "പിശകുകൾ" തെറ്റായ മെട്രിക് ആയിരുന്നു; "ഒന്നിലും എത്താത്ത അഭ്യർത്ഥനകൾ" ശരിയായിരുന്നു.

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 简体中文 繁體中文(香港) 繁體中文(台灣)