Apache load balancing with GET parameter

kvas

  • ***
  • 124
    • Zobrazit profil
    • E-mail
Apache load balancing with GET parameter
« kdy: 16. 01. 2021, 14:49:22 »
Ahoj, viete mi niekto poradit ako na to?

Mam API vystavenu na api.example.com, s API sa komunikuje pomocou HTTP GET parametrov. Jeden s parametrov je identifikator klienta a chcem dosiahnut to, aby som vedel nejaku skupinu dotazov (klientov) presmerovat na iny backend server.
priklad:

api.example.com?id=abcd presmerovat na backend server A
api.example.com?id=vsetko_ostatne presmerovat na backend server B

idealne by bolo, keby na to existuje modul do apache, ale nic podobne/vhodne som nenasiel. Druha moznost by bolo napisat PHP script/proxy a presmerovavat to pomocou neho.

existuje nejake elegantnejsie riesenie ako spominany PHP skript? Musi to byt nieco, co bezi pod Apachom, pretoze ten obsluhuje porty 80/443 a na nich este bezia dalsie virtualne hosty s PHP aplikaciami.

P.S. "Napis si vlastny modul" je samozrejme rozumna rada, momentalne zatial neprichadza do uvahy ;)


jouda2

Re:Apache load balancing with GET parameter
« Odpověď #1 kdy: 16. 01. 2021, 15:17:19 »
existuje nejake elegantnejsie riesenie ako spominany PHP skript? Musi to byt nieco, co bezi pod Apachom, pretoze ten obsluhuje porty 80/443 a na nich este bezia dalsie virtualne hosty s PHP aplikaciami.
Opravdu je takový požadavek? Dost nervů byste si ušetřil, kdybyste "ven" vystrčil něco na tuhle práci rozumnějšího (F5, haproxy, možná i nginx) a na tenhle apache se díval prostě jako další backend.

RDa

  • *****
  • 2 675
    • Zobrazit profil
    • E-mail
Re:Apache load balancing with GET parameter
« Odpověď #2 kdy: 16. 01. 2021, 16:27:37 »
Vida, klasickym mod_rewrite - pokud dokazete udelat z parametru regex, tj. match na neco jako  [?&]param=value(([&].*)|)$ - pripadne jednodussi forma kdyz mate ukaznene klienty (vlastni)

https://httpd.apache.org/docs/2.4/rewrite/proxy.html

kvas

  • ***
  • 124
    • Zobrazit profil
    • E-mail
Re:Apache load balancing with GET parameter
« Odpověď #3 kdy: 16. 01. 2021, 16:30:31 »
Dost nervů byste si ušetřil, kdybyste "ven" vystrčil něco na tuhle práci rozumnějšího (F5, haproxy, možná i nginx) a na tenhle apache se díval prostě jako další backend.

to je samozrejme tiez riesenie. ak tomu spravne rozumiem, tak to "nieco" by obsluhovalo porty 80/443 za nim by bol "backend" apache s PHP.

to znie zaujimavo, idem googlit co je F5 (nepoznam) a pozriem aj na haproxy/nginx - len ci budu vediet rozlisovat/presmerovavat requesty na zaklade GET parametra...

RDa

  • *****
  • 2 675
    • Zobrazit profil
    • E-mail


kvas

  • ***
  • 124
    • Zobrazit profil
    • E-mail
Re:Apache load balancing with GET parameter
« Odpověď #5 kdy: 16. 01. 2021, 16:56:59 »
Mod rewrite GET only:
https://stackoverflow.com/questions/8222815/mod-rewrite-only-on-get

ten mod_rewrite bude asi najjednoduchsie riesenie. tu sa riesi nieco velmi podobne.

https://stackoverflow.com/questions/17023038/apache-rewrite-regex-specific

dik za nasmerovanie.

jouda2

Re:Apache load balancing with GET parameter
« Odpověď #6 kdy: 16. 01. 2021, 17:58:51 »
to znie zaujimavo, idem googlit co je F5 (nepoznam) a pozriem aj na haproxy/nginx - len ci budu vediet rozlisovat/presmerovavat requesty na zaklade GET parametra...
F5 jsou komerční krabice, specializovaní právě na load balancing.
Jinak ze zadání mi není jasné, čeho chcete přesně dosáhnout? Jde čistě o load balancing neboli rozhození zátěže (navíc s nějakou podporou od backendů jestli to chápu), nebo jde o high availabilitu (tu asi podle zadání jak to uvažujete ne - když má request nějaké ID a backend zdechne, tak ho tam pořád posíláte)? Co se stane, když jeden z těch backendů přestane odpovídat?

Tohle řeší "velké" load balancery docela podrobně, dá se nastavit například že máte několik různých API endpointů nebo částí stránek, pro každý se můžou dělat samostatné health checky, když jeden backend neodpoví, tak se automaticky začne používat druhý, jestli a podle čeho se má držet persistence (počínaje sourceip hash, přes existující cookinu (JSESSIONID, PHPSESSIONID....) až přes cookinu kterou si tam balancer strčí sám, když přijde nový klient, tak to umí na backendy taky rozhazovat počínaje roundrobinem (nebo váženým), přes daleko složitější metriky (počet connection do backendu, rychlost odpovědí backendu, ...), má to v sobě ASIC na rychlejší rozbalení TLS etc.
Jako nekomerční příklad je pro podobnou funkcionalitu asi haproxy ta správná volba, ale určitě ne jediná.

kvas

  • ***
  • 124
    • Zobrazit profil
    • E-mail
Re:Apache load balancing with GET parameter
« Odpověď #7 kdy: 16. 01. 2021, 18:32:14 »
Jinak ze zadání mi není jasné, čeho chcete přesně dosáhnout?...

Spominane API je napisane v PHP a v blizkej dobe sa to bude prepisovat do niecohe ineho, pravdepodobne java. No a motivacia na tento netypicky loadbalancing je nasledovna:

z vonku musi byt sluzba stale dostupna na rovnakej adrese a preto rozmyslam na tym, ze API volania niektorych "nevyznamnych" zakaznikov by som presmeroval do backendu na sluzbu prepisanu do noveho jazyka a zvysok by bol na starom serveri. Ked bude vsetko fungovat tak ako ma, presmeruju sa vsetky volania na novu sluzbu v backende. Ak by sa vyskytla nejaka chyba, jednoduchym sposobom by som tych "nevyznamnych" opat presmeroval na povodnu sluzbu a po oprave opat na novu atd...

proste minimalizacia dopadu prepisu na zakaznikov. Preto hladam nejake relativne jednoduche riesenie, bude to fungovat len docasne a teda ten mod_rewrite by mi najviac vyhovoval.

preklopit to cele z jedneho dna na druhy mi pride priliz velke riziko, ked je to mozne preklopit takymito malymi krokmi.