Elosztott rendszerek: Mikor kell felépíteni őket, és hogyan kell méretezni. Lépésenkénti útmutató.

Mindig feltűnő számomra, hogy hány junior fejlesztő szenved impostor szindrómában, amikor elkezdték létrehozni a terméküket.

Értem én, sok észbontó példákat top cégek hihetetlenül komplex elosztott rendszereket képes kezelni milliárd kéréseket , kecsesen frissíteni száz alkalmazások leállás nélkül, talpra katasztrófa másodpercig, engedje 60 percenként, és a fénysebesség válaszidő a világ bármely pontjáról.

Ezek az elvárások meglehetősen elsöprőek lehetnek, amikor elkezdik a projektet. De amint azt már sokan tudjátok, ezeknek a vállalatoknak a többsége minimális életképes rendszerrel és nagyon gyenge technológiai halmokkal indult . Ennek egyszerű oka van: induláskor nem volt rá szükségük . Ha több időt fordít a rendszer tervezésére a kódolás helyett, valójában meghibásodhat .

Ez a cikk lépésről lépésre nyújt útmutatást. Megmutatom, hogyan kezdtük a Visage-nél az eddigi legapróbb rendszert, és építettünk egy alapvető, magas rendelkezésre állású skálázható elosztott rendszert. Ez egy igazi esettanulmány az eltávolítani a komplexek ha még soha nem volt lehetősége, hogy csináld magad.

Amikor először érkeztem Visage-be CTO-ként, én voltam az egyetlen mérnök. Semmit sem tudtam a technikai veremről, de azért csatlakoztam, mert nagyon tetszett az ötlet, hogy házon belüli toborzók vagy HR-szolgáltatás nélkül tudjak toborozni . Ez volt a Visage mögött meghúzódó ötlet: tömeges beszerzés , amelyet sok láthatatlan toborzó hajtott végre, akik együtt dolgoztak az ön feladatain, mesterséges intelligencia segítségével , amely a napokban keresi a legmegfelelőbb tehetséget. Akkorközvetlenül velük foglalkozol, nincs középső ember.

A „ tömeg ” a crowdsourcing azonnal váltott az én mérnöki agy: van megy egy csomó ember , dolgozó egyidejűleg , várva a jó teljesítmény ettől bárhol a világon. Tetszett a kihívás.

De rendszerszerűen a dolgok rosszak voltak , nagyon rosszak . Ezt találtam érkezésemkor:

  • Egy veszélyeztetett Wordpress-példány, amely több száz elavult hibás beépülő modult futtat, virtuális gépben fut egy megosztott kiszolgálón
  • Sérült postafiókok
  • A rengeteg Google Dokumentum és Táblázat.

És ez teljesen normális. Ismét nem volt technikai tag a csapatban, és ilyesmire számítottam. Még a csapat középpontjában egy üzleti lehetőséget, és tette a terméket úgy tűnik, mintha ez működött varázslatosan mindeközben mindent manuálisan! (Hamisítsd, amíg elkészíted). És ez volt igazán csodálatos.

Nem meglepő, hogy az első feladatom a virtuális gép újbóli létrehozása, a frissített Wordpress verzió újratelepítése, mindenki biztosítása volt, hogy mindenki megváltoztassa a jelszavát, létrehozzon egy jelszópolitikát és eltávolítson több tucat rosszindulatú szoftvert a vállalat számítógépeiről ... de térjünk át a rendszer szempontjaira.

A Wordpress-től egy webalkalmazásig

A termék építésének első fókuszának adatnak kell lennie . Az adatok vezérlik a vállalat értékét . Ez lesz az, amit mindennap használ a döntések meghozatalához, és amit megmutat befektetőinek, hogy demonstrálja az előrelépést .

Értelmeznie kell adatait, és az adatok különböző forrásokból, különböző formátumokkal történő megtérülése hatalmas időpazarlást jelent . A Wordpress sok esetben nagyon jó választás lehet azáltal, hogy meglehetősen sok mérnöki időt spórol meg, de az igényeikhez a Visage csapatának olyan divatos plugint kellett telepítenie, amelyet már nem tartottak karban. Ennek eredményeként nem volt irányításunk a létrehozott adatmodell felett, és a modellnek nem megfelelő adatok több tucat dokumentumban és táblázatban szóródtak szét.

Tehát, hacsak nincs olyan termék, amely már megfelel az igényeinek 90% -ának , gondoljon át egy ideális adatmodellre, és tervezzen meg és valósítson meg egy minimálisan életképes terméket (MVP), amely képes lesz az összes adat tárolására.

Akkor gondolkodjon az API-n . Az alkalmazásodnak rendelkeznie kell API-val, ez kritikus fontosságú lesz, ha végül eladod. Ne azonnal méretezzen, hanem a méretezhetőséget szem előtt tartva kódoljon. Tedd API-t hontalanokká és a lehető legpihentetőbbé , mivel mindenki azt várja, hogy képes lesz lekérdezni a szokásos HTTP módszerekkel.

Esetünkben a NodeJS- t választottuk , mert a kódunk nagy része csak a bemenetek és kimenetek feldolgozását jelentené. A NodeJS nem blokkoló és egy könyvtárral rendelkezik, amely kényelmes API-k tervezéséhez: ExpressJS .

Ha szüksége van egy ügyféloldali weboldalra, akkor több lehetősége van. Először létrehozhat egy réteget az alkalmazáskiszolgálón, amely létrehozza az oldalait, vagy létrehozhat egyoldalas Javascript alkalmazást, amelyet statikus webtárhely-kiszolgáló fog kiszolgálni.

A Visage-nél a második lehetőség mellett döntöttünk, és úgy döntöttünk, hogy létrehozunk egy alkalmazást a felhasználók számára , egyet pedig az adminok számára. Ez egyszerűen azért volt, mert sokkal nagyobb elvárásaink lennének a felhasználókkal szemben, mint amire szükségünk van az adminisztrátorokkal, és mindkét kódalapot egyszerűvé akartuk tartani (a későbbiekben a CORS szempontjai miatt is). Rendszerünk így nézett ki:

Korán delegálja az érzékeny adattárolást

Hacsak nem kritikus a vállalkozása szempontjából, nincs jó ok arra, hogy bizalmas személyes adatokat tároljon rendszereiben. A biztonság összetett kérdés, és ha mindennap módosítja a kódot, amíg megfelelőnek találja termékpiacát, akkor az meg fog szakadni. Tegyük fel, hogy bárki , aki nem szándékosan szándékozik megsérteni az alkalmazását, ha nagyon akarja.

A legfontosabb itt az, hogy ne tároljon olyan adatokat, amelyek gyorsan megnyernék egy hackert. Senki nem rabol olyan bankot, amelynek nincs pénze . Ha SaaS terméket tervez, valószínűleg hitelesítésre és online fizetésre van szüksége. Sok olyan harmadik fél van, akivel integrálódhat, és amely sokkal jobb módon fog foglalkozni ezzel, mint amennyit csak tudna.

Például az Auth0 a legismertebb harmadik fél, amely kezeli a hitelesítést. A csík szintén jó lehetőség az online fizetésekhez. Minden erőforrásukat és a bolygó legjobb biztonságtechnikai csapatait fogják szentelni az Ön adatainak biztonsága érdekében - különben nincs vállalkozásuk.

A felhőszolgáltatások a legjobb barátok

Tehát ezen a ponton volt módunk tárolni az összes adatot, hitelesítést, online fizetést és egy webalkalmazást, amelyet az ügyfelek használhattak, valamint egy API-t, amelyet eladhatunk a partnereknek különböző felhasználási esetekre. Felhasználói körünk egyre nőtt, és nyilvánvalóvá vált, hogy bármikor hozzáférni akarnak az alkalmazáshoz. Ideje tehát átgondolni a méretezhetőséget és a rendelkezésre állást .

Egy szerverre támaszkodtunk, de az csak annyi kérést tudott kezelni, és a szerver cseréje vagy egy új verzió kiadása azt jelentené, hogy az alkalmazást a kiadás során le kell vonni. A következő prioritásaink a következők voltak: terhelés-kiegyenlítés , automatikus méretezés , naplózás , replikáció és automatizált biztonsági mentések . Természetesen, ha egyedüli mérnök vagy a cégedben, akkor ezeknek a kérdéseknek az önálló kezelése teljesen őrültség lenne.

Szerencsére olyan időben élünk, amikor egyetlen jól képzett mérnök néhány nap alatt könnyen felépíthet egy ilyen rendszert olyan felhőszolgáltatások segítségével, mint az Amazon Web Services , a Google Cloud Services vagy az Azure . Úgy döntöttünk, hogy rendszereinket az AWS-re helyezzük át, mert akkoriban ez volt a legteljesebb megoldás, és 2 év ingyenes hitelünk volt.

Ezért ebben a bejegyzésben leginkább az AWS megoldásokról fogok beszélni, de más platformokon is léteznek egyenértékű szolgáltatások. Ez az az idő, amikor úgy döntöttünk, hogy elkezdjük moduljainkat Docker konténerekben futtatni, sok más ok miatt, amelyekre ez a bejegyzés nem tér ki (további információkért tekintse meg ezt a cikket: //medium.freecodecamp.org/amazon -búcsú-viszlát-infrastruktúra-3b66c7e3e413).

Az, hogy az alkalmazások futtatása mellett dönt, valóban a felhasználási esetétől függ, például a szükséges rugalmasságtól és az infrastruktúra kezelésével töltött időtől .

Nincs jó vagy rossz válasz.

Kiválaszthatja konténerbe minden modul és használja a tartályt irányítási rendszer , mint a ECS / EKS AWS vagy Kubernetes motort GCP. Ha nem, és nem szeretne olyan dolgokkal foglalkozni, mint az automatikus méretezés és a terhelés-kiegyensúlyozás, használhatja az Elastic Beanstalk vagy az App Engine alkalmazást.

Ha teljes kiszolgáló nélküli állapotot szeretne elérni, kombinálhatja a Lambda funkciók és az API Gateway használatát is. Úgy döntöttünk, hogy elmegyünk ECS-re. Három példányt telepítettünk 3 rendelkezésre állási zónába, egy terheléselosztót , beállított automatikus méretezést a CPU használatától függően, integráltuk tárolóink ​​összes naplóját a Cloudwatch és a beállítási mérőszámokkal a hibák , a külső hívások és az API válaszidejének figyelésére .

Adatbázisunkhoz a MongoDB-t használtuk, mert modellünk jól illeszkedik egy NoSQL adatbázisba, és magas konzisztenciájú. Úgy döntöttünk, hogy kihasználjuk a MongoDB Atlas előnyeit, és 3 replikát telepítettünk a magas rendelkezésre állás érdekében. Az Atlas egyéb szolgáltatások mellett automatikus méretezést , automatizált biztonsági mentéseket biztosít, és lehetővé teszi, hogy katasztrófa esetén zökkenőmentesen térjen vissza az időben .

Úgy döntöttünk, hogy az összes statikus webfájlunkat az S3-ban tároljuk , és a Cloudfront- ot CDN- ként használtuk , így JS-alkalmazásaink nagyon gyorsan betöltődhetnek a világ bármely pontján, és annyiszor kiszolgálhatók, amennyit kértek. A Cloudfare szintén jó lehetőség, és már a dobozban kínál DDOS-védelmet.

Az egyszerűség kedvéért úgy döntöttünk, hogy az 53- as utat használjuk DNS-ként, az összes domainjük névszervereinek használatával. Ez az egyik kedvenc szolgáltatásom az AWS-en. Sokkal könnyebbé teszi az életedet. Minden alkalommal, amikor valamit egy domain néven szeretne kiszolgálni, legyen szó EC2 példányról, rugalmas IP-ről , terheléselosztóról , Cloudfront- disztribúcióról vagy bármi másról , valóban, magántulajdonban vagy nyilvánosan, percekbe telik, mert olyan jól integrálódik az összes egyéb szolgáltatások.

Kombinálja ezt a Tanúsítványkezelővel, amely lehetővé teszi, hogy percek alatt ingyen szerezzen SSL-tanúsítványokat (a helyettesítő karaktereket is), és egy négyzet bejelölésével telepítse őket az összes szerverre, és Ön a leggyorsabban és legmegbízhatóbban engedélyezheti a HTTPS használatát az összes modulján. Viszlát "Titkosítsuk" az SSL tanúsítványokat, amelyeket kb. 3 havonta kellett megújítanom és telepítenem a szervereimre.

Döntse el a gyorsítótárazás stratégiáját

Mindenki utálja a gyorsítótár-kezelést, a gyorsítótárazás sokféle rétegben előfordulhat, és a gyorsítótárral kapcsolatos problémákat nehéz reprodukálni, és egy rémálmot hibakeresni.

Sajnos az elosztott rendszerek teljesítménye nagymértékben támaszkodik egy jó gyorsítótár-stratégiára . Sok jó cikk szól a gyorsítótárazás stratégiáiról, ezért nem részletezem részletesen. Csak tudd, hogy ha statikus webes erőforrásaid nagyok, akkor valószínűleg ki akarod használni a felhasználó böngésző gyorsítótárának előnyeit a cache vezérlő fejléc okos használatával.

Ha a felhasználó néző oldalai újra és újra létrejönnek az alkalmazáskiszolgálókon, használjon olyan gyorsítótárazó proxyt, mint a Squid . De ami a legfontosabb, nagy eséllyel újra és újra ugyanazokat a kéréseket fogod megtenni az adatbázisodban. Az adatbázis terhelésének csökkentése és az adatátviteli idő megtakarítása érdekében használjon olyan memóriaobjektum-gyorsítótár-rendszert, mint a memcached , gyakran használt és ritkán frissített objektumok esetén .

Azért kezdtük fontolgatni a memcached használatát, mert gyakran ugyanazokat a jelöltprofilokat és állásajánlatokat kértük újra és újra. Memóriára optimalizált gépen történő megvalósítása több mint 30% -kal növelte az API teljesítményünket , amikor átlagoljuk az összes kérés válaszidejét egy nap alatt. A Memcached is terjesztve van, így különböző szervereken futtatható, de mégis úgy működik, mintha csak egy nagy memória lenne az objektumok tárolására.

Hely, hely, hely

Most van egy olyan elosztott rendszerünk, amelynek egyetlen hibapontja sincs (ha figyelembe vesszük az AWS ELB-ket és az elosztott memória-gyorsítótárat ), és automatikusan képes felfelé és lefelé méretezni . A gyorsítótárat is használjuk a hálózati adatátvitel minimalizálása érdekében. Nagyon jól néz ki. Ezen a ponton valószínűleg ellenőrizni szeretné harmadik feleit , hogy vajon elnyelik-e a terhelést, mint Ön.

De mégis, néhány felhasználónk azt panaszolta, hogy az alkalmazás egy kicsit lassabb volt számukra, különösen akkor, ha fájlokat töltöttek fel. Még akkor is, ha statikus webfájljainkat az egész világon gyorsítótárba helyezték (a CDN jóvoltából), az összes alkalmazásszerverünket csak az USA nyugati részén telepítettük. A kelet-ázsiai felhasználók sokkal nagyobb késést tapasztaltak, különösen a nagy adatátvitel során.

A megoldás egyszerű volt: pontosan ugyanazt az ECS-fürtöt telepíteni egy új ázsiai régióban , egy új terheléselosztóval együtt, és az 53- as út geoproximitás-útválasztására támaszkodva kell a felhasználókat a „legközelebbi” terheléselosztóhoz irányítani. A MongoDB Atlas lehetővé teszi a másolatok régiók közötti telepítését is , így nem volt szükség további munkára.

Következtetés

Noha az itt látható elosztott rendszert egyszerűsítették ehhez a bejegyzéshez, megvizsgáltuk azokat a részeket, amelyeket valószínűleg sok modern webalkalmazásban lát. A témához kapcsolódó, de nem érintett egyéb témák: a mikroszolgáltatások architektúrája, a fájlok tárolása és titkosítása, az adatbázis feldarabolása, az ütemezett feladatok, az aszinkron párhuzamos számítás ... talán a következő bejegyzésben!

A legfontosabb szempont: ne próbálja kiépíteni a tökéletes rendszert, amikor elindítja a terméket. A legtöbb tervezési döntést attól függ, hogy mit csinál a termék és ki használja. Csak akkor fogja tudni, hogy amikor eléri a termékpiacot, és jó áttekintést nyújt a felhasználói bázisról, ez akár hónapokat, éveket is igénybe vehet.

Koncentráljon arra, hogy kiderítse, mire van szüksége az embereknek , és próbáljon megoldást találni problémájára, még akkor is, ha sok kézi lépést tartalmaz . Ezután gondoljon az automatizálás módjaira , töltse az idejét kódolással és rombolással , és használja harmadik feleket, ahol ésszerű.

Ne méretezzen, de mindig gondolkodjon, kódoljon és tervezzen méretezést. Építse fel rendszerét lépésről lépésre , ne foglalkozzon a rendszertervezéssel kapcsolatos problémákkal még nem kiforrott jellemzők alapján, és végül mindig próbálja megtalálni a legjobb kompromisszumot az eltöltött idő és a teljesítmény, a pénz és az alacsonyabb árnövekedés között. kockázat.

Ha tetszett ez a cikk, és hasznosnak találta, nyomja meg ezt a taps gombot, és kövessen engem további építészeti és fejlesztési cikkekért! ?