Puncte:1

Echilibrator de încărcare sau proxy pentru a direcționa traficul către diferite servere în funcție de adresa URL a acestora

drapel cn

Am mulți clienți cu propriile servere de nume, vreau să le ofer aceleași detalii DNS, cum ar fi cum procedează Squarespace sau Shopify (de exemplu, un @ O înregistrare și a www. CNAME care este întotdeauna același), și apoi gestionați la ce server este direcționat traficul lor din partea mea.

Acest lucru m-ar ajuta enorm atunci când trebuie să migrez o mulțime de site-uri web pe o nouă infrastructură și nu vreau să petrec săptămâni vorbind cu diferite departamente IT de la diferite companii, cerându-le să-și actualizeze setările DNS pentru domeniile lor și toată gestionarea acestora.

Există un echilibrator de încărcare sau un proxy disponibil în acest scop? Sunt interesat să știu ce este considerată cea mai bună practică. Ce ai recomanda?

Puncte:3
drapel jp

Presupun ca te referi la acest configurarea DNS shopify.

Indicați A înregistrare la adresa IP Shopify 23.227.38.65. Indicați CNAME înregistrarea cu numele www la magazine.myshopify.com

domeniu rădăcină (@)

După cum știți, nu puteți avea un CNAME pe rădăcină (@), deci domeniul rădăcină trebuie gestionat cu a A și aaaa înregistrări care indică către adrese IP fixe.

Modul în care marile companii extind acest lucru la nivel global utilizează „anycast” în care aceeași adresă IP este anunțată prin BGP din mai multe centre de date diferite.

Vă puteți gândi la anycast ca la echilibrarea încărcăturii gestionată de routere, unde mai multe servere din aceleași centre de date sau diferite pot primi și gestiona trafic pentru o singură adresă IP.

Dacă nu sunteți deja un AS cu propriul spațiu IP, atunci anycast este cu siguranță în afara domeniului dvs. de aplicare.

Modul simplu de a începe aici este să nu rulați nicio găzduire pe domeniul rădăcină, ci doar să faceți redirecționări către www. Apoi, o singură casetă de redirecționare nginx (sau multe în spatele unui echilibrator de încărcare level4/tcp) poate gestiona o mulțime de redirecționări de domeniu.

Dacă aveți nevoie de o mulțime de casete din cauza numărului mare de solicitări, utilizați echilibrarea încărcăturii tcp/layer4 pe serverele dvs. de redirector, astfel încât să puteți face terminarea aplicației (http) și ssl în casetele din spatele echilibratorului de încărcare pentru mai multă scalabilitate (echilibratorul de încărcare unic poate gestionează mai mult trafic).

Folosiți redirecționări permanente (301) care cache pe termen nelimitat reducerea traficului recurent de la aceiași clienți.

Cele mai bune practici aici. Utilizați letsencrypt/certbot pentru a genera automat/reînnoi domeniile de redirector odată ce DNS-ul este configurat. Redirecționați întotdeauna către https pe același domeniu (de exemplu. http://example.com --> https://example.com) înainte de a redirecționa către alt domeniu (https://www.example.com).

www

Mă uit la shopify magazine.myshopify.com (unde www CNAME ar trebui să punct) puteți vedea că are un singur A record care este în prezent 23.227.38.74.

Folosind un instrument global de ping puteți vedea că acest IP are câteva milisecunde de latență din multe locuri din lume. Aceasta înseamnă că cu siguranță nu este un singur server într-o singură locație (latența transatlantică rulează de obicei 60 ms în cel mai bun caz... deci când vedeți ping de 4 ms din SUA și UE pentru același IP... știți că acele ping-uri sunt" t merge la același server). De asemenea, puteți verifica acest lucru prin rularea unui traseu către aceeași IP de la servere diferite din zone geografice diferite.

La fiecare dintre punctele finale care răspund la acel IP, probabil că au un echilibrator de încărcare care direcționează cererile către hardware diferit.

Deci, în spatele CNAME shopify, este anycast cu un singur IP. Avantajul de a oferi clienților dvs. un CNAME este că aveți libertatea de a schimba IP-urile din spatele acelui nume, fără ca clienții să fie nevoiți să actualizeze DNS-ul. În această notă... când le oferi clienților tăi un A înregistrarea pentru rădăcina lor (@) redirector de domeniu... doriți să vă asigurați că aceasta este o adresă IP pe care o puteți controla și realoca unui hardware diferit dacă aveți probleme cu un server/echilibrator de încărcare (de exemplu, lucru de tip IP elastic AWS sau propriul spațiu IP dacă ești AS).

Din câte știu, nu există nici un „indiciu” dat cu privire la cererea DNS (și o parte din memoria cache a rezolutorului DNS) atunci când computerul urmărește lanțul CNAME atunci când rezolvă un nume pentru a spune serverului DNS final care este domeniul original. pe care l-ai cerut. Dacă ar exista, vă puteți imagina un server DNS având reguli condiționate pentru a returna adrese IP diferite pentru același nume, în funcție de numele care se află în spatele lui.

Deci, dacă nu o veți face în mod shopify (bgp/anycast). Cel mai simplu lucru ar fi să le oferi clienților tăi CNAME unice. În acest fel, puteți face echilibrarea încărcăturii la nivel DNS (returnând IP-uri diferite pentru fiecare CNAME unic de client).

Ai putea să urmezi o convenție cum ar fi customerdomain.tld.example.com și aveți DNS-ul furnizat automat pe baza bazei de date a activelor clienților.

Și pentru domeniul rădăcină (@) puteți utiliza în continuare un singur IP redirector (una sau mai multe casete în spatele unui singur IP/echilibrator de încărcare) gestionând redirecționarea pentru toate domeniile către www.customerdomain.tld la care CNAME-uri customerdomain.tld.example.com.

Actualizare... poate am ratat sensul întrebării dvs.

Acest lucru m-ar ajuta enorm atunci când trebuie să migrez o mulțime de site-uri web pe o nouă infrastructură

După cum am menționat mai sus, cel puțin pentru rădăcină/@ În caz contrar, TREBUIE să controlați acel IP și să îl puteți atribui altei infrastructuri... altfel toți clienții dvs. vor trebui să-și actualizeze DNS-ul atunci când acel IP se schimbă din cauza unei migrări.

Pentru www/CNAME În caz contrar, aceasta nu este o problemă, deoarece puteți actualiza IP-ul din spatele CNAME pe propriul DNS.

Deci mă voi concentra pe opțiunile doar pentru domeniul rădăcină (@), deoarece este cel mai problematic (necesită acțiunea clientului pentru a actualiza DNS atunci când adresa IP a serviciului lor se schimbă). Opțiuni...

opțiunea 0 - nu acceptă rădăcina/@ domeniu pentru clienți

Indiferent ce găzduiești, găzduiește-l pe un subdomeniu (www sau altul). Dacă clienții doresc o redirecționare, ei pot gestiona asta cu oamenii lor IT.

Acest lucru elimină complet problema DNS-ului clientului care indică adresa IP fixă. Puteți actualiza adresele IP CNAME din partea dvs. și orice mutare a infrastructurii sau schimbare a IP devine simplă.

opțiunea 1 - adrese IP atribuibile

Puteți folosi lucruri precum adrese IP atribuibile (chestia cu tipul de ip elastic AWS, cei mai serioși furnizori de VPS oferă ceva similar).

Acest lucru vă permite să implementați un nou server (la acel furnizor) și apoi să comutați IP-ul pe noul server.

Problema este că aveți blocarea furnizorului/furnizorului, deoarece adresele IP aparțin furnizorului. Deci, dacă doriți să treceți de la AWS la Google-Cloud sau propriul hardware, nu puteți lua acele IP-uri cu dvs.... Actualizare DNS pentru clienții dvs. De asemenea, IP-urile pot fi blocate în regiune, astfel încât să nu puteți atribui cu ușurință IP-ul unui alt server de la furnizor într-un alt centru de date.

opțiunea 2 - deveniți un AS și obțineți propriul spațiu IP

Dacă faci găzduire serioasă, este doar o chestiune de timp până când trebuie să devii AS (Sistem autonom) prin intermediul ARIN sau COPT sau o altă organizație dacă compania dvs. se află în afara Americii de Nord și a Europei.

Apoi, trebuie să achiziționați (sau să închiriați) propriul bloc de adrese IP. Puteți obține ipv6 gratuit de obicei. ipv4 s-a epuizat, dar cel puțin RIPE vă permite să intrați pe o listă de așteptare pentru a /24 (256 de adrese) când le recuperează în timp. În caz contrar, trebuie să cumpărați spațiul de adresă de la cineva (există piețe la care vă puteți înscrie).

Și, desigur, atunci trebuie să lucrați cu furnizori care vă permit să aduceți propriile adrese IP.

Iată câteva link-uri practice care parcurg o configurație anycast. Dar, pentru început, ignorați biții anycast și concentrați-vă pe configurarea ca AS, obținerea spațiului IP și găsirea tipului potrivit de parteneri infra. (Deoarece rularea BGP/anycast nu este banală.)

Dezavantaje:

  • investiție de timp pentru a configura lucrurile și a învăța (de exemplu, BGP dacă furnizorul dvs. din amonte nu se ocupă de asta pentru dvs.).
  • investiții financiare (taxe de membru/IP pentru RIPE/ARIN și costuri potențial mari pentru achiziționarea/închirierea blocurilor IPv4).
  • limitat la lucrul cu furnizorii VPS care vă permit să vă aduceți propriile IP-uri
    • Sau trebuie să închiriați spațiu în rack și să vă ocupați de peering/routing/switching/BGP/etc, defecțiuni hardware, monitorizare hardware SNMP etc.
  • noi distrageri de atenție, cum ar fi nevoia de a contracara și a adresa plângeri de abuz legate de spațiul dvs. IP

Cu siguranță are sens la o anumită scară sau dacă aveți deja abilitățile și instrumentele necesare pentru a o gestiona.

opțiunea 3 - DNS nestandard

Unii furnizori de DNS gestionați au adăugat CNAME-cum ar fi suport pentru domeniul naked/root.

Dacă utilizați unul dintre acești furnizori sau implementați singur acest lucru dacă rulați propriul DNS... atunci asta poate rezolva problema.

Vezi acest răspuns

Dacă te bazezi pe acest lucru, atunci ești blocat de furnizor la furnizorii DNS care acceptă această caracteristică non-standard. Sau trebuie să rulați propriul DNS și să implementați acest lucru singur.

opțiunea 4 - CDN

În funcție de aplicația dvs., puteți pune un alt serviciu în fața acesteia. adică serviciu asemănător CDN (stackpath, cloudflare, aws-cloudfront etc). Acești băieți se vor ocupa de DNS/anycast și de subiecte conexe, iar clienții tăi se vor îndrepta către serviciul CDN și vor rula serviciile în spatele CDN-ului.

Schimbarea serviciilor back-end devin modificări de configurare la CDN (sau similar) pentru a spune CDN-ului numele/ip-urile punctelor finale de la care ar trebui să fie solicitat conținutul.

Dezavantaje:

  • cost suplimentar dacă nu aveți nevoie.
  • trebuie să vă asigurați că punctele finale stocate în cache versus non-cache (de exemplu, aplicația) sunt configurate pe CDN pentru a se potrivi cu modul în care funcționează aplicația(ele) dvs.
  • strat suplimentar care trebuie depanat dacă aplicația dvs. nu funcționează (CDN-ul a întrerupt solicitarea sau aplicația dvs.?).
  • de obicei, aceasta înseamnă că înregistrarea CNAME a clientului dvs. va indica domeniul CDN-ului... nu al dvs. Domeniul dvs. se află în configurația aplicației CDN ca server upstream. Deci, aveți blocarea furnizorului... dacă doriți să schimbați CDN-urile, toți clienții dvs. vor trebui să-și actualizeze CNAME-urile DNS pentru a indica cel nou. Puteți atenua acest lucru punând 2 straturi de CNAME (client -> dvs. -> CDN), dar asta nu este grozav dintr-un perspectiva performanței.

ce aș face

Fără mai multe detalii despre dimensiunea bazei dvs. de clienți, abilitățile (de exemplu, BGP), dacă utilizați propriul hardware sau închiriați VPS ieftin...

Îmi place simplu, îl poți face oricând mai complex mai târziu. Care este cel mai simplu lucru care îmi menține costurile scăzute, nu necesită mult timp, oferă o experiență bună de utilizare pentru clienții mei și, în cele din urmă, îmi permite să mă întorc la activități generatoare de venituri (în loc să petrec timp pe un backend tehnic care are un cost de timp/financiar cu speranța de a reduce costurile totale la scară). Nu sunt google, așa că prefer să-mi cresc linia de sus decât să-mi micro-optimizez rezultatul... mai ales dacă nu există o nevoie tehnică (încă).

as face urmatoarele...

  • nu există suport pentru domeniul naked/root al clienților. clienții care doresc o redirecționare pot avea personalul IT să o configureze. O durere de cap mai mare.
    • Sau dacă doriți să susțineți acest lucru, configurați un singur IP redirector pe care știți că nu îl veți pierde (de exemplu, AWS elastic IP) și configurați clienții A și aaaa înregistrări. Restul serviciilor dvs. nu trebuie să fie găzduite în același loc (adică redirectorul poate fi AWS cu ELB dacă trebuie să scalați redirecționarea, iar casetele pentru clienți pot fi pe VPS-uri ieftine).
  • fiecare client primește un CNAME previzibil (unic pentru el) pe baza domeniului găzduit sau a ID-ului de client (CUS1234.example.com are mai mult sens dacă oferiți clienților posibilitatea de a schimba cu ușurință domeniul pe care îl găzduiesc).
  • DNS-ul meu este actualizat automat pe baza bazei de date a clienților (domeniile clienților -> CNAME specific clientului -> adresa IP care găzduiește aplicația clientului).
  • Pot monitoriza cu ușurință DNS-ul clientului respectiv, iar DNS-urile mele sunt toate îndreptate către locul potrivit.
  • Pot monitoriza traficul/abuzul DNS pe bază de client separat (pentru că au nume unice) de la punctul final al clientului.

Clienții își setează DNS-ul o dată și nu trebuie să-l modifice decât dacă doresc să-și schimbe domeniul găzduit.

Migrările infrastructurii sunt relativ ușoare dacă aveți mecanisme bune de backup/restaurare/replicare care funcționează în tandem cu o anumită formă de descoperire a serviciului pe stratul de furnizare a serverului/vps/aplicației.

  • setați un TTL DNS scăzut în înregistrările dvs. DNS (adică numele către care indică CNAME al clientului CUST1234.example.com A 10.0.0.1) cu ceva timp înainte de migrare.
  • Învârtiți noi infrastructuri, inclusiv replicarea datelor din infra vechi (baze de date, conținut încărcat de utilizator etc.).
  • Schimbați înregistrările DNS ale clienților (A, aaaa) pentru a indica noile IP-uri
  • Eliminați vechea infrastructură după ce s-a scurs marginea DNS TTL +.

Dacă backend-ul dvs. de date nu poate gestiona scrierile de la 2 puncte finale ale clienților activi în același timp, atunci este posibil să fie nevoie să aveți o întrerupere pentru migrare... deoarece va exista o suprapunere pe măsură ce vechiul cache DNS expiră.

Avantajul acestui tip de configurare este că pot rula pe aproape orice furnizor de VPS de renume pe care îl doresc (provizionarea mea automată nu este pretențioasă). Nu trebuie să fac investiția pentru a deveni un AS și să mă ocup de cheltuielile suplimentare legate de gestionarea propriului spațiu IP (cu siguranță are sens să fac asta la o anumită scară... dar nu cunosc situația companiei dvs.) .

Pot face lucruri precum echilibrarea încărcării geografice bazată pe DNS (return IP diferit pentru același nume, în funcție de regiunea serverului solicitant). Acest lucru vă permite să oferiți unui client mai multe servere sub același nume în regiuni diferite (astfel încât să nu aibă de-a face cu latența trans-SUA sau trans-atlantică atunci când încarcă o aplicație). Puteți oferi acest lucru pe bază de client ca valoare adăugată/upsell.

Notă despre echilibrarea sarcinii...

Am menționat de mai multe ori echilibrarea încărcăturii tcp/layer4 fără a detalia. În general, aveți două tipuri comune de echilibrare a sarcinii. layer4/transport/tcp și layer7/application/http(s).

Un echilibrator de încărcare layer7/application/http „vorbește” http și termină conexiunea ssl înainte de a trimite cererea (de obicei, http necriptată) către unul dintre multiplele servere din spatele echilibrerului/proxy-ului. Acest lucru este simplu, dar poate duce la probleme în care serverele din spatele echilibratorului de încărcare nu știu că ar trebui să pretindă că vorbesc https atunci când scriu anteturi, cookie-uri securizate, redirecționări etc. Înseamnă, de asemenea, că echilibratorul de încărcare trebuie să lucreze mai mult. per cerere (parsarea http și gestionarea overhead SSL). Această muncă suplimentară limitează scalabilitatea echilibratorului de încărcare, care este de obicei un singur nod/mașină/vps.

Un echilibrator de încărcare layer4/tcp nu trebuie să analizeze cererea http sau să aibă suprasarcina de terminare SSL. Nu știe nimic despre http. Solicitarea este direcționată către unul dintre multiplele servere care se ocupă de terminarea ssl și gestionează cererea http.

Dacă sunteți îngrijorat de reutilizarea (sau lipsa) sesiunii TLS care afectează performanța, este obișnuit să utilizați redis sau memcached ca cache de sesiune TLS partajată între mai multe servere web, astfel încât să nu vă faceți griji că echilibratorul de încărcare va menține utilizatorii „lipiciți” la o casetă specifică în spatele echilibratorului de sarcină. nginx nu pare să accepte memoria cache a sesiunii TLS off-box (cache-ul partajat doar între lucrătorii nginx din aceeași casetă). haproxy pare să aibă ceva dar nu l-am încercat și nu știu cum ar funcționa în haproxy/level4 în fața unui pool nginx unde are loc terminarea ssl.

Puteți utiliza nginx sau haproxy ca echilibrator de încărcare layer4/tcp, ambele sunt destul de simple de configurat. Pentru cazuri de utilizare mai avansate (și probabil o performanță mai bună) vă puteți uita și la Linux Virtual Server (LVS).

Un alt mod de distribuire a încărcăturii este de a avea mai multe înregistrări A sau AAAA returnate pentru un singur nume. În mod ideal, clientul DNS alege aleatoriu dintre adresele returnate, astfel încât să obțineți o anumită distribuție a încărcării pe mai multe adrese IP. Dacă începeți să întâmpinați probleme de scalare cu nivelul de echilibrare a încărcăturii, aceasta este o modalitate low-tech de a adăuga mai multă scară (doar adăugați un alt echilibrator de încărcare față de același grup de servere de aplicații sau diferit). Cu toate acestea, nimic nu îi obligă pe clienți să-ți rotunjească adresele IP... deci acest lucru nu vă oferă prea mult control asupra IP-urilor care primesc încărcarea... dar este mai bine decât nimic.

drapel cn
Ce răspuns detaliat și atent, mulțumesc! Este cu siguranță suficient de exhaustiv pentru scopurile mele, dar cred că acest lucru va ajuta cu adevărat oamenii care caută în viitor. De fapt, mă văd referindu-mă la el în anii următori. Cred că probabil că voi urma pașii tăi „Ce aș face” pentru moment, deși nu văd că unii dintre departamentele IT ale clienților noștri se ocupă de domeniul complet ââï¸ - Cred că vom seta creați un singur IP redirector așa cum ați menționat în acest scop. Ai vreo idee despre de ce este atât de greu de găsit pe Google? Este atât de nestandard? Multumesc din nou!
mattpr avatar
drapel jp
Nu cred că este non-standard, doar că există o grămadă de subiecte suprapuse/conexe (DNS, BGP/rutare, echilibrare de încărcare, servire web, cache/sau nu etc). Din punct de vedere istoric, acestea au fost roluri diferite (ingineri de rețea vs admin de sistem/devops vs dezvoltatori de aplicații). Nu există o „soluție standard”. Cel mai bun lucru este să cercetați aceste subiecte diferite pentru a vă extinde cunoștințele și pentru a dezvolta o bază pentru ceea ce este posibil și ceea ce ar putea avea cel mai mult sens într-o situație dată.
Puncte:1
drapel cn

Răspunsul pe care l-a dat @mattpr este foarte detaliat și foarte atent. Are o mulțime de informații utile care sunt foarte precise. Nu vreau să iau din acest răspuns și cât de uimitor este.

Abordarea mea ar fi mult mai simplistă. Aș configura o gazdă proxy în [inserați furnizorul de cloud ales]și folosiți ceva de genul nginx proxy manager (https://nginxproxymanager.com/). Permite proxy și redirecționare către alte adrese URL. Este ușor de configurat într-un container Docker. Acceptă stocarea în cache, socket-uri web și Let's Encrypt.

Rugați clienții să-și îndrepte @ către IP-ul gazdei dvs., apoi să creeze o înregistrare A pentru ca aceștia să-și orienteze CNAME-ul www (hosting.myawesomecompany.com). Apoi configurați o configurare proxy pentru clientul respectiv pentru a direcționa cererile către serverul/infrastructura corectă.

Asigurați-vă că managerul proxy nginx este menținut actualizat și păstrați webui securizat pentru IP ACL sau ceva de genul.

drapel cn
Mulțumesc pentru sugestie, cu siguranță voi verifica managerul proxy nginx :)
mattpr avatar
drapel jp
Acesta este efectiv un echilibrator de încărcare layer7 (aplicație) care face terminarea SSL cu mai multe servere http în amonte în culise. (de exemplu.decriptați și redirecționați cererile pentru `www.example.com` către ip `x.x.x.x`). Este un singur punct de eșec și limitează scalabilitatea la un singur server care rulează echilibrul de încărcare. Dacă trebuie să scalați, va trebui fie să scalați managerul de proxy nginx adăugând mai multe în spatele unui echilibrator de încărcare layer4/tcp... sau să îi convingeți pe clienți să-și actualizeze DNS-urile pentru a indica CNAME-uri unice. Opțiune bună pentru trafic redus, totuși.
drapel cn
Are negativul de a fi un singur punct de eșec. Gândul meu este: dacă ești mic și vrei să începi cu ceva simplist, va face treaba. Următorul hop ar fi să vă sprijiniți pe un furnizor de cloud (unul dintre cei 3 mari) pentru a face treaba pentru dvs. folosind infrastructura CDN/de rețea. Ultima etapă este să construiți singur o rețea anycast (nu este ușor!). @mattpr este corect, nu există un „mod standard”, sau chiar un „mod corect”. Există doar „cum ai făcut-o”... Nevoile tale se vor schimba în timp, iar alte soluții vor apărea, făcând „în felul în care ai făcut-o” să fie depășit. Indiferent, GL!
mattpr avatar
drapel jp
Aș susține că complexitatea/simplitatea echilibrului de încărcare față de gestionarea DNS (db client + api DNS) este aceeași. În ambele cazuri trebuie să mențineți/gestionați starea pentru: care sunt domeniile clienților, unde sunt găzduite? Această stare este folosită pentru a actualiza „config” pentru a le conecta. Într-un caz, actualizarea „config” se află într-un echilibrator de încărcare. În celălalt caz, actualizarea de configurare este adresa (adresele) din spatele numelor de domeniu CNAME ale clientului. Deci, aș spune că complexitatea este aceeași... dar una este mult mai flexibilă/scalabilă. Cerința de întrebare a fost reducerea șanselor ca clienții să fie nevoiți să actualizeze DNS.
mattpr avatar
drapel jp
Pentru a fi clar, nu cred că este ceva în neregulă cu sugestia dvs. și cu siguranță are sens să utilizați așa ceva dacă sunteți la scară foarte mică, cu trafic redus și doriți să gestionați „rutarea” backend-ului cu un instrument unic/simplu (de ex. nu utilizați practici/instrumente devops pentru a vă gestiona infrastructura). Pe baza cerinței întrebării, în special despre reducerea șanselor clienților de a actualiza vreodată DNS, există mecanisme alternative care sunt la fel de simple, dar oferă mai multe beneficii. Presupun că, pentru mai mulți clienți, abilitatea de a scala este, de asemenea, importantă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.