etcd ഉപയോഗിച്ച് ഏഷ്യ-പസഫിക് വീഡിയോ ട്രാഫിക് റൂട്ട് ചെയ്യുന്നു

എട്ട് ഏഷ്യ-പസഫിക് വിപണികളിൽ സേവനം നൽകുന്ന ഒരു വീഡിയോ-സ്ട്രീമിംഗ് പ്ലാറ്റ്‌ഫോം, റീജിയൻ-സ്പെസിഫിക് കോൺഫിഗറേഷനുകൾ etcd-ലേക്ക് മാറ്റുന്നതിലൂടെ ആവർത്തിച്ചു വരുന്ന റൂട്ടിംഗ് പിശകുകൾ ഒഴിവാക്കി. റൂട്ടിംഗ് മാറ്റങ്ങൾ പടരുന്ന സമയം (propagation time) ഏകദേശം ഒരു സെക്കൻഡായി കുറഞ്ഞു. എഡിറ്റർമാർക്ക് കോഡിൽ മാറ്റം വരുത്താതെ തന്നെ ഏതാനും മണിക്കൂറത്തേക്ക് ഒരു മ്യൂസിക് പൂൾ ബൂസ്റ്റ് ചെയ്യാൻ സാധിക്കുന്നു, കൂടാതെ ദക്ഷിണ കൊറിയൻ പ്രേക്ഷകർക്ക് ടോക്കിയോ ഫീഡ് അയക്കുന്നത് പ്ലാറ്റ്‌ഫോം നിർത്തിവെച്ചു.

പഴയ രീതി പരാജയപ്പെട്ടത് എന്തുകൊണ്ട്

ഓരോ റിക്വസ്റ്റിനും ഓരോ റൂട്ടറും മൂന്ന് മൂല്യങ്ങൾ വായിക്കുന്നു: ട്രെൻഡിംഗ് പൂൾ, ഭാഷാപരമായ ടോക്കണൈസർ (language-specific tokenizer), ഒരു ഫാള்பാക്ക് ചെയിൻ (fallback chain). ബിസിനസ്സ് തീരുമാനങ്ങളാണ്—ഒരു പുതിയ കലാകാരനെ പ്രമോട്ട് ചെയ്യുക, ഒരു റീജിയണൽ ഔട്ടേജ് പ്രതികരിക്കുക, ഒരു റെക്കമെൻഡേഷൻ അൽഗോരിതം പരിശോധിക്കുക—ഈ മൂല്യങ്ങളെ നിയന്ത്രിച്ചിരുന്നത്, കോഡ് മാറ്റങ്ങളല്ല.

തുടക്കത്തിൽ ഓരോ ഡിപ്ലോയ്മെന്റിലും റൂട്ടിംഗ് ടേബിൾ ഉൾപ്പെടുത്തിയ ഒരു JSON ഫയൽ ഉണ്ടായിരുന്നു. ഒരു ഇൻസിഡന്റ് സമയത്ത്, ഓൺ-കോൾ എഞ്ചിനീയർ ട്രാഫിക് ഒരു ബാക്കപ്പ് പൂളിലേക്ക് തിരിച്ചുവിടാൻ ഒരു നോഡിലെ ഫയൽ എഡിറ്റ് ചെയ്തു, എന്നാൽ മറ്റ് ഏഴ് നോഡുകളിൽ അത് അപ്ഡേറ്റ് ചെയ്തില്ല. കോൺഫിഗറേഷൻ വ്യതിയാനം (Config drift) ഉണ്ടായി: എട്ട് രാജ്യങ്ങളും വ്യത്യസ്തമായ ടേബിളുകൾ ഉപയോഗിച്ചു, ഒരൊറ്റ സ്രോതസ്സും "യഥാർത്ഥ വിവരങ്ങൾ" (truth) പരിശോധിച്ചില്ല. സോൾ പ്രേക്ഷകരെ ടോക്കിയോയിലേക്ക് അയക്കുന്ന ബഗ് നിലനിന്നു, കാരണം കോഡ് മാറ്റമില്ലാതെ തുടർന്നു; മറഞ്ഞിരിക്കുന്ന കോൺഫിഗറേഷൻ മാത്രമാണ് വ്യത്യാസപ്പെട്ടിരുന്നത്.

ഒരൊറ്റ സ്രോതസ്സായി (single source of truth) etcd തിരഞ്ഞെടുക്കുന്നു

ടീം മൂന്ന് ഓപ്ഷനുകൾ താരതമ്യം ചെയ്തു:

  • SQLite/MySQL – ഓരോ റൂട്ടറും ഒരു ഡാറ്റാബേസ് പോൾ (poll) ചെയ്യാൻ നിർബന്ധിതമാക്കും, ഇത് ലേറ്റൻസി കൂട്ടുകയോ ക്വറികൾ വർദ്ധിപ്പിക്കുകയോ ചെയ്യും.
  • Consul – മികച്ച ഒരു സർവീസ്-ഡിസ്കവറി ടൂൾ ആണ്, പക്ഷേ പ്ലാറ്റ്‌ഫോമിന് അതിന്റെ മുഴുവൻ മെഷ് ഫീച്ചറുകളും ആവശ്യമില്ലായിരുന്നു.
  • etcd – ഒരു കീ മാറുന്ന നിമിഷം തന്നെ ക്ലയന്റുകളെ അറിയിക്കുന്ന watch പ്രിമിറ്റീവ് ഉള്ള ശക്തമായ കൺസിസ്റ്റൻസി (strongly consistent) ഉള്ള ഒരു കീ-വാല്യൂ സ്റ്റോർ.

'watch' ഫീച്ചറാണ് ഇതിനെ വിജയിപ്പിച്ചത്. ഓരോ റൂട്ടറും ആവർത്തിച്ച് "എന്തെങ്കിലും മാറിയോ?" എന്ന് ചോദിക്കുന്നതിന് പകരം, etcd ഒരു അപ്ഡേറ്റ് നൽകുന്നത് വരെ റൂട്ടറുകൾ നിശബ്ദമായി ഇരുന്നു. അനാവശ്യ നെറ്റ്വർക്ക് ട്രാഫിക് ഇല്ലാതാവുകയും ഓരോ ഇൻസ്റ്റൻസും ഒരേസമയം മാറ്റങ്ങളെക്കുറിച്ച് അറിയുകയും ചെയ്തു.

സിസ്റ്റത്തെ സുരക്ഷിതമായി നിലനിർത്തുന്ന പാറ്റേണുകൾ

Etcd മാത്രം എല്ലാ റിസ്കുകളും പരിഹരിച്ചില്ല. എഞ്ചിനീയർമാർ മൂന്ന് അനുബന്ധ പാറ്റേണുകൾ കൂടി ചേർത്തു:

  1. Leases – ഒരു എഡിറ്റർക്ക് താൽക്കാലികമായ ഒരു ബൂസ്റ്റ് സെറ്റ് ചെയ്യാൻ കഴിയും (ഉദാഹരണത്തിന്, ആറ് മണിക്കൂർ നേരത്തേക്ക് കൊറിയൻ-പോപ്പ് പൂളിന്റെ വെയ്റ്റ് വർദ്ധിപ്പിക്കുക). ലീസ് തനിയെ അവസാനിക്കുന്നതിനാൽ, മാനുവൽ റോളബാക്ക് ഇല്ലാതെ തന്നെ ബൂസ്റ്റ് ഇല്ലാതാകും.
  2. Compare-and-swap (CAS) – രണ്ട് ആളുകൾ ഒരേ സമയം ഒരേ സെറ്റിംഗ് എഡിറ്റ് ചെയ്യുമ്പോൾ, CAS ഒരാൾക്ക് പരാജയം അറിയിക്കുന്നു, ഇത് നിശബ്ദമായ ഓവർറൈറ്റുകൾ തടയുന്നു.
  3. Sidecar process – ദീർഘകാല കണക്ഷനുകൾ കൈകാര്യം ചെയ്യുന്നതിൽ PHP ബുദ്ധിമുട്ടുന്നുണ്ട്. ഓരോ ബോക്സിലും ഒരു ചെറിയ Go sidecar etcd നിരീക്ഷിക്കുകയും റൂട്ടിംഗ് ടേബിളിന്റെ ഒരു സ്നാപ്പ്ഷോട്ട് ഒരു ഷെയർഡ് മെമ്മറി ഫയലിലേക്ക് (/dev/shm) എഴുതുകയും ചെയ്യുന്നു. PHP ആ ലോക്കൽ ഫയൽ വായിക്കുന്നു, ഇത് റിക്വസ്റ്റ് ഹാൻഡ്‌ലിംഗ് സമയത്ത് നെറ്റ്വർക്ക് റൗണ്ട്-ട്രിപ്പുകൾ ഒഴിവാക്കുന്നു.

ആർക്കിടെക്ചറിൽ ഉൾപ്പെടുത്തിയ പ്രതിരോധശേഷി (Resilience)

പുതിയ ഡിസൈൻ നിരവധി സുരക്ഷാ സംവിധാനങ്ങൾ നൽകുന്നു:

  • Zero-latency reads – PHP ഹോട്ട് പാത്ത് ലോക്കൽ മെമ്മറിയിൽ നിന്ന് വായിക്കുന്നു, അതിനാൽ റിക്വസ്റ്റുകൾ ഒരു റിമോട്ട് സ്റ്റോറിനായി കാത്തുനിൽക്കുന്നത് ഒഴിവാക്കാം.
  • Graceful degradation – etcd പ്രവർത്തനരഹിതമായാൽ, റൂട്ടറുകൾ അവസാനമായി അറിയാവുന്ന ശരിയായ കോൺഫിഗറേഷൻ നൽകുന്നത് തുടരുന്നു, ഇത് പെട്ടെന്നുള്ള ഔട്ടേജ് തടയുന്നു.
  • Reliable updates – sidecar റീകണക്ഷൻ ലോജിക് കൈകാര്യം ചെയ്യുന്നു, കൂടാതെ etcd കണക്ഷൻ താൽക്കാലികമായി മുറിഞ്ഞാലും ഒരു മാറ്റവും വിട്ടുപോകാതിരിക്കുമെന്ന് ഉറപ്പാക്കുന്നു.

പ്രായോഗികമായി എന്ത് മാറ്റം വന്നു

മൈഗ്രേഷന് ശേഷം, പഴയതോ അല്ലെങ്കിൽ തെറ്റായതോ ആയ റൂട്ടിംഗ് ഡാറ്റ മൂലമുണ്ടാകുന്ന ഇൻസിഡന്റുകളിൽ വലിയ കുറവ് ടീം കണ്ടു. ഇപ്പോൾ ഒരു സിംഗിൾ കൺസോൾ നിലവിലെ കോൺഫിഗറേഷൻ കാണിക്കുന്നു, കൂടാതെ ഏതൊരു എഡിറ്റും ഒരു സെക്കൻഡിനുള്ളിൽ എട്ട് റീജിയനുകളിലേക്കും പടരുന്നു. താൽക്കാലിക ബൂസ്റ്റുകൾ അവയുടെ ലീസ് അവസാനിക്കുമ്പോൾ തനിയെ മാറുന്നു, ഇത് മുൻപ് മനുഷ്യസഹജമായ പിശകുകൾക്ക് കാരണമായിരുന്ന മാനുവൽ ക്ലീൻ-അപ്പ് ഘട്ടങ്ങൾ ഒഴിവാക്കുന്നു.

ഒരു വശത്തെ മറ്റൊരു കാഴ്ചപ്പാട്: sidecar-ന്റെ ചിലവ്

ഒരു sidecar ചേർക്കുക എന്നാൽ ഓരോ സെർവറിലും രണ്ടാമതൊരു പ്രോസസ്സ് ഉണ്ടാവുകയും PHP-കേന്ദ്രീകൃതമായ സ്റ്റാക്കിൽ ഒരു Go runtime ആവശ്യമായി വരികയും ചെയ്യും എന്നാണ് അർത്ഥം. അധിക മെമ്മറി ഉപയോഗത്തെക്കുറിച്ചും മറ്റൊരു ബൈനറി നിരീക്ഷിക്കേണ്ടതിനെക്കുറിച്ചും ചില ഓപ്പറേറ്റർമാർ ആശങ്കപ്പെടുന്നു. എന്നാൽ പ്രായോഗികമായി sidecar-ന്റെ ഉപയോഗം വളരെ കുറവാണ്, കൂടാതെ ഇതിലൂടെ ലഭിക്കുന്ന വിശ്വാസ്യത—പ്രത്യേകിച്ച് PHP ഒരു നെറ്റ്വർക്ക് കോളിനായി ഒരിക്കലും ബ്ലോക്ക് ആകില്ല എന്ന ഉറപ്പ്—ഇതിന്റെ പ്രവർത്തനച്ചെലവിനേക്കാൾ വലുതാണ്.

ഇനി ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ

മൾട്ടി-റീജിയൻ സർവീസുകൾ നിയന്ത്രിക്കുന്ന ടീമുകൾ ഇവ നിരീക്ഷിക്കണം:

  • etcd health metrics – റൂട്ടിംഗ് ലെയർ ഒരു സിംഗിൾ സ്റ്റോറിനെ ആശ്രയിച്ചിരിക്കുന്നു; അതിനാൽ quorum status, latency എന്നിവ ശ്രദ്ധിക്കുക.
  • Lease expiration handling – ലീസ് സമയങ്ങൾ ബിസിനസ്സ് ആവശ്യങ്ങൾക്കനുസരിച്ച് ക്രമീകരിക്കുക; അമിതമായി നീളമുള്ള ലീസുകൾ പഴയ ബൂസ്റ്റുകൾ നിലനിർത്താൻ കാരണമാകും.
  • Scaling the watch load – റൂട്ടറുകൾ വർദ്ധിക്കുന്നതിനനുസരിച്ച് watch കണക്ഷനുകളും വർദ്ധിക്കും; അതനുസരിച്ച് etcd സെർവറുകളുടെ കപ്പാസിറ്റി പ്ലാൻ ചെയ്യുക.

ചുരുക്കത്തിൽ (Takeaway)

അനേകം റീജിയനുകളിലുടനീളം വേഗത്തിലുള്ളതും ഏകോപിതവുമായ കോൺഫിഗറേഷൻ മാറ്റങ്ങൾ ആവശ്യമുള്ള ഏതൊരു സർവീസിനും, ഫയൽ അധിഷ്ഠിത കോൺഫിഗറേഷനുകൾക്കോ അല്ലെങ്കിൽ ഹെവിവെയ്റ്റ് മെഷുകൾക്കോ (heavyweight meshes) പകരമായി ഭാരം കുറഞ്ഞതും ശക്തമായ സ്ഥിരതയുള്ളതുമായ (strongly consistent) ഒരു ബദൽ etcd-യുടെ watch, lease, transaction പ്രിമിറ്റീവുകൾ വാഗ്ദാനം ചെയ്യുന്നു. കോൺഫിഗറേഷനെ ഒരു push-driven, self-cleaning സ്റ്റോറായി മാറ്റിയത് ഒരു വിഭാഗം പ്രശ്നങ്ങൾ പൂർണ്ണമായും ഒഴിവാക്കുകയും പ്ലാറ്റ്‌ഫോമിന് അതിന്റെ റൂട്ടിംഗ് ലോജിക്കിന്മേൽ തത്സമയ നിയന്ത്രണം നൽകുകയും ചെയ്തു.