1 website, meerdere servers
Ik vraag me iets af. Stel ik maak een website en op die website kan ik fotoalbums plaatsen. Nu is de server waar die website op staat slechts 10 mb (dit is slechts even als voorbeeld). Nu is na een paar albums die server dus al vol.
Ik kan nu (grofweg) 2 dingen doen. Ik vergroot de capaciteit op de server naar 20 mb, maar dan heb ik over een tijdje hetzelfde probleem. Nu vraag ik me af of het mogelijk is om servers "bij te prikken". Dus stel, de eerste 10 mb zijn vol, dan hang ik er een nieuwe server bij, waardoor ik dus 20 mb heb. Maar nu komt het. Ik heb maar 1 website url, en die kan niet bij 2 servers terecht komen. De servers moeten dus met elkaar "praten". Server 1 moet dus tegen server 2 zeggen dat hij een fotoalbum nodig heeft wat op server 2 staat. Volgens mij zijn hier hardwarematige oplossingen voor, maar wat ik me vooral afvraag is of je hier in je code op de een of andere manier rekening mee moet houden. Of gaat dat allemaal hardwarematig en merk je er eigenlijk helemaal niks van dat je met 2 servers werkt?
Zijn de foto's voor iedereen vrij op te vragen?
Geen idee. Maakt dat wat uit? :)
Dit is puur een voorbeeld hè. De vraag is eigenlijk of je 1 website kunt "uitsmeren" over meerdere servers, en zo ja ... of je daar dan in de code op de een of andere manier rekening mee moet houden.
vanaf domein A: <img src="http://domein.B/whatever.jpg" />
Mijn vraag is in die zin relevant dat je misschien een soort van laag moet schrijven om de afbeeldingen te ontsluiten voor specifieke gebruikers.
Volgens mij bestaat er ook hosting waarbij diskruimte etc. automatisch bijgeschaald kan worden? Maakt Microsoft niet al tijden reclame met zo'n platform (Azure?)?
Al gezocht op media server oplossingen?
Maar dat is dus wat ik juist niet bedoel. Ik bedoel een hardware matige oplossing, die "weet" dat fotoalbum 9 op server 1 staat en fotoalbum 10 op server 2.
Ander voorbeeld dan. Stel ik maak één site, maar mijn profiel staat op server 1 en jouw profiel staat op server 2. Als ik surf naar www.eenofanderesite.nl/ozzie dan weet ie automatisch dat ie op server 1 moet kijken, en als ik surf naar www.eenofanderesite.nl/thomas, dan weet ie automatisch dat die gegevens op server 2 staan. Maar dus zonder dat ik dit in de code aangeef.
Volgens mij kan je meerdere (file)servers binnen een netwerk met elkaar koppelen zodat je /mnt/fileserver1 /mnt/fileserver2 hebt. Ik heb geen idee op welke manier dit precies gaat, hoewel een symlink mij iets te simpel lijkt.
Ander voorbeeld. Denk aan Facebook of een Instagram. Ik neem aan dat niet alle content op 1 fysieke server staat, maar dat alles is verspreid over meerdere servers. Stel nu Pietje logt in op Facebook. Hoe weet de server die de request ontvangt dan waar de server met map "pictures/pietje23532" te vinden is?
Ik zou zou haast denken dat de URL's eerst via een rewriterule via PHP gaan, waarna gekeken wordt op welke server ze staan, maar ik vraag me af of dat wel goed performance heeft.
Ik heb ooit een docu over Instagram of Facebook gezien en daar staan echt miljarden foto's op de servers. Dat gaat met een paar miljoen per uur. Dat kan nooit allemaal op 1 server, maar hoe weet men dan waar er plek vrij is? Ik hoop dat iemand dit eens kan toelichten. Lijkt me wel erg interessant.
Hoe dat ongeveer werkt kan je hier lezen: http://tweakers.net/reviews/301/loadbalancing-bij-tweakers-punt-net.html
Misschien niet de meest nieuwe tekst maar het plaatje maakt het wel duidelijk.
Waar ik wel nog steeds benieuwd naar ben, is of je er in de code rekening mee moet houden. Dus stel jouw Facebook-foto's staan ergens op een server in de wereld in een mapje bartvb345345/pictures/. Hoe weet de primaire server die de request ontvangt dan op welke server jouw foto's zijn opgeslagen? Regelt de hardware dat? Of moet je daar in je code instructies voor geven? Dit laatste lijkt me namelijk haast ondoenlijk.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// $df contains the number of bytes available on "/"
$df = disk_free_space("/");
// On Windows:
$df_c = disk_free_space("C:");
$df_d = disk_free_space("D:");
?>
// $df contains the number of bytes available on "/"
$df = disk_free_space("/");
// On Windows:
$df_c = disk_free_space("C:");
$df_d = disk_free_space("D:");
?>
Thanks Yoop, maar is dat ook noodzakelijk om in je code te regelen? Dat is eigenlijk mijn vraag. Of regelt de hardware dit automatisch? Laat ik het anders vragen: kan hardware simuleren dat er maar 1 server is, terwijl het er in werkelijkheid honderden zijn? Kan je met hardware "faken" dat die honderden afzonderlijke servers als 1 server worden behandeld? Dus stel je wilt foto's ophalen uit het mapje yoopovermaat/pictures, dat die hardware dan automatisch ziet, aha ... dat mapje staat op server 68 in het serverpark in Los Angeles.
Deze slideshare noemt de belangrijkste inclusief voor- en nadelen:
http://www.slideshare.net/nixnutz/load-balancing-for-php-and-mysql
Laat ik de vraag nog eens wat interessanter stellen. Stel je begint met een hele kleine website, en die website wordt dusdanig groot dat je met meerdere servers wilt gaan werken. Moet je dan al je PHP code gaan aanpassen?
In geval van Linux of Unix servers kan je storage op NFS protocol koppelen. Hier al eerder genoemd, mounten van de storage van server B op server A. Je moet dan wel root rechten hebben op beide servers. Heb je dat niet dan beland je in andere meer knullige oplossingen die feitelijk geen oplossing zijn. Het Network File System, of kortweg NFS, is een netwerkbestandssysteem dat oorspronkelijk werd ontworpen door Sun Microsystems in 1984 voor hun eigen Unix-werkstations. NFS maakt het mogelijk om bestanden op te vragen over het netwerk op dezelfde manier als men dit zou doen voor bestanden op de lokale schijf. NFS bestaat enkel uit een bestandssysteem en heeft niets te maken met procesbeheer of geheugenbeheer.
==>>Laat ik de vraag nog eens wat interessanter stellen. Stel je begint met een hele kleine website, en die website wordt dusdanig groot dat je met meerdere servers wilt gaan werken. Moet je dan al je PHP code gaan aanpassen?
In dit geval moet je echt gaan load balancen en met de juiste load balancing hoef je GEEN code aan te passen. Hierbij kan je denken aan een hardware loadbalancer op poort 80/433 die de load naar verschillende apache servers delegeert. De onderliggende storage kan via NFS lopen maar ook op andere redundante manieren zoals Business Continuity and Data Protection van EMC. Hetzelfde geldt grofweg voor MySQL maar komt iets meer bij kijken qua beheer.
Gewijzigd op 19/04/2015 21:35:56 door Aad B
Ozzie PHP op 19/04/2015 15:29:11:
Thanks Yoop, maar is dat ook noodzakelijk om in je code te regelen? Dat is eigenlijk mijn vraag. Of regelt de hardware dit automatisch? Laat ik het anders vragen: kan hardware simuleren dat er maar 1 server is, terwijl het er in werkelijkheid honderden zijn? Kan je met hardware "faken" dat die honderden afzonderlijke servers als 1 server worden behandeld? Dus stel je wilt foto's ophalen uit het mapje yoopovermaat/pictures, dat die hardware dan automatisch ziet, aha ... dat mapje staat op server 68 in het serverpark in Los Angeles.
Jup dat zul je in je code moeten regelen maar zo heel erg veel werk is het niet. Je hebt allereerst een toegangspunt nodig. Main entrance waar je je afbeelding upload.
Vanaf hier krijg je te maken met het df -h verhaal.
-> verbinding databases
-> query (welke server = het minst bezet qua schijfruimte) schrijf hem daar weg
-> wegschrijven van het plaatje in een directory
-> Adres van het plaatje wegschrijven in een database id, naam, serveradres
-> Opvragen van het plaatje via een link in html -> link -> php-> query....
@Yoop: Op een x moment is server A bezet qua schijfruimte en blijf je dan voor elke foto dan nog deze procedure uitvoeren of verander je dan je code weer omdat server A volledig bezet qua schijfruimte??
Aad, beschrijf ik het bovenstaande zo goed? Klopt het wat ik zeg? Ik heb er zelf geen kaas van gegeten, maar het is fijn om te weten dat als ik ooit een site hebt die uit de klauwen groeit, ik niet alle code hoef aan te passen. Waarschijnlijk moet ik dan wel een expert inhuren om zo'n load balancer in te stellen :)
In jouw eerdere voorbeeld/vraag (server A server B) is het zinvol om een storage koppeling met een NFS mount te realiseren.
Gewijzigd op 20/04/2015 09:40:40 door John D
20MB, wat je als voorbeeld aanhaalt, is namelijk niet zo heel erg veel.
Had je het over 1TB wat niet voldoende is, is het wat anders. Want een server met maar 20MB aan boord: dat was iets uit de jaren 90.
En als je 20MB vol is, is het gewoon tijd voor een wat groter hostingpakket. Of gaat het erom dat de hosting voor 20MB gratis/1euro is?