Hosta en WordPress installation på flera servrar, hur göra med cachingen?

Permalänk
Medlem

Hosta en WordPress installation på flera servrar, hur göra med cachingen?

Tjenare!

Jag har ett litet problem här, eller well det är egentligen inget problem eftersom ingen av mina WP installationer egentligen behöver skalas men tänkt ändå testa det nu så jag har koll på det den dagen det är dags.

Har läst flera sidor, tex dessa:
http://codex.wordpress.org/WordPress_Optimization/WordPress_P...
http://codex.wordpress.org/High_Traffic_Tips_For_WordPress

Och massa andra tips om hur man delar upp sin hemsida till fler subdomäner osv osv, men det är INTE det jag är ute efter, frågan gäller bara för den situationen där WP behöver lastbalanserar på flera servrar, MySQL körs redan på 2 servrar så inga konstigheter där.

Men iaf:
Det största problemet är cachingen, kör Hyper Cache och DB Cache Reloaded, detta fungerar sinnessjukt bra, sidorna blir sjukt snabba men problemet är detta:

Om jag installerar WordPress på flera olika servrar som ansluter till samma databas, har samma WP version, identisk tema osv så kommer jag till problemet med cachingen, cachar jag WP på min server nu så blir den minst 4-6ggr snabbare än utan caching, det är markant mycket snabbare, kör jag WP utan caching så vore lastbalanseringen mycket enklare men känns verkligen ovettigt att köpa in 4-6ggr fler servrar för att komma upp i samma hastighet som en cachad WP installation.

1) Så problemet blir då man sätter igång caching på servrarna, WP kan uppdatera cachen om någon ändring har skett, tex en kommentar, MEN dessa filer (tex om den cachar till HTML filer) kommer ju bara ligga lokalt på den servern, om användaren sen går tillbaka till sidan han kommenterade men råkade lastbalanseras till den andra servern så kommer inte dennes kommentar synas, bara om han kommer till samma server som han skrev kommentaren till, först när WP forcar en uppdatering av cachen kommer kommentaren synas på alla servrar.

Hur löser jag detta?

2) En annan grej är att om man installerar WP på ett domännamn (vilket man typ alltid gör) så även om man ansluter till servern via ett lokalt IP så sker följande scenarios: antingen kommer man inte åt hemsidan eller så redirectas man till domännamnet, detta för att WP sparar domännamnet och kör sig själv baserat på domännamnet, detta skapar ett ganska irriterande problem:

Tex om jag vill installera ett plugin så kan jag inte komma åt varje enskild server utan måste gå via domännamnet och installera, detta gör att går jag in i www.minsida.com/wp-admin/ så har jag ingen kontroll på vilken av servrarna jag har lastbalanserats till, så om jag installerat ett plugin på en server kanske det tar ett bra antal pagerefresher innan jag kommer till den andra servern så jag kan installera mitt plugin där också.

Detta kan ju lösas genom att ta bort 1 server i taget från lastbalanseraren så jag bara har 1 i taget, MEN detta är ju ingen hållbar lösning om jag i framtiden behöver 10servrar (det kommer aldrig ske men tar det bara som ett exempel) och jag offlinar 9 servrar när trafiken behöver minst 8, blir ju inte så bra.

Hur löser jag detta?

Tacksam för svar!

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem

Nu kan jag inget om WP men kan väll berätta hur vi gör när vi bygger sidor som lastbalanseras.
Om vi antar att vi har sidan www.minstorasida.se som ligger på 3 servrar, om vi börjar med det andra problemet så löses det enklast genom att du pekar www.minstorasida.se till det IP som din lastbalanserare har, sedan lägger du till så att varje server också kan nås på ett annat IP så att du kan gå runt lastbalanseraren och kan då ansluta direkt till den server som du är intresserad av, sedan kan man för enkelhetens skull lägga till host headers för www1, www2 och ww3 för att enkelt komma ihåg adressen. Sedan får du tänka på säkerheten och externt ska man självklart inte kunna gå direkt till en server utan det ska man bara kunna göra internt eller möjligtvis vissa utvalda ip'n.

Problem 1 är lite svårare, den produkt som jag jobbar med dagligen, EPiServer CMS, har en inbyggd cache notifiering där man helt enkelt säger till vilka servrar som är i ett kluster och när den sedan tar bort något från cachen på en av dessa servrar så meddelar den alla andra om att de ska uppdatera sin cache, det är något liknande som behövs här och jag är ganska säker på att det finns färdiga lösningar för det där ute.

/Viktor

Permalänk
Medlem

Mina tips på lastdelare är nginx eller haproxy

Kan skriva mer imorn när jag inte sitter på ipaden

Permalänk
Medlem

Du säger att "MySQL körs redan på 2 servrar", innebär det två databaser som är uppsatta med replikering eller att databasen är partitionerad över två servrars hårddiskar eller något annat? Det enda de olika Apache-instanserna gör är att leverera statiska filer, utifrån vilken cache som är skapad med databasens innehåll. Så naturligtvis måste cache för den aktuella sidans cache regenereras när en kommentar läggs till. Nu vet jag inte om Hyper Cache och/eller DB Cache Reloaded har API:er som du kan använda men det går naturligtvis på något sätt.

Det som kan vara lurigt här är att du även måste berätta för alla andra servrar att de också måste cacha om den här sidan som kommentaren lades till på. Du får skapa en PHP-sida som kan ta emot ett CURL-anrop som berättar att och vilken sida som cache skall regenereras för. Viktigt här är att använda någon form av autentisering, annars kan ju vilken klipsk jäkel som helst sänka prestandan. Kodsnutten för att utföra dessa anrop får du alltså skriva i Wordpress källkod där nya kommentarer läggs till. Samt på andra ev. ställen där en användares aktivitet skall synas i cacheresultatet omedelbart.

Ett cron-jobb kommer väl köras för att uppdatera all utdaterad cache med jämna mellanrum, antar jag, vilket tar hand om resterande uppdateringar såsom blogginlägg och antalet "gilla"-markeringar.

Permalänk
Medlem

Ett filsystem som är "clustrat" torde lösa problemet. Eller om man är lat så sätter man cachemappen i NFS.

Permalänk

Ang. punkt 1: Lastbalanseraren du använder borde väl ha någon slags persistence på connections? Den som vi jobbar med här på jobbet (BigIP) har massa val på olika persistence, antingen på source ip, c-nät, cookie m.m. Det gör att den ser till att samma connection hamnar på samma server.

Visa signatur

/Mvh Stefan

Permalänk
Medlem

Lastbalanserare har en teknik som brukar kallas för "sticky sessions" eller något annat ord med sticky. Det innebär att den server som först fick ta hand om användaren också fortsättningsvis får ta hand om samma användare. Byggs data upp på datorn som år specifik för användaren så löses det med att användaren låses till samma server av lastbalanseraren.

Permalänk
Medlem

Jao, avancerade sånna kan även använda cookies eller liknande för att verkligen vara sticky

Permalänk
Medlem

Oj, glömt att svara i denna tråden men tack för alla svar.

Angående fråga 1 så är det nu solklart hur det går till, men problemet med fråga 2 kvarstår.

Båda servrarna kommer köra Ubuntu och vill göra det så lätt för mig som möjligt, tänkte om det fanns ett program som håller koll på den utvalda mappen cachefilerna ligger i på respektive server, om någon fil ändras på någon server så skickar den filen till den/dom andra servrarna, om det nu finns ett program som klarar att upptäcka detta på några ms och sen påbörja överflyttningen, replikeringen borde gå ganska snabbt då det bara handlar om filer på bara några kb.

Dock är ju problemet om 2 eller flera användare är inne på exakt samma sida och kommenterar exakt samtidigt, eller? Finns det något sådant program?

Edit: Hmm om man skaffar ytterligare en server, med snabbt disksystem med hög IO och snabbt ethernet så kan webbservrarna symlinka sina cachemappar till den servern, så alla cach filer ligger på den snabba servern, borde ju fungera en stund iaf, är ju ändå webbservrarna som bör dra det stora lasset?

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?